Zend Navigation(容器) - removePage()不是递归的

时间:2011-05-24 14:44:01

标签: php zend-framework recursion zend-navigation

Zend_Navigation延伸Zend_Navigation_ContainerfindOneBy()findAllBy()findBy()函数都以递归方式搜索页面,但removePage()没有。这意味着$navigation->removePage($navigation->findOneBy('id', 'page_10'));仅在page_10是根级导航节点时才会起作用。有没有其他人遇到这个并找到了解决办法?


我找到了自己的解决方案并接受其中一个解决方案,因为我已经实现了它。如果它比我好,我会从别人那里选择一个解决方案。

2 个答案:

答案 0 :(得分:2)

扩展Zend_NavigationZend_Navigation_Container以递归方式删除网页。

创建扩展My_Navigation_Container的<{1}}:

Zend_Navigation_Container

制作abstract class My_Navigation_Container extends Zend_Navigation_Container { /** * Remove page(s) matching $property == $value * * @param string $property * @param mixed $value * @param bool $all * @return My_Navigation_Container */ public function removeBy($property, $value, $all = false) { $pages = array(); if ($all) { $pages = $this->findAllBy($property, $value); } else { if ($page = $this->findOneBy($property, $value)) { $pages[] = $page; } } foreach ($pages as $page) { $this->removePageRecursive($page); } return $this; } /** * Recursively removes the given page from the container * * @param Zend_Navigation_Page $page * @return boolean */ public function removePageRecursive(Zend_Navigation_Page $page) { if ($this->removePage($page)) { return true; } $iterator = new RecursiveIteratorIterator($this, RecursiveIteratorIterator::SELF_FIRST); foreach ($iterator as $pageContainer) { if ($pageContainer->removePage($page)) { return true; } } return false; } } Zend_Navigation My_Navigation_Container的副本:

class My_Navigation extends My_Navigation_Container
{
    /**
     * Creates a new navigation container
     *
     * @param array|Zend_Config $pages    [optional] pages to add
     * @throws Zend_Navigation_Exception  if $pages is invalid
     */
    public function __construct($pages = null)
    {
        if (is_array($pages) || $pages instanceof Zend_Config) {
            $this->addPages($pages);
        } elseif (null !== $pages) {
            throw new Zend_Navigation_Exception('Invalid argument: $pages must be an array, an instance of Zend_Config, or null');
        }
    }
}

答案 1 :(得分:0)

找到父级,然后删除该子级。这需要了解父母的属性:

$navigation->findOneBy('id', 'parent_id')
        ->removePage($navigation->findOneBy('id', 'child_id'));