3

私は Phalcon の初心者です。データベースからメニュー要素を取得する PhalconPHP アプリケーションを作成します。index.volt で呼び出されるメニューを作成するためにレイアウトを使用しますが、レイアウトはモデル関数を直接呼び出します。これは最善の解決策ではないと思います。おそらく、モデルとレイアウトの間にコントローラーを使用する必要があります。

ここに画像の説明を入力

レイアウト:

<?php

$menus = Menus::find();

foreach ($menus as $menu) {
    echo "<li>".$menu->name."</li>";
}

索引:

<!DOCTYPE html>
<html>
    <head>
        <title>Phalcon PHP Framework</title>
    </head>

            <?php $this->partial("layouts/menus") ?>
        {{ content() }}

</html>

誰かがそのための最善の解決策を教えてくれることを本当に感謝しています.

4

1 に答える 1

3

メニューを生成する場合、おそらく BaseController クラスを拡張するために探しています。メニュー、メタデータ、ブレッドクラムなど、すべてのコントローラーで必要なコンテンツを生成するための非常に良い方法です。

class BaseController extends \Phalcon\Mvc\Controller {
    function initialize() {

        $menus = Menus::find(array(
             // you may want to condition query based on user cookie
             // or controller you are in
            'conditions' => 'controller = "' . $this->dispatcher->getControllerName() . '"'
        ));

        // and set it as View variable to use it if you want
        $this->view->setVar('menus', $menus);
    }
}

そして、それをデフォルトとして使用するようにすべてのコントローラーを設定します。

class DefaultController extends BaseController { }

menus.phtml より:

<?php

    foreach ($menus as $menu) {
        echo "<li>".$menu->name."</li>";
    }

十分なはずです。Voltでより良く見える:

<ul>
{% for menu in menus %}
    <li>
        <a href="{{ menu.url }}">{{ menu.name }}</a>
    </li>
{% enfor %}

ページの 50% でのみコンテンツを生成するなど、より複雑な問題の場合は、ビューのみのパラメーターを設定することをお勧めします。

$this->view->setVar('menus', array(
    'conditions' => 'controller = "' . $this->dispatcher->getControllerName() . '"'
));

しかし、それはエレガントな解決策ではないと見なされる可能性があり、ビューでモデルを手に入れることを妨げているわけではありません。これは避けたいと思います。必要でない限り DB に負荷をかけないように、queryBuilderの構築済みクエリを設定し、その in view ループを実行する方が少し良いでしょう。->execute()

于 2015-03-02T09:32:36.083 に答える