2

これに関する合理的な答えはどこにも見つかりません。

コントローラーでは、ViewModel子 ViewModel を含めることができるインスタンスを返します。わかりましたが、これらの子ブロックには変数も必要です。変数は、同じコントローラー アクションですぐに設定できます。しかし、どうすれば 11 ページの長さのコントローラー アクションを正確に回避できるでしょうか?

たとえば、Magento では、ビュー スクリプトは、ビューを変更する特定のメソッドを持つクラスである「ブロック」から派生するため、子 html を取得するだけで、独自のメソッドを使用して独立して処理できます。

実用的(テンプレート法):

<?php echo $this->getSidebar(); ?>

非現実的 (ZF2 コントローラー):

$leftSidebar = new ViewModel(...
$leftSidebarPostsWidget = new ViewModel(...
$leftSidebar->addChild($leftSidebarPostsWidget);
$view = new ViewModel();
$view->addChild($leftSidebar);    

return $view;

私はビューヘルパーを調べましたが、それらは不要なすべてのビュースクリプトで利用できるようです.

カスタム レンダー クラスを特定のテンプレートに関連付ける方法はありますか?

ViewModel を拡張するブロック クラスを作成することもできますが、残念ながら、Zend Framework 2 で役立つものが不足しています。

4

1 に答える 1

2

私はマーシャルハウスに完全に同意します。私はいくつかの magento モジュールを開発しましたが、ブロック ソリューションは非常に便利です。

Zend2 で同様の機能を実現するために私が行ったことは、目的のメソッドを持つオブジェクトを含む「me」という名前の ViewModel 変数を設定することです。私の場合、実際にはオブジェクトには ViewModel が含まれており、少し作業するだけで、magento と同じようにツリーを作成できます。

$blockModel->setVariable('me', $blockModel);

$blockModel 自体には、viewModel を保持するプロパティがあり、ツリーを構築すると、

$blockModel->getParent();

親ブロックを返します。次のように言えます。

$blockModel->getParent()->getViewModel()->addChild($blockModel->getViewModel());

あなたのphtmlテンプレートでは、呼び出すだけで機能し$this->me->anyMethod()ます。

もちろんトリッキーですが、magento は 1 日でビルドされたわけではありません...

于 2013-05-13T22:44:42.683 に答える