1

私はZend_Navigation自分のサイトで使用しています。ほとんどのアイテムはそうではZend_Navigation_Page_MvcありませんZend_Navigation_Page_Uriフラグメント識別子をアイテムに簡単に追加できることは知っていZend_Navigation_Page_Uriますが、それは私が探している洗練されたソリューションではありません。この投稿にはいくつかの解決策がありますが、それらはURLヘルパーを拡張し、ナビゲーションには影響しません。

私はすでにサブクラスZend_View_Helper_Navigation_Menuを使用してメニューをレンダリングしています。たぶん、htmlify()関数でこれを達成する方法はありますか?

4

2 に答える 2

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 . '>';
}
于 2011-05-11T20:39:44.063 に答える
1

Zend_Navigation_Page_MvcはZend_View_Helper_UrlではなくZend_Controller_Action_Helper_Urlを使用するため、リンク先の投稿のソリューションはナビゲーションに影響しません。Zend_Controller_Action_Helper_Url :: url()をオーバーライドしてから、ヘルパーをヘルパーブローカーに追加して、 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パラメーターを作成します。

<page>
    <id>pageId</id>
    <label>Page Label</label>
    <module>foo</module>
    <params>
        <_fragment>bar</_fragment>
    </params>
    <route>default</route>
</page>
于 2011-08-08T23:45:59.223 に答える