Php Zend_导航_页面_Mvc和片段标识符
我在我的网站上使用Php Zend_导航_页面_Mvc和片段标识符,php,zend-framework,zend-navigation,zend-framework-mvc,Php,Zend Framework,Zend Navigation,Zend Framework Mvc,我在我的网站上使用Zend_导航。大多数项目是Zend\u Navigation\u Page\u Mvc,而不是Zend\u Navigation\u Page\u Uri。我知道我可以很容易地在Zend\u Navigation\u Page\u Uri项中添加一个,但这不是我想要的优雅解决方案。上有几个解决方案,但它们扩展了URL帮助器,并且不影响导航 我已经使用了一个子类Zend\u View\u Helper\u Navigation\u菜单来呈现菜单。也许有一种方法可以通过htmli
Zend_导航
。大多数项目是Zend\u Navigation\u Page\u Mvc
,而不是Zend\u Navigation\u Page\u Uri
。我知道我可以很容易地在Zend\u Navigation\u Page\u Uri
项中添加一个,但这不是我想要的优雅解决方案。上有几个解决方案,但它们扩展了URL帮助器,并且不影响导航
我已经使用了一个子类
Zend\u View\u Helper\u Navigation\u菜单
来呈现菜单。也许有一种方法可以通过htmlify()
函数来实现这一点?我最终向传递到Zend\u Navigation
中的页面数组添加了一个名为fragment
的属性,然后在我的子类Zend\u View\u Helper\u Navigation\u菜单::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 . '>';
}
/**
*返回包含给定页面的“a”元素的HTML字符串,如果
*页面的href不为空,如果为空,则为“span”元素
*
*重写{@link Zend_View_Helper_Navigation_Abstract::htmlify()}。
*
*@param Zend_Navigation_Page$用于生成HTML的页面
*@返回字符串给定页面的HTML字符串
*/
公共功能htmlify(Zend_导航_页面$Page)
{
//获取用于翻译的标签和标题
$label=$page->getLabel();
$title=$page->getTitle();
//翻译标签和标题?
如果($this->getUseTranslator()&&&$t=$this->getTranslator()){
如果(是字符串($label)&&!空($label)){
$label=$t->translate($label);
}
如果(是字符串($title)&&!空($title)){
$title=$t->translate($title);
}
}
//获取元素的属性
$attribs=数组(
'id'=>$page->getId(),
“title”=>$title,
'class'=>$page->getClass()
);
//页面是否有a href?
如果($href=$page->getHref()){
$element='a';
$attribs['href']=$href;
$attribs['target']=$page->getTarget();
//片段标识符
如果(0get('fragment')){
$attribs['href'].='#'.$fragment;
}
}否则{
$element='span';
}
返回“”
.$this->view->escape($label)
. '';
}
中的解决方案不会影响导航,因为Zend\u navigation\u Page\u Mvc使用Zend\u Controller\u Action\u Helper\u Url而不是Zend\u View\u Helper\u Url。您必须重写Zend_控制器\u操作\u助手\u Url::Url(),然后它才能影响Zend_导航
在我的实现中,我使用“_fragment”选项/param来帮助防止名称冲突:
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_导航的XML文件中,我创建了一个_片段参数:
<page>
<id>pageId</id>
<label>Page Label</label>
<module>foo</module>
<params>
<_fragment>bar</_fragment>
</params>
<route>default</route>
</page>
页面ID
页面标签
福
酒吧
违约
“但这不是我正在寻找的优雅解决方案”-问题出在哪里?@jakenoble-我想在Zend_Navigation_Page_Mvc
页面上使用片段标识符您想在Zend_Navigation_Page_Mvc
页面上使用片段标识符吗?