Magento 中的 Ajax(加载产品视图块)
Posted
技术标签:
【中文标题】Magento 中的 Ajax(加载产品视图块)【英文标题】:Ajax in magento (load product view block) 【发布时间】:2013-01-18 08:25:35 【问题描述】:我想要实现的目标: 单击产品链接/图像(至少在某些区域)以打开包含完整产品信息的弹出窗口(基本上是产品视图页面的所有内容)。
到目前为止我做了/尝试了什么:
在 ajax php 代码之外创建了所有东西(模块、链接、模板、重写) 创建了 ajax 控制器(可以通过类似于http://test.com/index.php/ajaxproductview/ajax/index/id/2
的链接访问)。
遵循各种教程(如this 或this) - 这帮助我走到了这一步。但我不想加载我的自定义块,我想要默认的产品视图块。
试图在 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
【问题讨论】:
【参考方案1】:产品控制器使用帮助器来设置活动产品。你应该可以在你的控制器中做同样的事情!
在进行布局之前试试这个:
$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();
【讨论】:
好吧,所以基本上我也需要添加这些块,基本上复制到控制器中的 XML 结构中,对吗? @VladPreda 是的,正确的。最简单的方法是在模块中添加您自己的 xml 布局文件。然后将块添加到您的特定操作句柄中,例如“以上是关于Magento 中的 Ajax(加载产品视图块)的主要内容,如果未能解决你的问题,请参考以下文章