4

私の目標は、cakePHPを使用して、2つ以上のコントローラーのインデックスビューを1つのレイアウトページに結合することです。

例:ニュース、イベント、リンクのコントローラーがあります。各テーブルの最後の5つのエントリを1つのレイアウトページに表示したいと思います。また、ビューからのリンクの1つを選択すると、ユーザーはそのレコードのそれぞれのビューに移動する必要があります。

ビューに関する本のセクションを読みましたが、ビューを要素にするとこれがどのように達成されるかわかりません。

私を混乱させるのは、3つの別々のコントローラー/ビューを1つのレイアウトに組み合わせる方法です。

ありがとう

4

3 に答える 3

5

まず、ビューとコントローラーは必ずしも結び付けられているとは限りません。Cakeは、ファイル階層/命名規則で指定されたビューを暗黙的に追加しますが、必ずしもそうである必要はありません。したがって、ビューをコントローラーから切り離されたものと考えてみてください(これは、MVCアーキテクチャーを使用する主な目的の1つです)。

3つのビュー(A、B、C)が正確にコピーしたい方法であると仮定して、それらを要素(特別なAPP / views / elements /ディレクトリにある単なるビューファイル)に配置します。これで、$ this-> element('elementName'、array('options'))を呼び出すだけで、レイアウトまたは他のビューでそれらを使用できます。

基本的には、表示するコードを要素に抽象化してから、それらの要素を目的のレイアウトに挿入します。

于 2009-11-17T16:21:31.953 に答える
5

ニュース、イベント、リンクモデルに、最後の5つのレコードをフェッチするためのメソッドを作成します。次に、コントローラーでController :: usesプロパティにモデルを含めるか、アクションでClassRegistry :: init()を使用してモデルにアクセスします。

function my_action() {
  $news = ClassRegistry::init('News')->getRecent();
  $events = ClassRegistry::init('Event')->getRecent();
  $links = ClassRegistry::init('Link')->getRecent();
  $this->set(compact('news', 'events', 'links'));
}

その後、アプリケーションをDRYのままにして、任意のコントローラーアクションからこれらのモデルメソッドを呼び出すことができます。

my_action.ctpビュー、および実際に他の多くのビューで、要素をレンダリングするだけです。

// my_action.ctp
<?php
echo $this->element('recent_news');
echo $this->element('recent_events');
echo $this->element('recent_links');
?>

次に、要素は$ news(またはその他)変数を反復処理して、それぞれのコントローラーの「view」アクションへのリンクを含むアイテムを表示できます。

コントローラーがモデルと一致するからといって、そのコントローラーで他のモデルを使用できないという意味ではありません。

于 2009-11-17T21:00:31.257 に答える
2

RequestHandlerを使用するようにコントローラーを設定してから、ビュー要素がアプリケーション内の個別のコントローラーから独自のデータをフェッチできるようにすることができます。

このリンクは、私ができるよりもよく説明しています http://bakery.cakephp.org/articles/view/creating-reusable-elements-with-requestaction

覚えておくべきことの1つは、呼び出しているコントローラーアクションは、不要なデータベースクエリを実行しないように、独自のデータのキャッシュを考慮に入れる必要があるということです。

于 2009-11-17T19:13:19.773 に答える