1

CakePHP/MVC の要点を完全に見逃していないことを確認するために、少しフィードバックが必要です。

私は CakePHP でミニ cms を設計しています - 基本的にはフォト アルバムです。すべてのページに標準の定型的なドロップダウン メニューを用意したいと考えています。当然のことながら、ユーザーがアルバムを削除および追加すると、メニューは動的である必要があります。

私の目標: 反対方向に動くものを構築しますView::actionRequest()(つまり、view がコントローラーにコールバックする代わりに、コントローラーが設定された変数を View クラスにプッシュしてからレンダリングします)。私の理解では、それView::requestAction()はあまり優雅ではなく、かなり遅い。

これは、メニュー キーワードを含むテーブルのモデルです。app/Model/ModelItem.php

class MenuItem extends AppModel {
    public function buildMainMenu() {
        return $this->find('all');
    }
}

私はどこでもそれをしたいので、私は呼び出しをAppController

class AppController extends Controller {
    public function beforeFilter() {
        $this->loadModel('MenuItem');
        $this->set('mainMenuItems',$this->MenuItem->buildMainMenu());
    }
}

これは、CSS のデフォルト レイアウトの上部にダンプされる要素です - 要素ファイル: app/View/Element/navigation.ctp - レイアウト:app/View/Element/Layout/default.ctp

<ul id="navigation">
    <?php
    foreach($mainMenuItems as $item) {
        echo "<li>".$item['MenuItem']['name']."</li>";
    }
    ?>
</ul>

最終的に、テーブル内のすべてのアイテムの素敵な箇条書きリストができあがります。私はこれを完全にいじっていますか?私はそれをすべて間違っていますか?何も思いつきません。

4

2 に答える 2

4

私はあなたのアプローチに何も悪いことは見ていません。ただし、ここにいくつかの注意事項がありますが、完全にオプションです。

  • メニューフェッチコードをからbeforeFilter()に移動しますbeforeRender()。早い段階でそれを行う理由はありません。メニューが必要になる前に例外をスローしたり、ユーザーを別のページにリダイレクトしたりできます。さらに、そこにはリクエストに関する詳細情報があるので、メニューで現在のページ/アイテム/ユーザーを強調表示するなどのことができます。
  • 要素のレンダリングコードをある種のMenuHelperに移動します。これにより、レイヤーがよりクリーン$this->Menu->render()になります(レイアウトなど)。HtmlHelperを使用して、ケーキを介してアイテムをレンダリングし、ケーキにマークアップの正確さを処理させることもできます。
  • レンダリングをヘルパーに移動する場合は、必要に応じて、処理を高速化するために、全体に何らかのキャッシュスキームを実装します。キャッシングが可能かどうか、またはコントローラーまたはヘルパーでキャッシングを行う必要があるかどうかは、完全にあなたとあなたのアプリ次第です:)

全体的なアドバイスは、アプリの残りの部分から機能の一部を分離することを試みることだと思います。読み、保守、変更が簡単です。

于 2012-06-04T19:31:40.553 に答える
0

レイアウト/ビューでメニューを出力するときに、それを要素に分割し、要求アクションを使用してデータをフェッチします。

/app/View/Elements/main_menu.ctp:

$mainMenuItems = $this->requestAction('/menu_items/buildMainMenu');

<ul id="navigation">
    <?php
    foreach($mainMenuItems as $item) {
        echo "<li>".$item['MenuItem']['name']."</li>";
    }
    ?>
</ul>

次のようにレイアウト/ビューに含めます。

echo $this->Element('main_menu');

このように、メニューを必要としないビュー/レイアウト (Ajax など) がある場合、データベース クエリを無駄にすることはありません。

于 2012-06-06T15:50:03.077 に答える