0

私はcakephpで簡単なウェブサイトを作成しています。

ヘッダーとフッターを「要素」に保持しましたが、問題は、ヘッダーのメニューがデータベースから取得されており、関数を呼び出すまで使用できないことです。

コントローラーが呼び出されたらすぐにメニューの機能を自分で呼び出す必要があります。

4

2 に答える 2

3

AppControllerに次を追加します。

function beforeFilter(){
    $this->set('menu', $this->YourModel->findById('Id of your menu data row in database'));
}

次に、ビューで、を呼び出すことによってメニューにアクセスできるようになりますecho $menu['yourModel']['menu'];

于 2012-11-28T11:29:51.990 に答える
1

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

于 2012-11-28T15:28:45.873 に答える