/**
  * 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;
 }
Example #2
0
 /**
  * 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')));
     }
 }