/** * Unshare the given navigation item * * @param string $name * @param string $parent * * @return Config The new config of the given navigation item * * @throws NotFoundError In case no navigation item with the given name is found * @throws IcingaException In case the navigation item has a parent assigned to it */ public function unshare($name, $parent = null) { $config = $this->getShareConfig(); if (!$config->hasSection($name)) { throw new NotFoundError('No navigation item called "%s" found', $name); } $itemConfig = $config->getSection($name); if ($parent === null) { $parent = $itemConfig->parent; } if ($parent && $this->hasBeenShared($parent)) { throw new IcingaException($this->translate('Unable to unshare navigation item "%s". It is dependent from item "%s".' . ' Dependent items can only be unshared by unsharing their parent'), $name, $parent); } $children = $this->getFlattenedChildren($name); $config->removeSection($name); $this->secondaryConfig = $config; if (!$itemConfig->owner || $itemConfig->owner === $this->getUser()->getUsername()) { $config = $this->getUserConfig(); } else { $config = Config::navigation($itemConfig->type, $itemConfig->owner); } foreach ($children as $child) { $childConfig = $this->secondaryConfig->getSection($child); unset($childConfig->owner); $this->secondaryConfig->removeSection($child); $config->setSection($child, $childConfig); } unset($itemConfig->owner); unset($itemConfig->users); unset($itemConfig->groups); $config->setSection($name, $itemConfig); $this->setIniConfig($config); return $config; }
/** * Load and return the shared navigation of the given type * * @param string $type * * @return Navigation */ public function getSharedNavigation($type) { $config = Config::navigation($type === 'dashboard-pane' ? 'dashlet' : $type); if ($type === 'dashboard-pane') { $panes = array(); foreach ($config as $dashletName => $dashletConfig) { if ($this->hasAccessToSharedNavigationItem($dashletConfig)) { // TODO: Throw ConfigurationError if pane or url is missing $panes[$dashletConfig->pane][$dashletName] = $dashletConfig->url; } } $navigation = new Navigation(); foreach ($panes as $paneName => $dashlets) { $navigation->addItem($paneName, array('type' => 'dashboard-pane', 'dashlets' => $dashlets)); } } else { $items = array(); foreach ($config as $name => $typeConfig) { if ($this->hasAccessToSharedNavigationItem($typeConfig)) { $items[$name] = $typeConfig; } } $navigation = Navigation::fromConfig($items); } return $navigation; }
/** * Unshare a navigation item */ public function unshareAction() { $this->assertPermission('config/application/navigation'); $this->assertHttpMethod('POST'); // TODO: I'd like these being form fields $itemType = $this->params->getRequired('type'); $itemOwner = $this->params->getRequired('owner'); $navigationConfigForm = new NavigationConfigForm(); $navigationConfigForm->setUser($this->Auth()->getUser()); $navigationConfigForm->setShareConfig(Config::navigation($itemType)); $navigationConfigForm->setUserConfig(Config::navigation($itemType, $itemOwner)); $form = new Form(array('onSuccess' => function ($form) use($navigationConfigForm) { $itemName = $form->getValue('name'); try { $newConfig = $navigationConfigForm->unshare($itemName); if ($navigationConfigForm->save()) { if ($newConfig->getSection($itemName)->type === 'menu-item') { $form->getResponse()->setRerenderLayout(); } Notification::success(sprintf(t('Navigation item "%s" has been unshared'), $form->getValue('name'))); } else { // TODO: It failed obviously to write one of the configs, so we're leaving the user in // a inconsistent state. Luckily, it's nothing lost but possibly duplicated... Notification::error(sprintf(t('Failed to unshare navigation item "%s"'), $form->getValue('name'))); } } catch (NotFoundError $e) { throw $e; } catch (Exception $e) { Notification::error($e->getMessage()); } $redirect = $form->getValue('redirect'); if (!empty($redirect)) { $form->setRedirectUrl(htmlspecialchars_decode($redirect)); } return true; })); $form->setUidDisabled(); $form->setSubmitLabel('btn_submit'); // Required to ensure that isSubmitted() is called $form->addElement('hidden', 'name', array('required' => true)); $form->addElement('hidden', 'redirect'); try { $form->handleRequest(); } catch (NotFoundError $_) { $this->httpNotFound(sprintf($this->translate('Navigation item "%s" not found'), $form->getValue('name'))); } }