2

我想要实现的目标:单击产品链接/图像(至少在某些区域)以打开包含完整产品信息的弹出窗口(基本上是产品视图页面的所有内容)。

到目前为止我所做/尝试过的事情:

  • 创建了 ajax php 代码之外的所有东西(模块、链接、模板、重写)
  • 创建了 ajax 控制器(可以通过类似于: 的链接访问http://test.com/index.php/ajaxproductview/ajax/index/id/2)。
  • 遵循各种教程(如thisthis)-帮助我走到了这一步。但我不想加载我的自定义块,我想要默认的产品视图块。
  • 试图在 indexAction() 中添加一些代码。它到达那里,但代码失败。我没有收到任何错误/通知/报告,只是看起来像是杀死我的处理器的无限循环。

    $body = $this
        ->getLayout()
        ->createBlock('product.info') // taken from catalog.xml
        ->toHtml();
    $this->getResponse()->setBody($body);
    

所有其他页面都工作正常,这是一个新的 magento,只有磁电机和我的模块安装并激活。

我的 AJAX 函数只是获取这个 HTML 响应,将它放入一个 div 中,然后打开一个弹出窗口。

我的问题是(是) - 我如何设置产品 ID,因此该块知道要加载什么产品,以及如何正确加载该块。我也尝试过类似的东西:

谢谢你。

PS:我也试过这个:

    $layout = $this->getLayout();
    $update = $layout->getUpdate();
    $update->load('catalog_product_view');
    $layout->generateXml();
    $layout->generateBlocks();
    $output = $layout->getOutput(); // $output is an empty string
4

1 回答 1

8

Product 控制器使用帮助器来设置活动产品。你应该可以在你的控制器中做同样的事情!

在进行布局之前尝试此操作:

$productId  = (int) $this->getRequest()->getParam('id');
Mage::helper('catalog/product')->initProduct($productId, $this);

另一件需要注意的事情:如果你添加了一个像 product.info 块这样的块。如果它在其模板文件中调用它们,它需要额外的子块。

使用自定义布局 xml 文件将是最简单的。然后,您可以为您的操作句柄添加特定布局(您的操作句柄由模块的 etc/config.xml 文件中的路由器节点组成<frontend><routers>,例如<Yourmodule>节点,确保将其小写!然后用下划线添加控制器名称和操作名称,在您的情况下为 index_index),如下所示:

<yourmodule_index_index>
    <remove name="right"/>
    <remove name="left"/>
    <block type="catalog/product_view" name="root" output="toHtml" template="catalog/product/view.phtml">
    <!-- Add all the child blocks you need -->
    </block>
</yourmodule_index_index>

这使得 view.phtml 成为使用其 toHtml 方法呈现自身的根块。因此,在您的控制器操作中,您只需要上面的两行,然后:

$this->loadLayout();
$this->renderLayout();
于 2013-01-18T09:30:11.270 回答