我有两个控制器产品和服务,它们有很多属于association.I有一个'index.ctp'显示我的所有产品但我希望在我的'index.ctp'上有一个链接将在同一个'index.ctp'中显示来自另一个动作'productdisplay'的结果。是否可以使用元素以及如何执行此操作?
答案 0 :(得分:0)
在CakePHP中,可以通过requestAction()
获取另一个Controller / action的渲染动作。阅读本手册的这一部分以获取更多信息; Controller::requestAction()
例如;
echo $this->requestAction('/products/productdisplay/5');
但是,应该确实避免使用requestAction,因为它的性能非常差。
因为您提到“点击链接时”,我假设您正在显示产品列表,并且当用户点击“详细信息”按钮/链接时,的详细信息应展示产品。
最好的方法是使用JavaScript(AJAX)从productdisplay操作中检索信息。
如果您不想依赖JavaScript,并希望将产品显示内容“静态”包含在页面中,您可以考虑为此创建“元素”。元素是可以嵌入视图中的“部分视图”。但是,如果元素使用模型中的数据,则必须检索该数据并将其传递给视图;
阅读本手册的这一部分,了解有关元素的更多信息:Elements
在您的控制器中:
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');
}