2つのコントローラーProductsとServicesがあり、関連付けに多くのものがあります。すべての製品を表示する「index.ctp」がありますが、結果を表示する「index.ctp」にリンクが必要です。同じ「index.ctp」内の別のアクション「productdisplay」から。要素を使用してこれを行うことは可能ですか?
質問する
163 次
1 に答える
0
requestAction()を使用する
CakePHPでは、を介して別のコントローラー/アクションのレンダリングされたアクションを取得することが可能requestAction()
です。詳細については、マニュアルのこのセクションをお読みください。Controller :: requestAction()。
例えば;
echo $this->requestAction('/products/productdisplay/5');
ただし、requestActionはパフォーマンスが非常に低いため、実際には避ける必要があります。
代替案
AJAXの使用
「リンクをクリックすると」とおっしゃっていたので、商品のリストを表示していると思います。ユーザーが「詳細」ボタン/リンクをクリックすると、その商品の詳細が表示されます。
このための最良の方法は、JavaScript(AJAX)を使用してproductdisplayアクションから情報を取得することです。
要素の使用
JavaScriptに依存せず、productdisplayコンテンツをページに「静的に」含める場合は、このための「要素」を作成することを検討してください。要素は、ビューに埋め込むことができる「部分ビュー」です。ただし、要素がモデルからのデータを利用する場合は、そのデータを取得してビューに渡す必要があります。
要素の詳細については、マニュアルのこのセクションをお読みください。要素
コントローラ内:
public function index($selectedProductId = null)
{
// retrieve all products for the overview
$this->set('products', $this->Products->find('all'));
if ($selectedProductId) {
// a product has been selected,
// retrieve the data for the selected product
$this->set('selectedProduct', $this->Products->findById($selectedProductId));
}
}
あなたの見解では
// render your list of products
foreach ($products as $product) {
echo $this->Html->link(
$product['Product']['name'],
array('action' => 'index', 0 => $product['Product']['id'])
);
}
if (isset($selectedProduct)) {
// a product has been selected. Render it using an element
// this will render View/Elements/productDisplay.ctp
echo $this->element('productDisplay');
}
于 2013-03-21T20:26:38.557 に答える