1

Zend Framework アプリケーションをモジュール ベースの構造に変換する前は、単一のレイアウトがあり、次のようにコントローラーから変数を渡すことができました。

// Controller action
$this->view->foo = 'Something';

// Layout
<?= $this->foo ?>

ただし、すべてをデフォルト モジュールに移動し、別の「管理」モジュールを作成して以来、これを機能させることができなくなりました。おそらく、「ビュー設定」をブートストラップ ファイルからコントローラ プラグインに移動したことが原因です。モジュールに合わせてレイアウトを切り替えています。私のプラグインは次のようになります。

class KW_Controller_Plugin_LayoutSelector extends Zend_Controller_Plugin_Abstract
{
    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        $layout = Zend_Layout::getMvcInstance();
        $layout->setLayout($request->getModuleName());

        $view = $layout->getView();
        $view->doctype('HTML5');
        $view->setEncoding('UTF-8');
        $view->headMeta()->appendHttpEquiv('Content-Type', 'text/html; charset=UTF-8');
        $view->headScript()->appendFile('/js/jquery-1.7.1.min.js');

        switch ($request->getModuleName()) {
            case 'admin':
                $view->headTitle('Admin Area')->setSeparator(' - ');
                $view->headLink()->appendStylesheet('/css/admin/global.css');
                $view->headScript()->appendFile('/js/admin/common.js');
                break;
            default:
                $view->headTitle('Main Site')->setSeparator(' - ');
                $view->headLink()->appendStylesheet('/css/global.css');
                $view->headScript()->appendFile('/js/common.js');
                break;
        }
    }
}

ビューへのこれらすべてのメソッド呼び出しをブートストラップに戻すと、変数を再びレイアウトに渡すことができます。だから私は何かが間違った順序で起こっていると推測しています.変数をコントローラーからビューに渡した後にレイアウトが切り替えられ、それらが私のレイアウトに組み込まれていないのでしょうか? (コードを preDispatch() と postDispatch() の両方に入れるなどして、上記が実行されるポイントを変更しようとしました。)

これらの変数が含まれているレイアウトではなく、個々のビュー スクリプトでこれらの変数にアクセスできることに注意してください。

任意のポインタをいただければ幸いです。

4

2 に答える 2

1

私は現在のプロジェクトで同様のことをしていますが、それはおおむねうまく機能しています。

私が注意する1つの違いは、標準のアプリケーションリソースを使用して、アプリレベルでレイアウトとビューの両方をブートストラップしていることです。

次に、プラグインで、次を使用してビューにアクセスします。

$front = Zend_Controller_Front::getInstance();
$view = $front->getParam('bootstrap')->getResource('view');

これは、ブートストラップ、プラグイン、およびコントローラーで同じビューインスタンスにアクセスしていることを保証しているようです。

于 2012-04-09T15:00:26.210 に答える
0

たぶんこれは問題全体を解決するわけではありませんが、この醜いスイッチで少し役立ちますあなたはそこにいます:-)

public function preDispatch(Zend_Controller_Request_Abstract $request)
{

    $module = $request->getModuleName();
    $layout = Zend_Layout::getMvcInstance();

    // check module and automatically set layout
    $layoutsDir = $layout->getLayoutPath();
    // check if module layout exists else use default
    if(file_exists($layoutsDir . DIRECTORY_SEPARATOR . $module . ".phtml")) {
        $layout->setLayout($module);
    } else {
        $layout->setLayout("layout");
    }
}

}

于 2012-04-09T15:12:57.987 に答える