/**
  * @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));
 }