【问题标题】:Is there a way to have a navigation entry with no link in zend navigation?有没有办法在zend导航中有一个没有链接的导航条目?
【发布时间】:2011-10-21 06:17:15
【问题描述】:

我确定我的问题很简单,我一直在寻找答案,但我似乎无法解决问题。我想做这样的事情:

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

请注意,在&lt;bills&gt; 部分,我想要一个只有标签的类别,这样当我稍后添加样式时,我可以将鼠标悬停在“账单”和“创建新账单”上,其他链接将显示,但点击“账单”不应该做任何事情,因为它只是一个类别标题。

我希望这是有道理的。

【问题讨论】:

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


    【解决方案1】:

    必须为您的页面指定一个类型,否则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; }); });
    

    【讨论】:

      【解决方案2】:

      其实还有另一种方法可以解决这个问题。

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

      然后,通过使用专用部分来呈现您的菜单/面包屑,您可以完美地跳过呈现 &lt;a&gt; 标记或基于这些属性呈现完全不同的标记。

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

      注意:我在这里使用的是面包屑示例,但大多数 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>';
          }
      
      }
      

      注意:通过使用部分,您将失去 Breadcrumb View_Helper 的一些默认功能,例如 setLinkLast、setSeparator ......但这些应该不会造成太大问题。

      【讨论】:

        【解决方案3】:

        如果您对类别标签的跨度感到满意,那么只需指定一个空的 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>
        

        【讨论】:

          【解决方案4】:

          我以不同的方式去做:

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

          【讨论】:

            【解决方案5】:
            <page_bills>
               <label>Bills</label>
               <type>uri</type>
               <pages>
            
               </pages>
            </page_bills>
            

            【讨论】:

            • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
            猜你喜欢
            • 2021-10-01
            • 1970-01-01
            • 2022-01-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-12-03
            • 1970-01-01
            相关资源
            最近更新 更多