• ベストアンサー

MVC構造で、各コントローラで共通な動的ページを表示するにはajaxが一般的なのでしょうか?

MVC構造に不慣れなものです。(zendフレームワークを利用しています) コントローラAContololler.phpで、ビューA.htmlを表示しています。 ビューA.htmlの中では、共通のビューhead.htmlを最初に読み込んでいます。 コントローラB,Cでも同様にビューB,Cを表示し、共通のビューhead.htmlを最初に読み込んでいます。 このビューhead.htmlの中身を条件ごとに動的表示したいのです。 1個のコントローラ限定であれば、 コントローラ内で条件分けして結果をビューに渡してしまうだけなんですが、 複数のコントローラで呼ばれることを考えると、 それぞれのコントローラ内に同じ処理を書かなければなりません。 これを忘れてたまたまhead.htmlを読み込んでしまった時にエラーとなってしまいます。 ようするに、head.htmlを読み込む上で、コントローラ側に設定が必要という二手間かかる部分が腑に落ちません。 MVC構造でないのであれば、動的部分をhead.phpとして作っておき、 必要なページでそれを読み込むだけでいいのにって思ってしまいました。 この二手間かかるのを回避するには、 head.htmlの中で、動的データを取りにいくというajax化するしかないのでしょうか? それともhead.htmlの中にphpのコード、ここでいえばDBに繋ぐ部分や条件分けなどまで書いてしまうのもありなんですか? でもMVCの考え方としてビューの中に処理をだらだら書くのはちょっと筋違いかなぁと思うのですがどうなんでしょう。。。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

Zendは使ったことがないですが、 演算処理が発生するなら、Controllerから呼び出しているであろうModelで処理させたり、 または、Controllerに一つ継承クラス作ってそこに必要な振り分けメソッドを記述して、全てのControllerはそれを継承するように作れば良いのではないでしょうか。 MVCというよりかは、オブジェクト指向の利点を生かせてないように思います。 <?php class IndexController extends Zend_Controller_Action{ } ?> というものを作っているのであれば、 <?php abstract class DefaultController extends Zend_Controller_Action{ public function テンプレート振り分けようの関数(){ //なんか処理 } } ?> というものを作ってやって、IndexControllerを <?php class IndexController extends DefaultController{ } ?> と書き換えてやれば、継承元のメソッドが使えます。

karace
質問者

お礼

大変、参考になりました! 基底コントローラを作成し、init内でビュー変数に値を持っておくという方法にしました。 ありがとうございました。

その他の回答 (2)

  • in_dow
  • ベストアンサー率77% (7/9)
回答No.3

Layoutを使うのがいいかと思います。 このあたりが参考になるかと。(28.2. Zend_Layout クイックスタート) Layoutを固定的に使う場合は、基底Controller(extends Zend_Controller_Action)を作成して、そこのpreDispatchでLayoutのファイル名を指定してあげるのが良いと思います。 あとは継承させて作業をすすめると、 思うような動作になるかと思います。 ※Zend_Controller_ActionからpreDispatchを継承するときの注意 以下のようにしないと、ディスパッチされず、不可解な状態になりますのでご注意ください。 public function preDispatch() { $ret = parent::preDispatch(); // なんらかの処理 return $ret; }

参考URL:
http://framework.zend.com/manual/ja/zend.layout.quickstart.html
karace
質問者

お礼

Zend_Layout すごく参考になりました! これを使えば、部品化したhtmlを、ビュースクリプト内でrequireするとかしなくてもいいんですね。 ただ、表示系はデザイナーさんがいじりやすくするため、システムと絡まない方法を探しています。 なので、基底コントローラで必ずビュー変数に値を持っておくという方法にしました。 ありがとうございました。

  • oraora777
  • ベストアンサー率20% (56/268)
回答No.1

Ajaxに話が飛躍する前にテンプレートエンジンくらい使わないのは何故?

karace
質問者

お礼

PHP自体がテンプレートエンジンのようなものだと思っていて ビューの中で、$this->hoge で処理後の値は取得できますよね。 ajaxで後から取得しに行くといったことをしないのであれば、 事前にこの$this->hoge に値を持っている必要があり、 この処理を全てのコントローラで行っておかなければいけないんでしょうか? もしかしたら共通のhead.htmlを読み込まない時もあると思うんです。 そういった場合に、コントローラで必ずこのための処理をしておくというのが腑に落ちないんです。 MVCでなければ(フレームワークでなければ)、 処理を入れておいた共通のhead.phpを作っておき、 それを呼ばれた時だけ処理が行われて無駄が無いと思うんです。 この点、MVCではこういうものだってことなんでしょうか?

関連するQ&A