11

Zend Framework でセットアップされた標準の MVC を使用して、全体にアンカーがあるページを表示できるようにしたいと考えています。現在、.phtml ファイル内に必要な「#anchor」を含む意味のないパラメーターを追加しているだけです。

<?= $this->url(array(
    'controller'=>'my.controller',
    'action'=>'my.action',
    'anchor'=>'#myanchor'
));

これにより、URL が /my.controller/my.action/anchor/#myanchor のように設定されます

これを達成するためのより良い方法はありますか?アンカー リンクに移動した後、余分なアイテム パラメータがユーザーの URL に設定されます。

4

4 に答える 4

13

可能性の 1 つは、url ヘルパーをオーバーライドするか、新しいヘルパーを作成することです。

class My_View_Helper_Url extends Zend_View_Helper_Url
{    
    public function url(array $urlOptions = array(), $name = null, $reset = false, $encode = true)
    {
        if (isset($urlOptions['anchor']) && !empty($urlOptions['anchor']))
        {
            $anchor = $urlOptions['anchor'];
            unset($urlOptions['anchor']);
        }
        else
        {
            $anchor = '';
        }

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

このヘルパーは URL ヘルパーをオーバーライドします。問題は、'anchor' というパラメーターを使用できないことです。これは、url でアンカーに変更されるためです。

あなたの例のようにそれを呼び出します

<?= $this->url(array(
    'controller'=>'my.controller',
    'action'=>'my.action',
    'anchor'=>'#myanchor'
));

役立つことを願っています

于 2009-01-02T12:55:26.260 に答える
7

URLにフラグメントIDを実装する方法は複数あります。以下は、いくつかのオプションと、それぞれの長所と短所です。

直接追加

"#$fragment_id"呼び出しの後に単に追加することができますurl()。エレガントではありませんが、シンプルです。ページアンカーをあまり使用しない場合(つまり、1ページまたは2ページのみ)、これが最適な方法です。

url()カスタムヘルパーを書く

url()フラグメントIDにオプションの5番目の引数を追加するカスタムバージョンを作成できます。

class My_View_Helper_Url extends Zend_View_Helper_Url
{    
    public function url(array $urlOptions  = array(), $name   = null, 
                              $reset       = false,   $encode = true, 
                              $fragment_id = null)
    {
        $uri = parent::url($urlOptions, $name, $reset, $encode);

        if(!is_null($fragment_id)) {
            $uri .= "#$fragment_id";
        }

        return $uri;
    }
}

このようにして、アンカー(およびアンカー/フラグメントID)情報は、ビューの領域内で厳密に保持されます。これは一般的な使用には適していますが、デフォルトルートでは少し扱いに​​くい場合があります。また、これは一部の用途にはまだ少しハードコーディングされています。

カスタムRouteクラスを作成する(Extreme)

Zend_Controller_Router_Route3番目のオプションとして、クラスのカスタムバージョン、具体的にはassemble($data, $reset, $encode)メソッドを記述できます(match($path)メソッドはデフォルトでフラグメントIDを無視します)。

このメソッドの使用は非常に難しい場合がありますが、特に使用が特定のルートのみに制限されている場合は非常に便利です(このメソッドは、任意の変数に基づいてフラグメントIDを作成するために使用できます)。

警告

Certain considerations must be taken into account when using fragment ids. For example, query strings have to precede the fragment id in the uri, otherwise, the query string ignored by PHP. However, most ZF applications tend to avoid use of query strings, so it may not be an issue.

于 2009-01-24T02:41:59.133 に答える
5

URL ビュー ヘルパーは、3 番目のオプションとして「フラグメント」キーを受け入れます。

url('[route]',array([params]),array('fragment'=>'anchor'));

これにより、自動的に #anchor で URL が終了します。

-エクスロードのおかげで

于 2014-07-30T15:34:17.830 に答える
0

他のヘルパーも同じ動作をするため (リダイレクタ アクション ヘルパーなど)、カスタム ルート クラスを作成する Extreme メソッドの方が優れていると思います。

于 2009-02-24T19:16:42.567 に答える