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