CakePHPで動的なデータベース駆動メニューを作成する最良の方法は何ですか?
質問
データベースから実行されるすべてのページにメニューを表示したい。ただダウンして汚いphpを使用するのは簡単ですが、MVCシステムを使用してcakephpと統合したいと思います。 今、私の質問はこれをどのように行うのが最善の方法ですか?
私の考えは、レイアウトで要素を作成してから、すべてのロジックのコンポーネントまたはコントローラーを作成することです。これに関する提案はありますか?または、ヘルパーは私が使いたいものですか?
また、データベース内の複数のテーブルからすべてのデータを取得する必要があります。 1つのモデルですべてのデータ収集ロジックを実行するのが最善ですか?または、そのほとんどをメニューコントローラー(またはコンポーネント)で実行し、各テーブルのモデルを使用しますか?
ありがとうございます
ウォルター
解決
モデルは、モデル化しているテーブルからデータを取得して処理する必要があるため、モデル内の各モデルのメニューデータを取得します。
コンポーネントは、複数のコントローラーで共有されるロジックを収容することを目的としているため、すべてのコントローラーで使用されるメニューコンポーネントは、モデルからメニューデータを取得してまとめるコードを配置するのに適した場所のように聞こえます。
メニューは通常、ネストされたリストです。これもメニューの場合、このためのマークアップを出力する最も簡単な方法は、一度に1レベルを出力する再帰関数(それ自体を呼び出す関数)です。要素ではなく、そこにmenu()メソッドを持つヘルパーを作成し、レイアウトから直接呼び出します。
他のヒント
neilcrooksの回答には同意しますが、明確にするためにいくつか追加します。
ヘルパーと要素は非常に単純ですが、ヘルパーがもう少し堅牢になる可能性があります(少なくとも、それは私の考えです;))。そのため、ヘルパーを使用すると、モデルの関連付けをその場でバインドおよびバインド解除できます。これにより、(一時的に)関連付けられたモデルからデータを取得できます。
個人的には、太ったモデルと細いコントローラーが好きなので、もしこの状況にいたら、ヘルパーを使用して一時的にモデルをバインドすると思います。既存のモデルから取得する必要があるデータには、Model1-> fetchMenuPart(...)タイプの呼び出しを使用してアクセスします。
その後、レイアウトファイルからヘルパーを呼び出すことができます。
これがどこにも記録されていない理由はわかりませんが、昨夜見つけたところです。レイアウトまたは要素の変数は、末尾の_for_layoutで定義する必要があります。例:$ this-> set( 'categories_for_layout'、$ this-> Category-> find( 'all'));
すべてのページでそのメニューが必要なため、AppControllerクラスでbeforeFilterメソッドを使用しました。
これは、インターネット上でこのこと自体を検索しているときに発見した素晴らしい解決策です。
http://articles.classoutfit.com/cakephp-dynamic-navigation-バー/
メニューのhtmlを保持する要素を作成してから、レイアウトでメニューをレンダリングすると思います。
echo $this->element('your menu');
動的にするには、メニューリンクを、おそらくコントローラーの配列として設定します。
私はここで1つの良い記事を見つけました http://www.milestree。 com / webdev / cakephp / dynamic_menu