有没有办法在zend导航中有一个没有链接的导航条目?

时间:2011-08-05 22:50:44

标签: php zend-framework zend-navigation php-5.2

我确信我的问题很简单,而且我一直在寻找答案,但我似乎无法使其发挥作用。我想做这样的事情:

<?xml version="1.0" encoding="UTF-8"?>
<configdata>
<dashboard>
    <label>Dashboard</label>
    <controller>dashboard</controller>
    <action>index</action>
    <module>global</module>
</dashboard>
<bills>
    <label>Bills</label>
    <pages>
        <create-bill>
            <label>Create New Bill</label>
            <controller>bill</controller>
            <action>create</action>
            <module>global</module>
        </create-bill>
    </pages>
</bills>
</configdata>

请注意,在<bills>部分,我想要一个只有标签的类别,这样当我稍后添加样式时,我可以将鼠标悬停在“Bills”和“Create New Bill”等链接上将显示,但点击“Bills”不应该做任何事情,因为它只是一个类别标题。

我希望这是有道理的。

Mockup of menu. Bill is not a link.

5 个答案:

答案 0 :(得分:3)

必须为您的网页指定类型,否则Zend_Navigation将引发异常。在像您这样的情况下,我总是使用Zend_Navigation_Page_Uri作为页面类型,并将其uri指定为#。要将其应用于配置文件,您可以执行此操作

<bills>
    <label>Bills</label>
    <uri>#</uri>
    <pages>
        <create-bill>
            <label>Create New Bill</label>
            <controller>bill</controller>
            <action>create</action>
            <module>global</module>
        </create-bill>
    </pages>
</bills>

生成的标记仍包含链接,但不会指向任何位置。

此外,由于您需要将一些javascript绑定到它以显示菜单,您甚至可以通过在该链接的点击处理程序中返回false来禁用它。

为了将javascript回调(或某些css)附加到这种链接,您可能会发现将类附加到这些链接很有用。在同一配置文件中,您可以使用此代码

<bills>
    <label>Bills</label>
    <uri>#</uri>
    <class>fakelink</class>
    <pages>
        <create-bill>
            <label>Create New Bill</label>
            <controller>bill</controller>
            <action>create</action>
            <module>global</module>
        </create-bill>
    </pages>
</bills>

在这种情况下,生成的标记将是

<li class="fakelink>
  <a href="#">Bills</a>
  <ul>submenu here</ul>
</li>

你可以轻松地用javascript库选择那种链接。例如,使用jQuery,你可以这样做:

$(function() { $('.fakelinks > a').click(function () { return false; }); });

答案 1 :(得分:3)

实际上还有另一种解决方法。

只需在xml / array /...中定义额外的配置选项,就可以在所有Zend_Navigation_Page上设置自定义属性。

然后通过使用专用的部分来渲染菜单/面包屑,您可以完全跳过呈现<a>标记或基于这些属性呈现完全不同的标记。

<!-- ... -->
    <page1>
        <label>Page 1</label>
        <uri>page1</uri>
        <link>false</link> <!-- Custom property -->
        <pages>
            <page1_1>
                <label>Page 1.1</label>
                <uri>page1/page1_1</uri>
            </page1_1>
            <page1_2>
                <label>Page 1.2</label>
                <uri>page1/page1_2</uri>
            </page1_2>
            <page1_3>
                <label>Page 1.3</label>
                <uri>page1/page1_3</uri>
            </page1_3>
        </pages>
    </page1>
<!-- ... -->

注意:我在这里使用了breadcrumbs示例,但大多数Navigation View_Helpers都有一个setPartial()方法,包括菜单助手。

然后在您的视图脚本或布局中,您只需指定您的面包屑帮助程序需要使用部分。

<?php
echo $this->navigation()->breadcrumbs()->setPartial('my_breadcrumbs.phtml');

在您的部分内容中,您将遍历年度痕迹路径中的页面,并检查每个页面的自定义属性。

<?php
foreach($this->pages as $page)
{
    $properties = $page->getCustomProperties();

    // Check if we need to render the link tag
    if($properties['link'] !== false){
        echo '<a href="' . $page->getHref() . '">';
    }

    // Render the label
    echo $page->getLabel();

    // And check if we need to render the closing tag
    if($properties['link'] !== false){
        echo '</a>';
    }

}

注意:通过使用partial,你将丢失Breadcrumb View_Helper的一些默认功能,如setLinkLast,setSeparator,......但这些不应该造成太多问题。

答案 2 :(得分:2)

如果您对类别标签的跨度感到满意,那么只需指定一个空URI即可完成工作。 Zend_View_Helper_Navigation_Menu :: htmlify()呈现Zend_Navigation_Page:

/**
 * Returns an HTML string containing an 'a' element for the given page if
 * the page's href is not empty, and a 'span' element if it is empty
 *
 * Overrides {@link Zend_View_Helper_Navigation_Abstract::htmlify()}.
 *
 * @param  Zend_Navigation_Page $page  page to generate HTML for
 * @return string                      HTML string for the given page
 */
public function htmlify(Zend_Navigation_Page $page)

示例输出:

<ul class="navigation">
    <li>
        <span id="menu-staff">Staff</span>
        <ul>
            <li>
                <a href="/staff/holiday/book-holiday" id="menu-staff-holiday-book">Book Holiday</a>
            </li>
            <li>
                <a href="/staff/holiday/view-holidays" id="menu-staff-holiday-view-booked">View Booked and Remaining Holiday</a>
            </li>
        </ul>
    </li>
</ul>

答案 3 :(得分:0)

我以不同的方式解决了这个问题:

nav:

  User:
    label: Account Services
    uri: @fakeUri

然后在我的模板代码中:

<?php foreach ($navSettings as $navSetting): ?>
    <?php if ('@fakeUri' === $navSetting->getUri()): ?>
        <?php echo $navSetting->getLabel() ?>
    <?php else: ?>
        <a href="<?php echo $navSetting->getUri() ?>"><?php echo $navSetting->getLabel()) ?>
    <?php endif ?>
<?php endforeach ?>

答案 4 :(得分:0)

<page_bills>
   <label>Bills</label>
   <type>uri</type>
   <pages>

   </pages>
</page_bills>