0

独自の設定パスを持つさまざまな製品があります。例えば:

  1. エレクトロニクス/mp3 プレーヤー/sony-hg122
  2. フィットネス/デバイス/ジンボス

この形式の URL にアクセスできるようにしたい場合。例えば:

http://www.mysite.com/fitness/devices/gymboss
http://www.mysite.com/electronics/mp3-players/sony-hg122

私の戦略は、SiteController の "init" 関数をオーバーライドしてパスをキャッチし、それをレンダリング関数の独自の実装に向けることでした。しかし、これではパスをキャッチできません。

私はそれについて間違った方法で進んでいますか?これを行うための正しい戦略は何ですか?

** 編集 **

URL managerを利用する必要があると思います。しかし、パス形式がすべてデータベース内でカスタム化されている場合、どうすれば動的にパス形式を追加できるのでしょうか?

4

2 に答える 2

2

Eskimo のセットアップは、ほとんどの Yii システムにとって優れた堅実なアプローチです。ただし、あなたの場合は、カスタム UrlRule を作成してデータベースにクエリを実行することをお勧めします: http://www.yiiframework.com/doc/guide/1.1/en/topics.url#using-custom-url-rule-classes

注: URL ルールは Yii リクエストごとに解析されるため、注意が必要です。効率的でない場合、サイトの速度が急速に低下する可能性があります。デフォルトでは、ルールはキャッシュされます (キャッシュ設定がある場合) が、動的 DB ルールに適用されるかどうかはわかりません (適用されないと思います)。

于 2013-03-05T13:11:52.987 に答える
1

URL マネージャー ( protected/config/main.php ) で、に設定urlFormatしますpath(また、オプションで設定showScriptNamefalseます (これにより、URL の index.php 部分が非表示になります))。

'urlManager' => array(
    'urlFormat' => 'path',
    'showScriptName'=>false,

次に、ルールで次のように設定できます。

catalogue/<category_url:.+>/<product_url:.+> => product/view,

したがって、これが行うことは、catalogue/electronics/ipodsのような構造でProductController actionViewにルーティングして要求することです。category_url次に、次のように URL のとproduct_urlの部分にアクセスできます。

$_GET['category_url'];
$_GET['product_url'];

このルールがどのように機能するかというと、catalog という単語 (ドメイン名の直後) で始まり、その後に別の単語 ( category_url) と別の単語 ( )が続く URL は、product_urlそのコントローラー/アクションに転送されます。

この例では、カテゴリと製品の前にカタログという単語が付いていることに気付くでしょう。明らかに、これを好きなものに置き換えるか、すべて一緒に除外することができます。私がそれを入れた理由は、次の URL を検討するためです。

http://mywebsite.com/site/about

URL の「カタログ」部分を省略し、ルールを次のように定義した場合:

<category_url:.+>/<product_url:.+> => product/view,

URL マネージャーは、URL のサイト部分をcategory_url値として、about 部分をproduct_url. これを防ぐには、URL のカタログ部分を指定するか、非カタログ ページのルールを定義します (つまり、site/aboutのルールを定義します) 。

ルールは上から順に解釈され、最初のルールのみが一致します。明らかに、必要な数の異なる URL 構造に必要な数のルールを追加できます。

これが正しい道に進むことを願っています。必要な質問や説明があればお気軽にコメントしてください

于 2013-03-05T07:57:16.270 に答える