我正在研究一个使用AJAX加载追加销售产品的Magento 2模块.每个客户的追加销售产品可能不同,因此AJAX用于加载块以允许缓存清除.
为此,我有一个自定义模块,我的块扩展了\Magento\Catalog\Block\Product\ProductList\Upsell
.在catalog_product_view.xml
我的模块布局中有以下内容 -
在我的upsell.phtml中 -
该getUpsellAjaxUrl()
生成http://magento2.dev/personalised/products/upsellAjax/id/6
我的upsell.js -
define([ 'jquery', 'upsellProducts' ], function($) { function getUpsellContent(url) { $.ajax({ url: url, dataType: 'html' }).done(function (data) { $('#personalised-upsells-container').html(data).promise().done(function(){ $('.upsell').upsellProducts(); }); }); } return function (config, element) { getUpsellContent(config.upsellAjaxUrl); }; });
我的控制器(upsellAjax) -
class UpsellAjax extends ProductController { public function execute() { $productId = (int) $this->getRequest()->getParam('id'); $product = $this->loadProduct($productId); if (!$product) { return false; } /** @var \Magento\Framework\View\Result\Layout $resultLayout */ $resultLayout = $this->resultFactory->create(ResultFactory::TYPE_LAYOUT); return $resultLayout; } }
我的personalised_products_upsellajax.xml
-
upsell
正如您所期望的那样,通过ajax正确加载产品追加销售块,将HTML推送到我的容器中,然后upsellProducts
在页面上初始化小部件.我的追加销售产品按预期显示,但没有价格.
我已经尝试了一些事情来调试这种情况,但据我所知它无法加载方法内部的priceRender
第428行.当通过AJAX加载块时,该行总是返回.\Magento\Catalog\Block\Product\AbstractProduct
getProductPriceHtml()
$priceRender = $this->getLayout()->getBlock('product.price.render.default');
false
当我使用我的块替换布局中的默认块(personalised_products_upsellajax.xml)时,这也是这种情况,例如
upsell
我认为它可能与我的布局中首先删除加售块有关,即
我决定注释掉这一行,导致出现两个加售块,一个是默认加载块,另一个是我的AJAX块.相同的结果,默认块显示正确的信息,但我的AJAX块仍然缺少价格.
任何帮助将不胜感激.