3.5.3.4 その他の便利なメソッド
3.5.3.4.1 constructClasses
このメソッドは、コントローラに必要なモデルを読み込みます。通常、この読み込み処理は、CakePHP によって行われます。しかし、このメソッドは、通常と異なる方法でコントローラにアクセスするとき、あると便利です。もし、コマンドラインスクリプトや、通常の利用以外に CakePHP が必要な時、 constractClasses() が役に立つかもしれません。
3.5.3.4.2 referer
現在のリクエストの参照元 URL を返します。
3.5.3.4.3 disableCache
現在のリクエストの結果をキャッシュしないように、ユーザのブラウザに通知するのに利用してください。これは、あとの章で説明するビューのキャッシュとは違います。
3.5.3.4.4 postConditions
postConditions(array $data, mixed $op, string $bool, boolean $exclusive)
postConditions(array $data, mixed $op, string $bool, boolean $exclusive)
このメソッドを使用すると、POST された一連のモデルのデータ(Htmlヘルパーと互換のある入力値)をモデル用の find 条件に変換できます。この関数は、検索ロジックを素早く構築するためのショートカットです。たとえば、管理権限のあるユーザが、どの項目が入力されたかを知るために順序を検索したい。CakePHP の Form ヘルパーや Html ヘルパーを使用して、Order モデルに基づいて素早くフォームを生成することができます。コントローラのアクションは、そのフォームから POST されたデータを使用して find 条件を組み立てることができます。:
function index() {
$o = $this->Orders->findAll($this->postConditions($this->data));
$this->set('orders', $o);
}
function index() {$o = $this->Orders->findAll($this->postConditions($this->data));$this->set('orders', $o);}
仮に $this->data[‘Order’][‘destination’] の値が “Old Towne Bakery” と等しい場合、postConditions はその条件を配列に変換し、Model->findAll() メソッドで使用できるようにします。この場合、array(“Order.destination” => “Old Towne Bakery”) のようになります。
もし用語内で別の SQL オペレータを使用したい場合、第2引数を使用します。
/*
$this->data の内容
array(
'Order' => array(
'num_items' => '4',
'referrer' => 'Ye Olde'
)
)
*/
// 最低4つの項目があり、 ‘Ye Olde’ を含む orders を取得しましょう
$o = $this->Order->findAll($this->postConditions(
$this->data,
array('>=', 'LIKE')
));
/*$this->data の内容array('Order' => array('num_items' => '4','referrer' => 'Ye Olde'))*/// 最低4つの項目があり、 ‘Ye Olde’ を含む orders を取得しましょう$o = $this->Order->findAll($this->postConditions($this->data,array('>=', 'LIKE')));
オペレータを指定したキーの順番は、$this->data 配列内のカラムの順です。num_items は1番目なので、>= オペレータが適用されます。
3番目の引数は、find 条件内でどの SQL 真偽値オペレータを使用するかをCakePHP に知らせます。‘AND’, ‘OR’, ‘XOR’ のような文字列はすべて有効な値です。
最後に、最後の引数に true をセットすると、$op パラメータは配列となり、$op に含まれないフィールドは返される条件に含まれないでしょう。
3.5.3.4.5 paginate
このメソッドを使用すると、モデルからペジネートする結果を取得します。ページサイズ・モデルの find 条件などが指定できます。詳細やペジネートの使用方法については、pagination セクションを見てください。
3.5.3.4.6 requestAction
requestAction(string $url, array $options)
この関数は、なんらかのロケーションを使用してコントローラのアクションを呼び出し、そのアクションの実行結果のデータを返します。$url に渡すのは CakePHP の相対 URL (/controllername/actionname/params) です。受信コントローラのアクションに特別なデータを渡すには、 $options 配列に追加します。
オプションに 'return' を渡すことで requestAction() を使用して、完全にレンダリングされたビューを取得することができます。: requestAction($url, array('return'));
キャッシュせずに使用すると、requestAction はパフォーマンスが悪くなります。まれにコントローラやモデルで使用することが適切な場合があります。
requestAction は(キャッシュされた)エレメントとともに使用されることが一番多いです。 - レンダリングする前にエレメント用のデータを取り出すために使用されるからです。レイアウト内で "latest comments" エレメントを設置する例を見てみましょう。初めにデータを返すコントローラの関数を作成する必要があります。
// controllers/comments_controller.php
class CommentsController extends AppController {
function latest() {
return $this->Comment->find('all', array('order' => 'Comment.created DESC', 'limit' => 10));
}
}
// controllers/comments_controller.phpclass CommentsController extends AppController {function latest() {return $this->Comment->find('all', array('order' => 'Comment.created DESC', 'limit' => 10));}}
上記の関数を呼び出す簡単なエレメントを作成するには:
// views/elements/latest_comments.ctp
$comments = $this->requestAction('/comments/latest');
foreach($comments as $comment) {
echo $comment['Comment']['title'];
}
// views/elements/latest_comments.ctp$comments = $this->requestAction('/comments/latest');foreach($comments as $comment) {echo $comment['Comment']['title'];}
どこにでもエレメントを設置することができます。出力を取得して使用します:
echo $this->element('latest_comments'); echo $this->element('latest_comments');
このように記述すると、エレメントがレンダリングされるときはいつでも、リクエストが生成されコントローラにデータが渡されます。データは処理されてから返されます。しかし注意しなればならないのは、不必要な処理を防ぐためにエレメントのキャッシュを使用することが重要です。エレメントの呼び出しを変更することによって次のようになります。:
echo $this->element('latest_comments', array('cache'=>'+1 hour')); echo $this->element('latest_comments', array('cache'=>'+1 hour'));
requestAction の呼び出しは、キャッシュされたエレメントのビューファイルが存在し有効である間は生成されなくなります。
