/**
  * update category
  */
 public function editAction()
 {
     $this->checkCsrfToken();
     if (!SecurityUtil::checkPermission('Categories::', '::', ACCESS_EDIT)) {
         throw new \Zikula\Framework\Exception\ForbiddenException();
     }
     $dr = (int) $this->request->request->get('dr', 0);
     $ref = System::serverGetVar('HTTP_REFERER');
     $returnfunc = strpos($ref, "useredit") !== false ? 'useredit' : 'edit';
     $url = ModUtil::url('Categories', 'user', $returnfunc, array('dr' => $dr));
     if (!$dr) {
         return LogUtil::registerError($this->__('Error! The document root is invalid.'), null, $url);
     }
     $obj = new Category();
     $data = $obj->getDataFromInput();
     $oldData = $obj->get($data['id']);
     $obj->setData($data);
     if (!$oldData) {
         $msg = $this->__f('Error! Cannot retrieve category with ID %s.', $data['id']);
         return LogUtil::registerError($msg, null, $url);
     }
     if ($oldData['is_locked']) {
         //! %1$s is the id, %2$s is the name
         return LogUtil::registerError($this->__f('Notice: The administrator has locked the category \'%2$s\' (ID \'%$1s\'). You cannot edit or delete it.', array($data['id'], $oldData['name'])), null, $url);
     }
     if (!$obj->validate()) {
         $_POST['cid'] = (int) $_POST['category']['id'];
         return $this->redirect(ModUtil::url('Categories', 'user', 'edit', $_POST) . '#top');
     }
     $attributes = array();
     $values = $this->request->request->get('attribute_value');
     foreach ($this->request->request->get('attribute_name') as $index => $name) {
         if (!empty($name)) {
             $attributes[$name] = $values[$index];
         }
     }
     $obj->setDataField('__ATTRIBUTES__', $attributes);
     // update new category data
     $obj->update();
     // since a name change will change the object path, we must rebuild it here
     if ($oldData['name'] != $data['name']) {
         CategoryUtil::rebuildPaths('path', 'name', $data['id']);
     }
     $msg = $this->__f('Done! Saved the %s category.', $oldData['name']);
     LogUtil::registerStatus($msg);
     return $this->redirect($url);
 }
 /**
  * edit category
  */
 public function editAction()
 {
     $cid = $this->request->get('cid', 0);
     $root_id = $this->request->get('dr', 1);
     $mode = $this->request->get('mode', 'new');
     $allCats = '';
     $editCat = '';
     $languages = ZLanguage::getInstalledLanguages();
     // indicates that we're editing
     if ($mode == 'edit') {
         if (!SecurityUtil::checkPermission('Categories::category', "::", ACCESS_ADMIN)) {
             throw new \Zikula\Framework\Exception\ForbiddenException();
         }
         if (!$cid) {
             return LogUtil::registerError($this->__('Error! Cannot determine valid \'cid\' for edit mode in \'Categories_admin_edit\'.'));
         }
         $category = new Category();
         $editCat = $category->select($cid);
         if ($editCat == false) {
             return LogUtil::registerError($this->__('Sorry! No such item found.'), 404);
         }
     } else {
         // new category creation
         if (!SecurityUtil::checkPermission('Categories::category', '::', ACCESS_ADD)) {
             throw new \Zikula\Framework\Exception\ForbiddenException();
         }
         // since we inherit the domain settings from the parent, we get
         // the inherited (and merged) object from session
         if (isset($_SESSION['newCategory']) && $_SESSION['newCategory']) {
             $editCat = $_SESSION['newCategory'];
             unset($_SESSION['newCategory']);
             $category = new Category();
             // need this for validation info
         } elseif (FormUtil::getValidationErrors()) {
             $category = new Category(DBObject::GET_FROM_VALIDATION_FAILED);
             // need this for validation info
             $editCat = $category->get();
         } else {
             $category = new Category();
             // need this for validation info
             $editCat['sort_value'] = '0';
         }
     }
     $reloadOnCatChange = $mode != 'edit';
     $allCats = CategoryUtil::getSubCategories($root_id, true, true, true, false, true);
     // now remove the categories which are below $editCat ...
     // you should not be able to set these as a parent category as it creates a circular hierarchy (see bug #4992)
     if (isset($editCat['ipath'])) {
         $cSlashEdit = StringUtil::countInstances($editCat['ipath'], '/');
         foreach ($allCats as $k => $v) {
             $cSlashCat = StringUtil::countInstances($v['ipath'], '/');
             if ($cSlashCat >= $cSlashEdit && strpos($v['ipath'], $editCat['ipath']) !== false) {
                 unset($allCats[$k]);
             }
         }
     }
     $selector = CategoryUtil::getSelector_Categories($allCats, 'id', isset($editCat['parent_id']) ? $editCat['parent_id'] : 0, 'category[parent_id]', isset($defaultValue) ? $defaultValue : null, null, $reloadOnCatChange);
     $attributes = isset($editCat['__ATTRIBUTES__']) ? $editCat['__ATTRIBUTES__'] : array();
     $this->view->assign('mode', $mode)->assign('category', $editCat)->assign('attributes', $attributes)->assign('languages', $languages)->assign('categorySelector', $selector)->assign('validation', $category->_objValidation);
     if ($mode == 'edit') {
         $this->view->assign('haveSubcategories', CategoryUtil::haveDirectSubcategories($cid))->assign('haveLeafSubcategories', CategoryUtil::haveDirectSubcategories($cid, false, true));
     }
     return $this->response($this->view->fetch('categories_admin_edit.tpl'));
 }
 /**
  * move category
  */
 public function moveAction()
 {
     $this->checkCsrfToken();
     if (!SecurityUtil::checkPermission('Categories::', '::', ACCESS_EDIT)) {
         throw new \Zikula\Framework\Exception\ForbiddenException();
     }
     if ($this->request->request->get('category_cancel', null)) {
         return $this->redirect(ModUtil::url('Categories', 'admin', 'view'));
     }
     $cid = $this->request->request->get('cid', null);
     $cat = new Category();
     $cat->get($cid);
     $cat->move($_POST['category']['parent_id']);
     $msg = __f('Done! Moved the %s category.', $cat->_objData['name']);
     LogUtil::registerStatus($msg);
     return $this->redirect(ModUtil::url('Categories', 'admin', 'view'));
 }