2011-08-05 42 views
3

我確定我的問題非常簡單,我一直在尋找答案,但我似乎無法使其工作。我想要做這樣的事情:有沒有辦法在zend導航中找到沒有鏈接的導航條目?

<?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>部分,我想有隻是一個標籤類別,這樣,當我添加的造型後,我可以將鼠標懸停在「法案」和「創建新賬單」和其他鏈接將顯示,但點擊「賬單」不應該做任何事情,因爲它只是一個類別標題。

我希望這是有道理的。

Mockup of menu. Bill is not a link.

回答

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; }); }); 
3

實際上有另一種方法來解決這個問題。

您可以只用你的XML /數組定義額外的配置選項設置所有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> 
<!-- ... --> 

注:我使用的麪包屑例子在這裏,但大部分的導航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>'; 
    } 

} 

注:通過使用部分,你將失去麪包屑View_Helper像setLinkLast,setSeparator的一些默認功能......但這些不應該構成太大的問題。

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