在Magento中的同一页面上显示多个产品

时间:2014-05-14 14:20:22

标签: php ajax magento

我有一个响应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>

1 个答案:

答案 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%正确,因为我现在无法对其进行测试,但架构和原则应该没问题。