2011-05-10 84 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>