JSON-Anforderung an den Controller mit fehlerhaftem Formularschlüssel

Sep 07 2020

Ich habe ein benutzerdefiniertes Modul mit einer Schaltfläche im Administrator, die ich beim Klicken eine Controller-Klasse aufrufen möchte. Meine HTML-Datei enthält dieses JavaScript:

<script type="text/javascript">
    require(["jquery"],function($) { $('#savePricing').click(function() {
            var customurl = "XX/Pricing/Controller/SaveFamilyPriceChanges";
            $.ajax({
                url: customurl,
                type: 'POST',
                dataType: 'json',
                data: {},
            complete: function(response) {             
                var status = response.responseJSON.status;       
                console.log(status);   
                },
                error: function (xhr, status, errorThrown) {
                    console.log('Error happens. Try again.');
                }
            });
        });
    });
</script>

Hier ist meine XX / Pricing / Controller / SaveFamilyPriceChanges.php

<?php
namespace XX\Pricing\Controller;

use Magento\Framework\Controller\Result\JsonFactory;
use Magento\Customer\Model\Session;

/**
 * Class SaveFamilyPriceChanges
 * @package XX\Pricing\Controller
 */
class SaveFamilyPriceChanges extends \Magento\Framework\App\Action\Action
{
    /**
     * @var JsonFactory
     */
    private $resultJsonFactory;
        /**
     * @var Session
     */
    private $customerSession; /** * @param JsonFactory $resultJsonFactory
     */
    public function __construct(
        JsonFactory $resultJsonFactory, Session $customerSession
    ) {
        $this->resultJsonFactory = $resultJsonFactory;
        $this->customerSession = $customerSession;
    }

    /**
     * @return \Magento\Framework\App\ResponseInterface|\Magento\Framework\Controller\Result\Json|\Magento\Framework\Controller\ResultInterface
     */
    public function execute()
    {    
        $response = $this->resultFactory
             ->create(\Magento\Framework\Controller\ResultFactory::TYPE_JSON)
             ->setData([
                 'status'  => "ok",
                 'message' => "form submitted correctly"
             ]);

        return $response;   
    }
}

Wenn ich auf die Schaltfläche klicke, erhalte ich:

{"error": true, "message": "Ungültiger Formularschlüssel. Bitte aktualisieren Sie die Seite."}

Antworten

3 HamendraSunthwal Sep 07 2020 at 15:54

Versuche dies

Fügen Sie Ihrem Formular einen Formularschlüssel hinzu

<input name="form_key" type="hidden" value="<?php echo $block->getFormKey();?>">

Um die Controller-URL zu erhalten.

$this->getUrl(" ");
Msquare Sep 07 2020 at 16:41

Versuche dies

<?php

$get_url = $this->getUrl("pricing/controller/savefamilypricechanges");

//use this type of name adminroutename/admincontrolername/actionfilename 

?>

<script type="text/javascript">
    require(["jquery"],function($) { $('#savePricing').click(function() {
            var customurl = "<?= $get_url ?>"; $.ajax({
                url: customurl,
                type: 'POST',
                dataType: 'json',
                data: {},
            complete: function(response) {             
                var status = response.responseJSON.status;       
                console.log(status);   
                },
                error: function (xhr, status, errorThrown) {
                    console.log('Error happens. Try again.');
                }
            });
        });
    });
</script>

Aktualisieren

<?php
namespace XX\Pricing\Controller;

use Magento\Framework\Controller\Result\JsonFactory;
use Magento\Customer\Model\Session;

/**
 * Class SaveFamilyPriceChanges
 * @package XX\Pricing\Controller
 */
class SaveFamilyPriceChanges extends \Magento\Framework\App\Action\Action
{
    /**
     * @var JsonFactory
     */
    private $resultJsonFactory; /** * @var Session */ private $customerSession;

    private $formKey; /** * @param JsonFactory $resultJsonFactory
     */
    public function __construct(
        JsonFactory $resultJsonFactory, \Magento\Framework\Data\Form\FormKey $formKey,
        Session $customerSession ) { $this->resultJsonFactory = $resultJsonFactory; $this->formKey = $formKey; $this->customerSession = $customerSession; } /** * @return \Magento\Framework\App\ResponseInterface|\Magento\Framework\Controller\Result\Json|\Magento\Framework\Controller\ResultInterface */ public function execute() { $formkey = $this->formKey->getFormKey(); $response = $this->resultFactory ->create(\Magento\Framework\Controller\ResultFactory::TYPE_JSON) ->setData([ 'form_key' => $formkey,
                 'status'  => "ok",
                 'message' => "form submitted correctly"

             ]);

        return $response;   
    }
}

Ich hoffe das hilft dir.