如何从Zend Navigation XML </li>向<li>添加类名

时间:2011-03-07 13:27:48

标签: zend-framework zend-navigation

有人可以帮帮我,我完全陷入困境!我不知道如何在Zend navigation XML

中向<li>标签添加类名

这是我的XML

<configdata>
    <nav>
        <home>
            <label>Home </label>
            <uri>/</uri> 
        </home>

        <request>
            <label>Quotes </label>
            <uri>/quote</uri>
        </request>

        <work>
            <label>How It Works</label>
            <uri>/how-it-works</uri>
        </work>

        <information>
            <label>Informations </label>
            <uri>/informations</uri>
        </information>

        <directory>
            <class> last </class>
            <label>Directory </label>
            <uri>/directory</uri>  
        </directory>
    </nav>
</configdata>

当我添加<class>last</class>时,这就是我得到的:

<li>
    <a class="last" href="/directory">Directory </a>
</li>

目前我收到了<a class="last">,但我需要<li class="last">

非常感谢! 干杯

1 个答案:

答案 0 :(得分:6)

我认为将css类放入li元素的最佳方法是编写自己的导航菜单助手,例如My_View_Helper_NavigationMenu,它扩展了原始的Zend_View_Helper_Navigation_Menu类。出于这个原因,我准备了一个重载_renderMenu()方法的帮助器的例子。该方法的代码似乎很长,但这是因为原始代码很长。重载_renderMenu()

中只有少数新的/修改过的行

文件:APPLICATION_PATH / views / helpers / NavigationMenu.php

class My_View_Helper_NavigationMenu extends Zend_View_Helper_Navigation_Menu { 

     /**
     * Renders a normal menu (called from {@link renderMenu()})
     *
     * @param  Zend_Navigation_Container $container   container to render
     * @param  string                    $ulClass     CSS class for first UL
     * @param  string                    $indent      initial indentation
     * @param  int|null                  $minDepth    minimum depth
     * @param  int|null                  $maxDepth    maximum depth
     * @param  bool                      $onlyActive  render only active branch?
     * @return string
     */
    protected function _renderMenu(Zend_Navigation_Container $container,
                                   $ulClass,
                                   $indent,
                                   $minDepth,
                                   $maxDepth,
                                   $onlyActive)
    {
        $html = '';

        // find deepest active
        if ($found = $this->findActive($container, $minDepth, $maxDepth)) {
            $foundPage = $found['page'];
            $foundDepth = $found['depth'];
        } else {
            $foundPage = null;
        }

        // create iterator
        $iterator = new RecursiveIteratorIterator($container,
                            RecursiveIteratorIterator::SELF_FIRST);
        if (is_int($maxDepth)) {
            $iterator->setMaxDepth($maxDepth);
        }

        // iterate container
        $prevDepth = -1;
        foreach ($iterator as $page) {
            $depth = $iterator->getDepth();
            $isActive = $page->isActive(true);
            if ($depth < $minDepth || !$this->accept($page)) {
                // page is below minDepth or not accepted by acl/visibilty
                continue;
            } else if ($onlyActive && !$isActive) {
                // page is not active itself, but might be in the active branch
                $accept = false;
                if ($foundPage) {
                    if ($foundPage->hasPage($page)) {
                        // accept if page is a direct child of the active page
                        $accept = true;
                    } else if ($foundPage->getParent()->hasPage($page)) {
                        // page is a sibling of the active page...
                        if (!$foundPage->hasPages() ||
                            is_int($maxDepth) && $foundDepth + 1 > $maxDepth) {
                            // accept if active page has no children, or the
                            // children are too deep to be rendered
                            $accept = true;
                        }
                    }
                }

                if (!$accept) {
                    continue;
                }
            }

            // make sure indentation is correct
            $depth -= $minDepth;
            $myIndent = $indent . str_repeat('        ', $depth);

            if ($depth > $prevDepth) {
                // start new ul tag
                if ($ulClass && $depth ==  0) {
                    $ulClass = ' class="' . $ulClass . '"';
                } else {
                    $ulClass = '';
                }
                $html .= $myIndent . '<ul' . $ulClass . '>' . self::EOL;
            } else if ($prevDepth > $depth) {
                // close li/ul tags until we're at current depth
                for ($i = $prevDepth; $i > $depth; $i--) {
                    $ind = $indent . str_repeat('        ', $i);
                    $html .= $ind . '    </li>' . self::EOL;
                    $html .= $ind . '</ul>' . self::EOL;
                }
                // close previous li tag
                $html .= $myIndent . '    </li>' . self::EOL;
            } else {
                // close previous li tag
                $html .= $myIndent . '    </li>' . self::EOL;
            }








            // ***************** THESE ARE NEW LINES *************** //
            $liMyClass = $page->get('liclass') ? $page->liclass : '' ;

            if ($isActive) {
                $liClass = " class=\"active $liMyClass\" ";
            } else {
                $liClass = $liMyClass ? " class=\"$liMyClass\" ":'';
            }

            // ***************** END OF NEW STUFF *************** //

            // render li tag and page (ORGINAL LINE REMOVED)
            //$liClass = $isActive ? ' class="active "' : '';      









            $html .= $myIndent . '    <li' . $liClass . '>' . self::EOL
                   . $myIndent . '        ' . $this->htmlify($page) . self::EOL;

            // store as previous depth for next iteration
            $prevDepth = $depth;
        }

        if ($html) {
            // done iterating container; close open ul/li tags
            for ($i = $prevDepth+1; $i > 0; $i--) {
                $myIndent = $indent . str_repeat('        ', $i-1);
                $html .= $myIndent . '    </li>' . self::EOL
                       . $myIndent . '</ul>' . self::EOL;
            }
            $html = rtrim($html, self::EOL);
        }

        return $html;
    }
}

layout.phtml 中,您需要指示导航视图助手才能使用此新类。您可以按如下方式执行此操作:

<?php  $this->navigation()->setDefaultProxy('navigationMenu'); ?>;

最后在您的 navigation.xml 中,您可以使用 liclass 标记为li元素定义一个类(您可以使用此标记所需的任何名称):

<directory>
    <class> last </class>
    <label>Directory </label>
    <uri>/directory</uri>
    <liclass>someclass</liclass>
</directory>

希望这对您有所帮助。理想情况下,我应该将新类命名为My_View_Helper_Navigation_Menu(位于APPLICATION_PATH / views / helpers / Navigation / Menu.php中)。但是,我无法让Zend插件加载器加载它,我选择了My_View_Helper_NavigationMenu