アプリ版:「スタンプのみでお礼する」機能のリリースについて

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の考え方としてビューの中に処理をだらだら書くのはちょっと筋違いかなぁと思うのですがどうなんでしょう。。。

A 回答 (3件)

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{
}
?>
と書き換えてやれば、継承元のメソッドが使えます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/12/24 09:54

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. …
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/12/24 09:53

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

    • good
    • 0
この回答へのお礼

PHP自体がテンプレートエンジンのようなものだと思っていて
ビューの中で、$this->hoge で処理後の値は取得できますよね。

ajaxで後から取得しに行くといったことをしないのであれば、
事前にこの$this->hoge に値を持っている必要があり、
この処理を全てのコントローラで行っておかなければいけないんでしょうか?
もしかしたら共通のhead.htmlを読み込まない時もあると思うんです。
そういった場合に、コントローラで必ずこのための処理をしておくというのが腑に落ちないんです。

MVCでなければ(フレームワークでなければ)、
処理を入れておいた共通のhead.phpを作っておき、
それを呼ばれた時だけ処理が行われて無駄が無いと思うんです。

この点、MVCではこういうものだってことなんでしょうか?

お礼日時:2009/12/16 11:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!