私のレイアウト/default.ctp ファイルから呼び出されるサイド バー ナビゲーションの要素があり、Photos コントローラーからカテゴリに関するいくつかのデータにアクセスする必要があります。どうすればこれを行うことができますか?
4 に答える
キャッシュを効果的に使用しない限り、requestAction には注意してください。呼び出すたびにまったく新しい要求サイクルが開始されるため、アプリケーションの速度が大幅に低下する可能性があります。
Travis Leleu の答えは、物事を行う標準的な方法です。ただし、(移植性または何らかの理由で) データを要素にインポートする必要がある場合は、requestAction は適していません。
コントローラーに必要なビジネス ロジックを実行していないため、モデル クラスをシングルトンとして要素にインポートしてインスタンス化することを強くお勧めします。ClassRegistry::init(); を使用してこれを行うことができます。
$Photo = ClassRegistry::init('Photo');
$Photo->find('all');
データの追加処理を行う必要がある場合は、モデル自体で Cakes afterFind コールバックを使用するか、Photo モデルでカスタム メソッドを作成する必要があります。
class Photo extends AppModel {
function customFind () {
$photos = $this->find('all');
foreach ($photos as $photo) {
//processing code here...
}
}
}
次に、要素で呼び出します。
$Photo = ClassRegistry::init('Photo');
$Photo->customFind();
基本的にここで理解しようとしているのは、requestAction が適切な唯一の状況は、リダイレクトやコンポーネントの使用などを行う必要がある場合です。
単純にデータを取得および/または操作する場合、それはモデルに属します。
あなたのlayous/default.ctpを通常のテンプレートと見なして、
<?php echo $this->element('your element'); ?>
必要な場所。
ところで、使用:
$data = $this->requestAction('controller/action');
データにアクセスする
要素にデータを送信できます。たとえば、default.ctp で:
<?php echo $this->element('side_nav', $your_data); ?>
side_nav.ctp でそのデータを処理できます。
これを標準の Cake の慣習にしないのはなぜですか?
コントローラーでは、
$this->set( 'categories', $this->Photos->find(...) );