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".

Буду признателен за любую помощь или предложение.

Спасибо

Author: Sagar Parikh SGR, 2019-11-18

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();

Надеюсь, это будет полезно для вас.

 1
Author: Rohan Hapani, 2019-11-18 14:03:50