Как загрузить связанные продукты простого продукта с помощью ajax
У меня есть настраиваемый продукт, и при выборе его простого продукта мне нужны соответствующие сопутствующие продукты, загруженные через ajax. Любая помощь будет высоко оценена.
Вот как я называю свой ajax:
<script type="text/javascript">
require(["jquery"],function($) {
$(document).ready(function() {
var customurl = "<?php echo $this->getUrl().'custom/custom/index'?>";
$.ajax({
url: customurl,
type: 'POST',
dataType: 'json',
data: {
customdata1: 'test1',
customdata2: 'test2',
},
complete: function(response) {
},
error: function (xhr, status, errorThrown) {
console.log('Error happens. Try again.');
}
});
});
});
И мой метод выполнения файла контроллера выглядит примерно так:
public function execute()
{
$resultRedirect = $this->pageFactory->create();
$blockInstance = $resultRedirect->getLayout()->getBlock('catalog.product.related');
$message['html'] = $blockInstance->toHtml();
/** Json Responce */
$this->getResponse()->representJson(
$this->jsonData->jsonEncode($message)
);
}
Однако я не могу получить продукты с помощью ajax, а также мне нужно знать, как я работаю с конкретным простым продуктом.
2 answers
Вам необходимо настроить реестр продуктов, чтобы получить текущий связанный продукт.
public function __construct(
\Magento\Framework\App\Action\Context $context,
\Magento\Catalog\Model\ProductFactory $_productloader,
\Magento\Framework\Registry $registry)
{
$this->registry = $registry;
$this->_productloader = $_productloader;
}
public function execute()
{
$id=1; //pass current product id here
$product = $this->_productloader->create()->load($id);
$this->registry->register('product', $product);
$resultRedirect = $this->pageFactory->create();
$message['html']=$resultRedirect->getLayout()
->createBlock("Magento\Catalog\Block\Product\ProductList\Related")
->setTemplate("Magento_Catalog::product/list/items.phtml")
->setData('type', 'related')
->toHtml();
/** Json Responce */
$this->getResponse()->representJson(
$this->jsonData->jsonEncode($message)
);
}
Вы совершили какую-то ошибку.
1. Вы должны отправить идентификатор продукта/артикул в своем Ajax в качестве параметра Post
data: {
customdata1: 'test1',
customdata2: 'test2',
},
Должны быть внесены изменения в :
data: {
customdata1: 'test1',
customdata2: 'test2',
sku: '[PRODUCTSKU]'
},
2. Вы должны отправить объект продукта в свой класс блоков из контроллера, используя реестр, как @Qaisar Satti.
3. Блок getBlock('catalog.product.related')
доступен только , когда Текущая страница содержит сведения о продукте , а блок catalog.product.related
определяется с помощью xml-документа макета.
Решение: Вы должны добавить catalog_product_view обработчик для вашего обработчика ajax