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.