2011-05-10 86 views
1

我在我的網站上使用Zend_Navigation。大部分項目是Zend_Navigation_Page_Mvc而不是Zend_Navigation_Page_Uri。我知道我可以輕鬆地將fragment identifier添加到Zend_Navigation_Page_Uri項目,但這不是我期待的優雅解決方案。 this post有幾個解決方案,但它們擴展了URL助手,不影響導航。Zend_Navigation_Page_Mvc和片段標識符

我已經使用子分類Zend_View_Helper_Navigation_Menu來呈現菜單。也許有一種方法可以通過htmlify()函數來完成這個任務嗎?

+0

「但這不是我尋找的優雅解決方案」 - 問題是什麼? – 2011-05-10 23:21:47

+0

@jakenoble - 我想在Zend_Navigation_Page_Mvc頁面上使用片段標識符 – Sonny 2011-05-11 13:25:25

+0

想要使用帶有Zend_Navigation_Page_Mvc的片段標識符嗎? – 2011-05-11 14:58:58

回答

1

我最終添加了一個名爲fragment的屬性到頁面數組傳遞到Zend_Navigation,然後檢查它在我的子分類Zend_View_Helper_Navigation_Menu::htmlify()。這裏是我的htmlify()代碼:

/** 
* 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) 
{ 
    // get label and title for translating 
    $label = $page->getLabel(); 
    $title = $page->getTitle(); 

    // translate label and title? 
    if ($this->getUseTranslator() && $t = $this->getTranslator()) { 
     if (is_string($label) && !empty($label)) { 
      $label = $t->translate($label); 
     } 
     if (is_string($title) && !empty($title)) { 
      $title = $t->translate($title); 
     } 
    } 

    // get attribs for element 
    $attribs = array(
     'id'  => $page->getId(), 
     'title' => $title, 
     'class' => $page->getClass() 
    ); 

    // does page have a href? 
    if ($href = $page->getHref()) { 
     $element = 'a'; 
     $attribs['href'] = $href; 
     $attribs['target'] = $page->getTarget(); 
     // fragment identifier 
     if (0 < strlen($fragment = $page->get('fragment'))) { 
      $attribs['href'] .= '#' . $fragment; 
     } 
    } else { 
     $element = 'span'; 
    } 

    return '<' . $element . $this->_htmlAttribs($attribs) . '><span>' 
     . $this->view->escape($label) 
     . '</span></' . $element . '>'; 
} 
1

linked to post的解決方案,不影響導航,因爲Zend_Navigation_Page_Mvc使用Zend_Controller_Action_Helper_Url而不是Zend_View_Helper_Url。你必須重寫Zend_Controller_Action_Helper_Url :: url(),然後add your helper to the helper broker它會影響Zend_Navigation。

我在執行中,我使用了 '_fragment' 選項/參數,以幫助避免名稱衝突:

require_once('Zend/Controller/Action/Helper/Url.php'); 
class My_Controller_Action_Helper_Url extends Zend_Controller_Action_Helper_Url 
{ 
    public function url(array $urlOptions = array(), $name = null, $reset = false, $encode = true) 
    { 
     $fragment = ''; 
     if(isset($urlOptions['_fragment'])) { 
      $fragment = '#' . $urlOptions['_fragment']; 
      unset($urlOptions['_fragment']); 
     } 

     return parent::url($urlOptions, $name, $reset, $encode) . $fragment; 
    } 
} 

然後,我用它來配置Zend_Navigation在XML文件中,我創建了一個_fragment PARAM:

<page> 
    <id>pageId</id> 
    <label>Page Label</label> 
    <module>foo</module> 
    <params> 
     <_fragment>bar</_fragment> 
    </params> 
    <route>default</route> 
</page>