Сообщение не работает после запуска ajax в magento 2 (сохраните form_ui в бэкэнде) - PullRequest
0 голосов
/ 21 февраля 2019

Пожалуйста, помогите мне!я пишу форму сохранения инвентаризации в magento 2, после сохранения -> сообщение не работает, если перезагрузить страницу, это работает.Большое вам спасибо

ФУНКЦИЯ ВЫПОЛНЯЕТСЯ В МОЕМ КОНТРОЛЛЕРЕ

$data = $this->getRequest()->getParams();
$sku = $data['sku'];
$qty = $data['qty'];
try {
            $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
            $productId = $this->product->getIdBySku($sku);
            $product = $objectManager->create('Magento\Catalog\Model\Product')->load($productId);
            $stockItem = $this->_stockRegistry->getStockItemBySku($product->getSku());
            $stockItem->setQty($qty);
            $stockItem->save();
            //echo "ok ".$sku;

            $this->messageManager->addSuccessMessage(__('All good'));

        } catch (\Magento\Framework\Exception\NoSuchEntityException $e) {
            //echo "khong co ".$sku;
            $this->messageManager->addErrorMessage(__('This is bad'));
        }
$response = $this->resultFactory
            ->create(\Magento\Framework\Controller\ResultFactory::TYPE_JSON)
            ->setData([
                'sku' => $sku,
                'qty' => $qty
            ]);
        return $response;

МОЙ JQUERY

require(['jquery','jquery/ui'],function($){
$("#button-unique-identifier-here").click(function(){
    var sku = $("input[name$='general[sku]']").val();
    var stocktaking = $("input[name$='general[stocktaking]']").val();
    url = '/admin/stocktaking/index/save';
    jQuery.ajax({
        url: url,
        dataType: 'json',
        type : 'post',
        data: {sku: sku,qty: stocktaking},
        success: function($response){
                alert("ss");
                console.log($response);
        }
    });
})
});

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Я не вижу точно, в чем ваша проблема, но вы можете немного упростить ваш код и загрузить stockItem напрямую с помощью данного sku.Следующий код работает для меня, если я назову его, например, напрямую по URL с параметрами sku и qty set:

$data = $this->getRequest()->getParams();
$sku = $data['sku'];
$qty = $data['qty'];

try {
    $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
    $stockItem = $this->_stockRegistry->getStockItemBySku($sku);
    $stockItem->setQty($qty);
    $stockItem->save();
    //echo "ok ".$sku;

    $this->messageManager->addSuccessMessage(__('All good'));

} catch (\Magento\Framework\Exception\NoSuchEntityException $e) {
    //echo "khong co ".$sku;
    $this->messageManager->addErrorMessage(__('This is bad'));
}
$response = $this->resultFactory
            ->create(\Magento\Framework\Controller\ResultFactory::TYPE_JSON)
            ->setData([
                'sku' => $sku,
                'qty' => $qty
            ]);
return $response;

Скорее всего, проблема связана с возвратом JSON, но я не экспертдля этого: -)

0 голосов
/ 21 февраля 2019

Функции addSuccessMessage () и addErrorMessage () работают над перезагрузкой страницы в Magento.Так что вам нужно сделать некоторые настройки для отображения сообщения после ответа AJAX.Отправьте ответ JSON с вашего контроллера следующим образом:

$data = $this->getRequest()->getParams();
$sku = $data['sku'];
$qty = $data['qty'];
$response = [];
try {
    $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
    $productId = $this->product->getIdBySku($sku);
    $product = $objectManager->create('Magento\Catalog\Model\Product')->load($productId);
    $stockItem = $this->_stockRegistry->getStockItemBySku($product->getSku());
    $stockItem->setQty($qty);
    $stockItem->save();

    $response = ['error' => false, 'message' => __('All good')];
}
catch (\Magento\Framework\Exception\NoSuchEntityException $e) {
    $response = ['error' => true, 'message' => __('This is bad')];
}

echo json_encode($response); // return response to ajax call in js file

В соответствии с переменной ответа напечатайте ваше сообщение следующим образом: Предположим, вы хотите напечатать сообщение в <div id="printmessage">:

require(['jquery','jquery/ui'],function($){
    $("#button-unique-identifier-here").click(function(){
        var sku = $("input[name$='general[sku]']").val();
        var stocktaking = $("input[name$='general[stocktaking]']").val();
        url = '/admin/stocktaking/index/save';
        jQuery.ajax({
            url: url,
            dataType: 'json',
            type : 'post',
            data: {sku: sku,qty: stocktaking},
            success: function($response) {
                var res = JSON.parse(JSON.stringify(response));
                var responseText = JSON.parse(res.responseText);
                if (responseText.error === true) {
                    $("#printmessage").addClass("error");
                    return false;
                }
                else {
                    $("#printmessage").addClass("success");
                }
                $("#printmessage").html(responseText.message);
            }
        });
    });
});

ВыполнитьСледующая команда:

php bin/magento c:f

Я надеюсь, что это может быть полезно для всех.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...