私はcakephpで簡単なウェブサイトを作成しています。
ヘッダーとフッターを「要素」に保持しましたが、問題は、ヘッダーのメニューがデータベースから取得されており、関数を呼び出すまで使用できないことです。
コントローラーが呼び出されたらすぐにメニューの機能を自分で呼び出す必要があります。
私はcakephpで簡単なウェブサイトを作成しています。
ヘッダーとフッターを「要素」に保持しましたが、問題は、ヘッダーのメニューがデータベースから取得されており、関数を呼び出すまで使用できないことです。
コントローラーが呼び出されたらすぐにメニューの機能を自分で呼び出す必要があります。
AppControllerに次を追加します。
function beforeFilter(){
$this->set('menu', $this->YourModel->findById('Id of your menu data row in database'));
}
次に、ビューで、を呼び出すことによってメニューにアクセスできるようになりますecho $menu['yourModel']['menu'];
TLDR:
コントローラ全体(またはすべてのコントローラ)がロードされるたびに関数を呼び出すのではなく、element
それ自体がロードされたときに関数を呼び出すことをお勧めします。これにより、前進するための柔軟性が大幅に向上します。たとえば、ログイン画面にメニューが必要ない場合や、最終的に別のメニューを持つ管理ツールを追加する場合などです。
CakePHPは、これを非常に簡単に使用できるようにしrequestAction()
ます-詳細はこちらをご覧ください:http: //book.cakephp.org/2.0/en/views.html#passing-variables-into-an-element
補足:コントローラーから直接呼び出すのではなく、すべてのクエリをモデルに保持することも理想的です(MVCパターンおよびその他の多くの理由)。
サンプルコード:
/**
* MenusController (or any other controller you want)
*/
public function get_menu_main() {
$this->set('menu', $this->Menu->getMenuMain());
}
public function get_menu_footer() {
$this->set('menu', $this->Menu->getMenuFooter());
}
/**
* Menu model
*/
public function getMenuMain() {
return $this->findById('12345');
}
public function getMenuFooter() {
return $this->findById('67891');
}
次に、要素で、を使用しrequestAction
て、その特定の要素に必要なデータを取得します。
/**
* MainMenu element
*/
$menu = $this->requestAction('menus/get_menu_main/');
/**
* FooterMenu element
*/
$menu = $this->requestAction('menus/get_menu_footer/');
補足:もう少し適切にする$this->Html->url()
ために、アクションへのURLをハードコーディングする代わりに使用できます。
補足: このコードの一部は、「必要ない」ときに余分なコードを追加するように見えるかもしれませんが、正しいMVCスポットに分割することで、コードははるかにクリーンで、より柔軟でアップグレード可能になります...などこのようなことをする習慣を身につけると、物事が少し複雑になり始めたときに、あなたの生活がはるかに楽になります。(実際には、上記のコードは数行追加されますが、複雑さに関する限り、要素の変数をロードするクエリをAppControllerに含めるよりも理解しやすいと思います。/endrant