/** * Determines whether a page should be accepted when iterating * * Default listener may be 'overridden' by attaching listener to 'isAllowed' * method. Listener must be 'short circuited' if overriding default ACL * listener. * * Rules: * - If a page is not visible it is not accepted, unless RenderInvisible has * been set to true * - If $useAcl is true (default is true): * - Page is accepted if listener returns true, otherwise false * - If page is accepted and $recursive is true, the page * will not be accepted if it is the descendant of a non-accepted page * * @param AbstractPage $page page to check * @param bool $recursive [optional] if true, page will not be * accepted if it is the descendant of * a page that is not accepted. Default * is true * * @return bool Whether page should be accepted */ public function accept(AbstractPage $page, $recursive = true) { $accept = true; if (!$page->isVisible(false) && !$this->getRenderInvisible()) { $accept = false; } elseif ($this->getUseAcl()) { $acl = $this->getAcl(); $role = $this->getRole(); $params = ['acl' => $acl, 'page' => $page, 'role' => $role]; $accept = $this->isAllowed($params); } if ($accept && $recursive) { $parent = $page->getParent(); if ($parent instanceof AbstractPage) { $accept = $this->accept($parent, true); } } return $accept; }
/** * Returns the root container of the given page * * When rendering a container, the render method still store the given * container as the root container, and unset it when done rendering. This * makes sure finder methods will not traverse above the container given * to the render method. * * @param AbstractPage $page * @return AbstractContainer */ protected function findRoot(AbstractPage $page) { if ($this->root) { return $this->root; } $root = $page; while ($parent = $page->getParent()) { $root = $parent; if ($parent instanceof AbstractPage) { $page = $parent; } else { break; } } return $root; }