我正在开发一个使用AJAX加载追加销售产品的Magento 2模块。每个客户的追加销售产品可能不同,因此AJAX用于加载块以允许缓存清除。
为此,我有一个自定义模块,其中我的块扩展了\Magento\Catalog\Block\Product\ProductList\Upsell
。在catalog_product_view.xml
的模块布局中,我有以下内容 -
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceBlock name="product.info.upsell" remove="true" />
<referenceContainer name="content.aside">
<block class="MyCompany\MyModule\Block\Product\ProductList\Upsell"
name="personalised.product.upsell"
template="MyCompany_MyModule::upsell.phtml" />
</referenceContainer>
</body>
</page>
在我的upsell.phtml中 -
<div id="personalised-upsells-container" data-role="personalised-upsells"></div>
<script type="text/x-magento-init">
{
"*": {
"MyCompany_MyModule/js/upsell": {
"upsellAjaxUrl": "<?php echo $block->getUpsellAjaxUrl(); ?>"
}
}
}
</script>
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
-
<?xml version="1.0"?>
<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/layout_generic.xsd">
<container name="root">
<block class="MyCompany\MyModule\Block\Product\ProductList\Upsell" name="product.info.personalised.upsell" template="Magento_Catalog::product/list/items.phtml">
<arguments>
<argument name="type" xsi:type="string">upsell</argument>
</arguments>
</block>
</container>
</layout>
正如您所期望的那样,通过ajax正确加载产品追加销售块,将HTML推送到我的容器中,然后在页面上初始化upsellProducts
小部件。我的追加销售产品按预期显示,但没有价格。
我已经尝试了一些事情来调试这种情况,但据我所知,它无法在priceRender
方法内的\Magento\Catalog\Block\Product\AbstractProduct
的第428行加载getProductPriceHtml()
。当通过AJAX加载块时,行$priceRender = $this->getLayout()->getBlock('product.price.render.default');
总是返回false
。
当我使用我的块替换布局中的默认块(personalised_products_upsellajax.xml)时,也是这种情况,例如。
<?xml version="1.0"?>
<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/layout_generic.xsd">
<container name="root">
<block class="Magento\Catalog\Block\Product\ProductList\Upsell" name="product.info.upsell" template="Magento_Catalog::product/list/items.phtml">
<arguments>
<argument name="type" xsi:type="string">upsell</argument>
</arguments>
</block>
</container>
</layout>
我原本以为它可能与我的布局中首先移除加售块有关,即<referenceBlock name="product.info.upsell" remove="true" />
我决定对此行进行注释,导致出现两个加售块,一个是默认加载块另一个是我的AJAX块。相同的结果,默认块显示正确的信息,但我的AJAX块仍然缺少价格。
非常感谢任何帮助。
答案 0 :(得分:2)
我遇到了同样的问题:块product.price.render.default
需要在布局中可用,以及它的一些子块,以提供价格。答案的想法很简单:因为这个块是为default
句柄加载的,所以请确保布局中有这个句柄,方法是在请求的早期添加它:
public function __construct(Context $context, LayoutInterface $layout)
{
parent::__construct($context);
$this->layout = $layout;
$this->layout->getUpdate()->addHandle('default');
}
答案 1 :(得分:0)
您可以尝试:
beep()
答案 2 :(得分:0)
我最近遇到了同样的问题,经过多次挖掘和搜索,我们似乎找到了解决方案。将<update handle="empty"/>
添加到布局文件似乎可以解决问题并显示定价。所以在你的情况下,布局最终看起来像
<?xml version="1.0"?>
<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/layout_generic.xsd">
<update handle="empty"/>
<container name="root">
<block class="MyCompany\MyModule\Block\Product\ProductList\Upsell" name="product.info.personalised.upsell" template="Magento_Catalog::product/list/items.phtml">
<arguments>
<argument name="type" xsi:type="string">upsell</argument>
</arguments>
</block>
</container>
</layout>
我无法解释其原因。我通过查看1列布局并以此为基础来到这里。到目前为止,我们已经用它来解决这个问题。