Magento 2: Ошибка 404 при запросе ajax
Я проверил это и построил контроллер, который выполняет запрос ajax, отправленный на adminhtml через кнопку, но я получаю ошибку 404 на своей консоли.
СООБЩЕНИЕ http://myurl/system_config/customAjax/key/ade007809d7e313c38d42de6c2fa64ad8/?isAjax=true 404 (Запрещено)
Я не думаю, что вам следует обращать много внимания на слово "Запрещено", так как это открытый вопрос в их репо, и я думаю, что это будет исправлено. Важное дело в том, что ошибка 404, и почему она не вызывает мой контроллер. Есть какие-нибудь идеи?
Etc\adminhtml\system.xml :
<field id="vendor_actionbutton" type="button" sortOrder="26" showInDefault="1" showInWebsite="1" showInStore="0">
<frontend_model>Vendor\Module\Block\Adminhtml\System\Config\Mybutton</frontend_model>
</field>
Block\Adminhtml\System\Config\Mybutton.php :
<?php
namespace Vendor\Module\Block\Adminhtml\System\Config;
use Magento\Backend\Block\Template\Context;
use Magento\Config\Block\System\Config\Form\Field;
use Magento\Framework\Data\Form\Element\AbstractElement;
class Mybutton extends Field
{
/**
* @var string
*/
protected $_template = 'Vendor_Module::system/config/customajax.phtml';
/**
* @param Context $context
* @param array $data
*/
public function __construct(
Context $context,
array $data = []
) {
parent::__construct($context, $data);
}
/**
* Remove scope label
*
* @param AbstractElement $element
* @return string
*/
public function render(AbstractElement $element)
{
$element->unsScope()->unsCanUseWebsiteValue()->unsCanUseDefaultValue();
return parent::render($element);
}
/**
* Return element html
*
* @param AbstractElement $element
* @return string
*/
protected function _getElementHtml(AbstractElement $element)
{
return $this->_toHtml();
}
/**
* Return ajax url for send button
*
* @return string
*/
public function getAjaxUrl()
{
return $this->getUrl('vendor_module/system_config/customAjax');
}
/**
* Generate send button html
*
* @return string
*/
public function getButtonHtml()
{
$button = $this->getLayout()->createBlock(
'Magento\Backend\Block\Widget\Button'
)->setData(
[
'id' => 'send_button',
'label' => __('Send'),
]
);
return $button->toHtml();
}
}
Controller\Adminhtml\System\Adminhtml\System\Config\CustomAjax.php :
<?php
namespace Vendor\Module\Controller\Adminhtml\System\Config;
class CustomAjax extends \Magento\Backend\App\Action
{
/**
* @var \Magento\Framework\Controller\Result\JsonFactory
*/
protected $resultJsonFactory;
public function __construct(
\Magento\Backend\App\Action\Context $context,
\Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory
)
{
parent::__construct($context);
$this->resultJsonFactory= $resultJsonFactory;
}
public function execute()
{
$params = $this->getRequest()->getParams();
$resultJson = $this->resultJsonFactory->create();
return $resultJson->setData([
'messages' => 'Successfully. Params: ' . json_encode($params),
'error' => false
]);
}
}
Просмотр\adminhtml\шаблоны\система\конфигурация\customajax.phtml:
<script>
require([
'jquery',
'prototype'
], function(jQuery){
var sendSpan = jQuery('#send_span');
jQuery('#send_button').click(function () {
var params = {};
new Ajax.Request('<?php echo $block->getAjaxUrl() ?>', {
parameters: params,
loaderArea: false,
asynchronous: true
});
});
</script>
<?php echo $block->getButtonHtml() ?>
<span class="send-indicator" id="send_span">
<img class="processing" hidden="hidden" alt="Sending" style="margin:0 5px" src="<?php echo $block->getViewFileUrl('images/process_spinner.gif') ?>"/>
<img class="sent" hidden="hidden" alt="Sended" style="margin:-3px 5px" src="<?php echo $block->getViewFileUrl('images/rule_component_apply.gif') ?>"/>
<span id="send_message_span"></span>
</span>
Etc\adminhtml\routes.xml :
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
<router id="admin">
<route id="module" frontName="module">
<module name="Vendor_Module" before="Magento_Backend" />
</route>
</router>
</config>
Может быть, это это vendor_module/system_config/customAjax
неправильно? Должен ли я написать это по-другому? (Я видел другой модуль, работающий с этим выражением, хотя)
3 answers
Я думаю, что вам не хватает вашего файла routes.xml
в app/code/Vendor/Module/etc/adminhtml/routes.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
<router id="admin">
<route id="vendor_module" frontName="vendor_module">
<module name="Vendor_Module" />
</route>
</router>
</config>
Я столкнулся с той же проблемой - получил ошибку 404 на пользовательском контроллере ajax.
Мой URL-адрес контроллера ajax извлекается с помощью
$urlBuilder->getUrl('<frontname>/<action>');
И мой файл контроллера находился в расположении
<module files>/Controller/Adminhtml/<Action.php>
После нескольких часов отладки я обнаружил, что полный путь, который Magento 2 создает для запросов ajax администратора, равен
<vendor>\<module>\controller\adminhtml\<action>\index
Затем я переместил свой файл контроллера в раздел:
<module files>/Controller/Adminthtml/<Action>/Index.php
Ошибка была устранена - надеюсь, это кому-то поможет иначе!
Я не знаю, как это возможно, но у меня была та же ошибка, и я исправил ее, добавив в контроллер
/**
* Array of actions which can be processed without secret key validation
*
* @var string[]
*/
protected $_publicActions = ['test'];
И он начинает работать, но теперь он продолжает работать, даже если $_publicactions удален или закомментирован.