Magento - 在当前模板设计中通过 ajax 加载产品

Awa*_*rni 5 ajax magento

我正在构建一个 magento 扩展,我需要在左侧栏上按树形顺序显示所有产品,然后单击每个类别将通过发送 ajax 请求加载类别的产品。为了显示类别树,我使用了一个块。

我是 magento 的新手,所以我想将 ajax 请求发送到我的控制器,获取所有产品数据JSON并在前端创建 HTML 以显示产品。

我采用了带有2 column left bar产品列表的基本主题的 HTML并在 ajax 方法中使用。我用过

function loadCategoryProducts(categoryId) {
jQuery.ajax({
    url: '/myModule/index/loadcategoryproduct',
    type: 'post',
    data: {categoryId: categoryId},
    success: function(products) {
        products = jQuery.parseJSON(products);
        if (products != '') {
            var html = '';
            html += '<div class="page-title category-title">';
             // blah blah blah blah blah to draw html from ajax request
            }
            html += '</ul>';
            html += '</div>' // end of category-products product
            jQuery('.col-main').html(html);
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

}

还有我的控制器代码

public function loadcategoryproductAction() {
    $id = $this->getRequest()->getParam('categoryId');
    if ($id) {
        $_category = Mage::getModel('catalog/category')->load($id);
        $product = Mage::getModel('catalog/product');

        //load the category's products as a collection
        $_productCollection = $product->getCollection()
                ->addAttributeToSelect('*')
                ->addCategoryFilter($_category)
                ->load();



        // build an array for conversion
        $json_products = array();
        foreach ($_productCollection as $_product) {
            $_product->getData();
            $json_products[] = array(
                'name' => $_product->getName(),
                'url' => $_product->getProductUrl(),
                'description' => nl2br($_product->getShortDescription()),
                'price' => $_product->getFormatedPrice(),
                'image' => $_product->getImageUrl());
        }

        $data = json_encode($json_products);

        echo $data;
        die;
    }
}
Run Code Online (Sandbox Code Playgroud)

它工作得很好,但我知道这只是一个静态的东西,因为我使用的是基本主题的 HTML 和 CSS。它只适用于这个主题。如果magento商店的主题改变了怎么办?

那么我正在寻找的是如何在当前活动主题中显示产品?我只是向我的控制器发送 ajax 请求,获取产品并且这些产品必须以当前主题布局呈现?必须有一种方法可以做到这一点,但我仍然无法找到。我用谷歌搜索,但都是徒劳的。我不喜欢为它使用任何内置扩展。我希望我的扩展程序能做到这一切。请指导。

Awa*_*rni 4

好的,我已经找到解决方案了。您只需获取类别并在注册表中设置为当前类别即可。然后您需要获取当前活动模板。对于列出 Magento 的产品,请始终检查list.phtml当前活动主题的文件。所以这是步骤

  1. 获取类别
  2. 将您的类别注册为当前类别。
  3. 获取当前模板 list.phtml 文件并将您的类别传递给该文件
  4. 剩下的交给 Magento,它可以处理它,因为It is Magento:-)

这是将替换我的控制器代码的代码

 $id = $this->getRequest()->getParam('categoryId');
 $category = Mage::getModel('catalog/category') ->setStoreId(Mage::app()->getStore()->getId()) ->load($id);
 Mage::unregister('current_category');
 Mage::register('current_category', $category);
 echo $this->getLayout() ->createBlock('catalog/product_list') ->setTemplate('catalog/product/list.phtml') ->setCategoryId($id) ->toHtml();
 die;
Run Code Online (Sandbox Code Playgroud)

这将返回产品 HTML,我只需要将 HTML 放入success function我的 ajax 请求中。

success : function(products) {
  jQuery('col-main').html(products)
}
Run Code Online (Sandbox Code Playgroud)

就是这样。:-)