8

我正在使用 Zend_Navigation(对框架的甜蜜补充,顺便说一句)来构建我的菜单,之后它应该在页面中呈现(不言而喻)。我首先将容器设置在控制器中的某处:

// $pages is the array containing all page information
$nav = new Zend_Navigation($pages);
$this->view->navigation($nav);

然后,在布局中,呈现如下:

echo $this->navigation()->menu();

效果很好。现在:我希望菜单的呈现方式有所不同。我正在构建的页面使用 jQuery Fisheye 插件来构建类似 Mac 的 Dock 菜单。但是,这个插件需要一个特定的标记......

实际上,它需要一个<a>包含一个<img>(用于图标)和一个<span>(用于工具提示)的元素列表。标准的菜单视图助手将所有内容呈现在无序列表中(逻辑上),'label'参数作为链接文本。

似乎传递给'label'参数的内容在渲染之前被转义了,所以在那里插入 html 对我没有任何好处。此外,Fisheye 通常不会将其项目包含在<li>标签中,而将整个项目都包裹在 中<ul></ul>,而只是一个<a>元素的一级列表。

我正在考虑为 Dock 编写一个自定义视图助手,它可以负责插入<img><span>,但是我很难将自定义视图助手附加到 Navigation 类。我只是不知道在哪里以及以什么方式放置它,即使我所有的其他自定义类(模型等)都由自动加载器精心照顾。对此有什么想法吗?

再说一次,即使我可以让这个视图助手工作,我仍然留下 HTML 无序列表 - 我知道我也可以使用自定义视图助手丢失那个,但我一直是包含 main 的粉丝为了语义,列表内的导航菜单。

如果有人可以帮助我一点,我将不胜感激。如果 Fisheye 不适合与<ul>'s 一起使用,那就太糟糕了……在这种情况下完全失去 Zend_Navigation 是否有充分的理由?

4

2 回答 2

24

在制作自定义渲染器方面,我还没有看到方法。这是我最终做的事情:

首先,不要渲染默认的 menu() 调用,而是创建一个要渲染的部分:

// menu.phtml is partial, cms is module
$partial = array('menu.phtml', 'cms');
$this->navigation()->menu()->setPartial($partial);
echo $this->navigation()->menu()->render();

然后(来自文档),您可以像这样创建“自定义”渲染:

// -- inside menu.phtml
foreach ($this->container as $page) 
{
    // this just prints a "<a>" or "<span>" tag
    // depending on whether the page has a uri
    echo $this->menu()->htmlify($page), PHP_EOL;
}

我最终用这个脚本制作了我最初拥有的东西(一个带有一级子菜单的菜单):

// -- another menu.phtml
<ul class="navigation">

<?php

$html = array();

foreach ($this->container as $page) 
{
    $html[] = "<li>";
    $html[] = $this->menu()->htmlify($page) . PHP_EOL;

    if (!empty($page->pages))
    {
        $html[] = "<ul>";
        foreach ($page->pages as $subpage) 
        {
            $html[] = "<li>";
            if ($href = $subpage->getHref()) $html[] = "<a href=\"{$href}\">";
            else $html[] = "<span>";
            $html[] = "<img src=\"/ui/cms/img/icons/edit.png\" alt=\"\"/>";
            $html[] = $subpage->getLabel();
            if ($href) $html[] = "</a>";
            else $html[] = "</span>";            
            $html[] = "</li>";
        }
        $html[] = "</ul>";
    }

    $html[] = "</li>";
}

echo join(PHP_EOL, $html);

?>
</ul>

您可以只更改部分中的标记并在那里添加您的图像/图标。

于 2009-08-10T14:38:51.603 回答
7

抱歉,上一篇文章的格式问题

要添加自定义助手,请在引导程序中执行以下操作:

protected function _initNavigation()
{
    $this->bootstrap('view');           // make sure we have a view
    $view = $this->getResource('view');     // get the view resource
    $config = new Zend_Config_Xml(APPLICATION_ROOT . '/config/navigation.xml','nav');
    $container = new Zend_Navigation($config);
    $view->navigation($container);

    // Tell Zend were it can find your custom helpers and what
    // the prefix is going to be.

   $view->addHelperPath(
          APPLICATION_ROOT . '/library/MyApp/View/Helper/Navigation',
          'MyApp_View_Helper_'
          );

}

接下来创建您的自定义视图助手并将其放在“addHelperPath”路径中。根据您想要做什么,您至少需要实现自己的 htmlify 函数。以 Zend/View/Help/Navigation/Menu.php 为例。

class MyApp_View_Helper_MyMenu extends Zend_View_Helper_Navigation_Menu
{
    public function myMenu(Zend_Navigation_Container $container = null)
    {
        if (null !== $container) {
            $this->setContainer($container);
        }
        return $this;
    }

    protected function htmlify(Zend_Navigation_Page $page ) 
    {
        ...
    }
}

接下来,在您的 phtml 脚本中:

   <?php echo $this->navigation()->myMenu()->setMaxDepth(0); ?>

要不就

   <?php echo $this->navigation()->myMenu(); ?>

现在,如果您想将自己的自定义属性添加到生成的 HTML 中,您可以将它们添加到导航 ini 或 xml 文件中。例如:

<home>
  <label>Home</label>
  <uri>/</uri>
  <img>
      <src>/images/MyIcon.gif</src>
  <img>
</home>

自定义 xml 标记<img>将存储为导航页面的属性,可以通过以下方式获取:

foreach ($iterator as $page) {

    ...

    $properties = new Zend_Config($page->GetCustomProperties());
    $myPicture = $properties->img->src;

    ...
}

希望这可以帮助。彼得

于 2009-11-29T19:23:54.897 回答