如何在cakephp中显示同一页面上的链接?

时间:2013-03-19 03:54:30

标签: cakephp-2.0

我有两个控制器产品和服务,它们有很多属于association.I有一个'index.ctp'显示我的所有产品但我希望在我的'index.ctp'上有一个链接将在同一个'index.ctp'中显示来自另一个动作'productdisplay'的结果。是否可以使用元素以及如何执行此操作?

1 个答案:

答案 0 :(得分:0)

使用requestAction()

在CakePHP中,可以通过requestAction()获取另一个Controller / action的渲染动作。阅读本手册的这一部分以获取更多信息; Controller::requestAction()

例如;

echo $this->requestAction('/products/productdisplay/5');

但是,应该确实避免使用requestAction,因为它的性能非常差。

替代方案

使用AJAX

因为您提到“点击链接时”,我假设您正在显示产品列表,并且当用户点击“详细信息”按钮/链接时,的详细信息应展示产品。

最好的方法是使用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');
}