/** * @param Menu $menu * @return Menu */ public function saveMenu(Menu $menu) { $id = $menu->getMenuId(); $data = $menu->getArrayCopy(); if ($id > 0) { $this->update($data, array('menuId' => $id)); } else { unset($data['menuId']); $this->insert($data); } if (!$menu->getMenuId()) { $menu->setMenuId($this->getLastInsertValue()); } return $menu; }
/** * @return \Zend\Http\Response|ViewModel * @throws \Exception */ public function indexAction() { $id = (int) $this->params()->fromRoute('id', 0); $action = $this->params()->fromQuery('action', ''); if ($action == 'delete' && $id > 0) { return $this->deleteMenu($id); } $parentMenu = new Menu(); $edit = false; if ($id > 0) { $menu = $this->menuTable()->getMenu($id); if ($menu->getParentId()) { $parentMenu = $this->menuTable()->getMenu($menu->getParentId()); } $edit = true; } else { $menu = new Menu(); } $permissions = $this->menuPermissionTable()->grantRoles($id); $menus = $this->menuTable()->getChildren(); $helper = new MenuHelper(); $form = $helper->getForm($this->urlTypeCombo()); if ($action == 'clone') { $edit = false; $id = 0; $menu->setMenuId(0); } $form->bind($menu); $request = $this->getRequest(); if ($request->isPost()) { $post_data = $request->getPost(); $form->setData($post_data); if ($form->isValid()) { $db = $this->menuTable()->getAdapter(); $conn = $db->getDriver()->getConnection(); try { $conn->beginTransaction(); $menuId = $this->menuTable()->saveMenu($menu)->getMenuId(); $grant_roles = isset($post_data['grant_roles']) ? $post_data['grant_roles'] : array(); $this->menuPermissionTable()->saveMenuPermission($menuId, $grant_roles); $conn->commit(); $this->flashMessenger()->addSuccessMessage('Save successful!'); } catch (\Exception $ex) { $conn->rollback(); $this->flashMessenger()->addErrorMessage($ex->getMessage()); } return $this->redirect()->toRoute("menu"); } } return new ViewModel(array('id' => $id, 'menu' => $menu, 'menus' => $menus, 'form' => $form, 'isEdit' => $edit, 'parent' => $parentMenu, 'roles' => $this->roleTreeData(), 'permissions' => $permissions)); }