Magento 2: Как получить товар по артикулу на пользовательской странице?
Я создал пользовательскую страницу, на которой пользователи могут вводить артикул продукта, а после отправки кнопки загружать сведения о продукте, такие как имя, изображение и настраиваемый параметр для настраиваемого продукта.
Вот в чем проблема: Я получаю артикул из поля ввода, но сведения о продукте не загружаются на моей странице просмотра, или сведения не были успешно отправлены с контроллера для просмотра (фактически из блока в просмотр, как предлагалось на некоторых страницах).
Я следую ответу: Magento 2 - Отправка данных формы контроллеру с помощью AJAX и возврат результата в PHTML
Файл: viewproduct.phtml
Путь
simplemagento/addbulkproduct/просмотр/интерфейс/шаблоны/viewproduct.phtml
<form data-mage-init='{"validation": {}}' id="load_product">
<div class="control">
<input type="text" name="get_product" id="get_product" class="input-text" placeholder="<?= __('Product SKU') ?>" data-validate="{required:true}" />
</div>
<button type="submit" class="action-primary"><?= _('Submit') ?></button>
</form>
<?php
echo $test = $block->getProductBySku();
//var_dump($test); exit();
?>
<script>
require(['jquery'],function(){
jQuery(document).ready(function() {
jQuery("#load_product").submit(function(){
var getProduct = jQuery("input[name='get_product']").val();
var url = "<?php echo $block->getBaseUrl().'AddBulkProduct/loadproduct/Index/' ?>";
jQuery.ajax({
url: url,
type: "POST",
data: {get_product:getProduct},
showLoader: true,
cache: false
success: function(response){
console.log(response.output);
}
});
return false;
});
});
});
</script>
Файл: viewproduct_loadproduct_index.xml
Путь
Simplemagento/addbulkproduct/просмотр/интерфейс/макет
<body>
<referenceContainer name="content">
<block class="SimpleMagento\AddBulkProduct\Block\Index" template="SimpleMagento_AddBulkProduct::viewproduct.phtml">
</block>
</referenceContainer>
</body>
Файл: Index.php (Контроллер)
Путь
SimpleMagento/AddBulkProduct/Controller/loadproduct/Index.php
public function execute()
{
$getProduct = $this->getRequest()->getParam('get_product');
$result = $this->jsonFactory->create();
$resultPage = $this->pageFactory->create();
$block = $resultPage->getLayout()
->createBlock('SimpleMagento\AddBulkProduct\Block\Index')
->setTemplate('SimpleMagento_AddBulkProduct::viewproduct.phtml')
->setData('get_product',$getProduct)
->toHtml();
$result->setData(['output' => $block]);
return $resultPage;
}
Файл: Index.php (Блок)
Путь
SimpleMagento/AddBulkProduct/Block/Index.php
class Index extends Template
{
/**
* @var ProductRepositoryInterface
*/
protected $productRepository;
public function __construct(Template\Context $context, ProductRepositoryInterface $productRepository)
{
parent::__construct($context);
$this->productRepository = $productRepository;
}
public function getProductBySku($sku)
{
return $this->productRepository->get($sku);
}
}
Текущая ситуация: Как новичок в Magento, пожалуйста, скажите мне, использую ли я правильный поток или нет?
Насколько я понимаю, я использую блок для передачи данных с контроллера в мой файл phtml, но после использования блока макет Magento по умолчанию отображает не только базовый html введите текст и кнопку, как я могу восстановить свой макет?
В настоящее время после нажатия кнопки отправки он просто перезагружается с URL-адресом "?get_product=24-MB01".
Буду признателен за любую помощь или предложение.
Спасибо
1 answers
Он ничего вам не показывает, потому что вы не передали артикул в getProductBySku()
в этой функции в файле phtml.
Насколько я понимаю ваше требование, вам не нужно создавать функцию в блоке и передавать в файл phtml.
Вы просто передаете данные от контроллера при отправке запроса ajax. Как показано ниже:
$block = $resultPage->getLayout()
->createBlock('Magento\Framework\View\Element\Template')
->setTemplate('SimpleMagento_AddBulkProduct::viewproduct.phtml')
->setData('customproduct','yourdata')
->toHtml();
И получить данные в phtml, используя следующий код:
$block->getCustomproduct();
Надеюсь, это будет полезно для вас.