2008年05月20日

そういえば、Viewについてはあまり語られていない

そういえば、だれもViewクラスについてはあまり多くを語っていませんね。$this->set()でビューにデータを送る以外は、単なるhtmlなんじゃないの?という声も聞こえてきそうです。

しかし、1.1のViewのコンストラクタにはこんなコードが入っていました。


function __construct(&$controller) {
if(is_object($controller)){
$this->controller =& $controller;
$this->_viewVars = $this->controller->_viewVars;
$this->action = $this->controller->action;
$this->autoLayout = $this->controller->autoLayout;
$this->autoRender = $this->controller->autoRender;
$this->base = $this->controller->base;
$this->webroot = $this->controller->webroot;
$this->helpers = $this->controller->helpers;
$this->here = $this->controller->here;
$this->layout = $this->controller->layout;
$this->modelNames = $this->controller->modelNames;
$this->name = $this->controller->name;
$this->pageTitle = $this->controller->pageTitle;
$this->viewPath = $this->controller->viewPath;
$this->params = $this->controller->params;
$this->data = $this->controller->data;
$this->webservices = $this->controller->webservices;
$this->plugin = $this->controller->plugin;
}
parent::__construct();
}


1.2では配列で設定されています。


var $__passedVars = array('viewVars', 'action', 'autoLayout', 'autoRender', 'ext', 'base', 'webroot', 'helpers', 'here', 'layout', 'name', 'pageTitle', 'layoutPath', 'viewPath', 'params', 'data', 'webservices', 'plugin', 'passedArgs', 'cacheAction');

$count = count($this->__passedVars);
for ($j = 0; $j < $count; $j++) {
$var = $this->__passedVars[$j];
$this->{$var} = $controller->{$var};
}



ViewのHTMLの中でも、かなりのデータにアクセスできます。うまく活用できるとなかなか便利ですね。
ラベル:cakephp view
posted by SDozono at 14:03| 東京 ☔| Comment(0) | TrackBack(0) | CakePHP View | このブログの読者になる | 更新情報をチェックする

2006年07月19日

値のチェックにまつわるいろいろ

入力されたデータのチェック方法に関しては、

http://manual.cakephp.org/chapter/12

ここにいろいろ説明があります。日本語関係のものは、自分でいろいろ設定できます。

で、ここで設定したチェックルールがどこで利用されるか、というと、

1)上記のマニュアルにあるように、
    if($this->Post->validates($this->data))
とすれば、$this->data で送られた入力データが、Post モデルの設定ルールに適合しているかチェックできます。正しければ true が返ってきます。
これは、モデルにあるメソッドであることに注意。

2)それぞれの値のどれがおかしいのか調査・設定させるには、
    $this->validateErrors($this->User);
 とします。これは、“コントローラのメソッド”であることに注意しましょう。この作業では、あるモデルのデータをひとつ一つチェックし、ルールにあてはまらないものがあれば、その“スイッチをパチッと入れる”ような動作をします。つまりは、モデルの invalidate というメソッドを実行し、$this->validationErrors[$field] という配列を 1(スイッチ・オン!)に設定します。

3)$this->Property->save($this->data['Property'])

などのようにして、モデルのsaveメソッド(入力されたデータ)
を実行すると、自動的に validateErrors のチェックがかかります。(2と同じ。)強制的に保存したい場合には、

$this->Property->save($this->data['Property'], false)

とすれば、チェックを無視できます。

4)自前で、“この値はだめだよチェック”をしたい場合には、

if(チェックが通らなかった場合){
$this->User->invalidate('username'); //“エラースイッチ”をON。
}

とすれば、 username というフィールドのデータは通らなかったことになります。ここで複数条件でチェックしたい、エラーメッセージを変えたい、などの場合には、username_hiragana などのように、自分で勝手に作ってしまって大丈夫です。

5)View でのエラー表示
   $html->tagErrorMsg('Post/title', 'タイトルを記入してください')

  という形を使います。例えば上の場合には、"Postデータのtitleという名前のフラグが立っていれば、エラーを表示する"ということになります。
続けて、

   $html->tagErrorMsg('Post/title_hiragana', 'タイトルはひらがなで記入してください')

なども並べておけば、 $this->Post->invalidate('title_hiragana') をしていた場合には表示されることになります。

ちなみに、

・ Model クラスの中には、
  validates,    チェックが通ったら True を返す。
  invalidFields,  チェックに引っかかった配列を返す。
  invalidate    チェックが通らなかったある項目のスイッチをON。
というメソッド。

・ Controller クラスの中には、
  validate, エラーの“数”を返す。
  validateErrors  エラーのあるデータを調査、スイッチを入れてゆく。
というメソッド。

という似て非なる命令がありますので、使い分けに注意しましょう。
  

 



posted by SDozono at 12:33| ロサンゼルス 🌁| Comment(0) | TrackBack(0) | CakePHP View | このブログの読者になる | 更新情報をチェックする