Yiiフレームワークを使用して、2列のレイアウトを使用するサイトを開発しています。1つの列は実際のコンテンツであり、もう1つの列はサイトリンク、ログインしたユーザーに関する情報、および最新の投稿のリストを含むメニューです。メニューはすべてのページに表示されますが、現在のページ(またはルート)に関連する情報はありません。
メニューをレンダリングするたびに、データベースから最新の投稿とユーザー関連データのリストを取得する必要があります。サイト上のすべてのアクションでデータをフェッチするコードを繰り返さないように、このメニューをどのようにレンダリングするのが最適かわかりません。
私はいくつかのアプローチを考えましたが、そのうちのどれがこの状況に対処する正しい方法であるかを知りたいと思います。
メソッド内のデータをフェッチしてから、データをブロック
Controller::beforeRender
に表示する部分ビューでメニューをレンダリングします。CClipWidget
次に、レイアウトビューで、メニューがあるはずのブロックを表示します。この方法は機能しますが、のせいでかなり不格好だと思いbeforeRender
ます。メニューがないページを追加した場合は、そのチェックを含める必要があります。また、Yiiのドキュメントを読んだ後、が必要なのか、それとも単に。beforeRender()
が必要なのかわかりません。renderPartial()
render()
メニューの部分的なビューを保持し、レイアウトビューからレンダリングします。データは、別の場所(おそらくモデル内)に配置された静的メソッドからメニュービューにフェッチされます。これにはごくわずかなコードの記述が含まれますが、MVCパラダイムに適しているかどうかはわかりません。ビュー内のデータをフェッチすると、静的関数を呼び出しているだけなのに、少しうんざりします。
メニューをウィジェットに変えます。データは
run()
メソッドでフェッチされ、ウィジェットビューからレンダリングされます。ただし、ウィジェットを使用すると、いくつかの追加の制限が課せられます。コントローラで最新の投稿をレンダリングするビューを使用したい場合、問題が発生します。ウィジェットは使用できず、常にrenderPartial()
使用する必要がありrender()
ます。render()
ビュー(ウィジェットまたはコントローラー)をレンダリングしているものを確認し、またはrenderPartial()
適切に呼び出す方法を理解すれば、これを回避できます。また、ウィジェットビューはサイトビューから分離する必要がありますが、のように完全なビューパスを指定することで、これを回避できapplication.views.controller.view
ます。さらに、ウィジェットがデータベースデータを自分でフェッチする必要があるかどうかはまだわかりません。
これらの方法はすべて機能しますが、いくつかの問題があります。多くのサイトが同じ状況にあると確信しており、最良の選択肢が何であるかを知りたいと思います。