gpt4 book ai didi

zend-framework - 如何从 Zend Navigation XML 向
  • 添加类名
  • 转载 作者:行者123 更新时间:2023-12-04 06:39:18 27 4
    gpt4 key购买 nike

    谁能帮帮我,我完全被困住了!我不知道如何将类名添加到 <li> Zend 导航 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> 时这是我得到的:

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

    目前我得到 <a class="last">但我需要<li class="last">

    提前致谢!干杯

    最佳答案

    我认为将 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 中,您需要指示导航 View 助手使用这个新类。您可以按如下方式执行此操作:

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

    关于zend-framework - 如何从 Zend Navigation XML 向 <li> 添加类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5220274/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com