/** * The page will be invisible if it has no resource and no visible children * This method is used to hide empty parent items in backend navigation * * @param Zend_Navigation_Page $page page to check * @return bool */ public function isVisibleAtBackend(Zend_Navigation_Page $page) { if ($page->getResource()) { return true; } $visible = true; $iterator = new RecursiveIteratorIterator($page, RecursiveIteratorIterator::SELF_FIRST); foreach ($iterator as $child) { if (!$child->getResource()) { continue; // anchor page } $visible = $this->accept($child, false); if ($visible) { break; } } return $visible; }
/** * Determines whether a page should be accepted by ACL when iterating * * Rules: * - If helper has no ACL, page is accepted * - If page has a resource or privilege defined, page is accepted * if the ACL allows access to it using the helper's role * - If page has no resource or privilege, page is accepted * * @param Zend_Navigation_Page $page page to check * @return bool whether page is accepted by ACL */ protected function _acceptAcl(Zend_Navigation_Page $page) { if (!($acl = $this->getAcl())) { // no acl registered means don't use acl return true; } $role = $this->getRole(); $resource = $page->getResource(); $privilege = $page->getPrivilege(); if ($resource || $privilege) { // determine using helper role and page resource/privilege return $acl->isAllowed($role, $resource, $privilege); } return true; }
/** * 根据Zend_Navigation_Page对象生成资源字符串 * * @static * @param Zend_Navigation_Page $page * @return string */ public static function parseNavigationPage(Zend_Navigation_Page $page) { if ($page instanceof Zend_Navigation_Page_Mvc) { $mvc = array($page->getModule(), $page->getController(), $page->getAction()); return implode(self::SEPARATOR, array_filter($mvc)); } else { if ($page instanceof Zend_Navigation_Page_Uri) { return self::parseUri($page->getUri()); } } return $page->getResource(); }