如何将类名称添加到< li>从Zend Navigation XML [英] How do I add a class name to <li> from Zend Navigation XML

查看:83
本文介绍了如何将类名称添加到< li>从Zend Navigation XML的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有人可以帮我吗,我完全被困住了!我不知道如何在Zend导航XML中的<li>标记中添加类名

Can someone please help me out, I'm totally stuck! I don't know how to add a class name to <li> tag in Zend navigation XML

这是我的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>时,这就是我得到的:

When I add <class>last</class> this is what i get:

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

当前我正在获取<a class="last">,但我需要<li class="last">

Currently I'm getting <a class="last"> but I need <li class="last">

非常感谢! 干杯

推荐答案

我认为将css类放入li元素的最佳方法是编写自己的导航菜单帮助程序,例如扩展原始Zend_View_Helper_Navigation_Menu类.因此,我准备了一个使_renderMenu()方法重载的助手的示例.该方法的代码似乎很长,但这是因为原始代码很长. _renderMenu()重载中仅有几行新的/修改过的行:

I think that the best way to put css classes into li elements would be to write your own navigation menu helper, called for example My_View_Helper_NavigationMenu that extends original Zend_View_Helper_Navigation_Menu class. For this reason I prepared an example of such a helper that overloads _renderMenu() method. The code of the method seems long, but this is because original code is long. There are only few new/modified lines in overloaded _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 中,您需要指示导航视图助手以使用此新类.您可以按照以下步骤进行操作:

In your layout.phtml you need to indicate to the navigation view helper to use this new class. You can do this as follows:

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

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

Finally in your navigation.xml you could define a class for a li element using liclass tag (you can use whatever name you want for this tag):

<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.

Hopefully this will be helpful to you. Ideally, I should have named the new class My_View_Helper_Navigation_Menu (located in APPLICATION_PATH/views/helpers/Navigation/Menu.php). However, I could not make Zend plugin loaders to load it and I went with My_View_Helper_NavigationMenu.

这篇关于如何将类名称添加到&lt; li&gt;从Zend Navigation XML的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆