我有一个响应Ajax请求的模块。我尝试让它渲染多个产品并获得生成的HTML。我的控制器代码如下。为了测试目的,我对ID进行了硬编码。
$ id = 52986;
foreach ($ids as $id) {
Mage::helper('catalog/product')->initProduct($id, $this);
$this->loadLayout();
$output[] = $this->getLayout()->getOutput();
Mage::unregister('current_product');
Mage::unregister('product');
}
print_r($output);
我假设foreach中的每个产品渲染都会独立渲染每个产品(即为每个渲染创建A' new'布局)。显然,我并不完全了解布局系统的工作原理。因此,我有两个问题。
1)如何获得每个产品的渲染HTML?
2)为什么不按照我期望的方式渲染布局?
对于相关信息,这是我使用
的布局XML<?xml version="1.0"?>
<layout version="0.1.0">
<shopthelook_ajax_index>
<update handle="catalog_product_view" />
<remove name="html_calendar" />
<reference name="root" output="toHtml">
<action method="setTemplate"><template>shopthelook/wrapper.phtml</template></action>
</reference>
<reference name="product.info">
<action method="setTemplate"><template>catalog/product/view.phtml</template></action>
</reference>
<reference name="product.info.media">
<action method="setTemplate"><template>catalog/product/view/media.phtml</template></action>
</reference>
<reference name="product.info.options.configurable">
<action method="setTemplate"><template>catalog/product/view/type/options/configurable.phtml</template></action>
</reference>
</shopthelook_ajax_index>
</layout>
答案 0 :(得分:0)
首先,更新布局xml文件:
<?xml version="1.0"?>
<layout>
<shopthelook_ajax_index>
<remove name="right"/>
<remove name="left"/>
<reference name="content">
<block type="shopthelook_ajax/response" template="shopthelook_ajax/response.phtml" />
</reference>
</shopthelook_ajax_index>
</layout>
它基本上告诉Magento将新输出(块)添加到控制器。现在你需要在模块中创建这个块类(app / code / local / Shopthelook / Ajax / Block / Response.php):
class Shopthelook_Ajax_Block_Response
extends Mage_Core_Block_Template
{
public function getCollection()
{
$productIds = array(52986, 52987, 52988);
$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addAttributeToFilter('entity_id', array('in' => $productIds));
$collection->addAttributeToSelect('*');
return $collection;
}
}
并创建一个模板文件(app / design / frontend / base / default / template / shopthelook_ajax / response.phtml:
<?php $_collection = $this->getCollection(); ?>
<ul class="products">
<?php foreach ($_collection as $_product) { ?>
<li>
<span class="product-name"><?php echo $_product->getName() ?></span>
...
</li>
<?php } ?>
</ul>
之后只需更新控制器以呈现其布局:
public function ajaxAction()
{
$this->loadLayout()->renderLayout();
}
该操作将加载合并的布局xml文件并根据您的模块/控制器/操作名称查找句柄(在您的情况下为shopthelook_ajax_index)。然后,它将使用选定的模板创建和渲染块。在模板中调用getCollection方法,该方法创建所选产品的集合。
不确定代码是否100%正确,因为我现在无法对其进行测试,但架构和原则应该没问题。