0

我有两个控制器产品和服务,它们有很多属于关联。我有一个显示我所有产品的“index.ctp”,但我想在我的“index.ctp”上有一个链接,它将显示结果来自同一个 'index.ctp' 中的另一个动作 'productdisplay' 。是否可以使用元素以及如何做到这一点?

4

1 回答 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 回答