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 неправильно? Должен ли я написать это по-другому? (Я видел другой модуль, работающий с этим выражением, хотя)

Author: Irini Koutaki, 2017-09-05

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>
 0
Author: Murtuza Zabuawala, 2017-09-06 06:31:48

Я столкнулся с той же проблемой - получил ошибку 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

Ошибка была устранена - надеюсь, это кому-то поможет иначе!

 1
Author: Genevieve, 2017-11-14 04:08:33

Я не знаю, как это возможно, но у меня была та же ошибка, и я исправил ее, добавив в контроллер

/**
 * Array of actions which can be processed without secret key validation
 *
 * @var string[]
 */
protected $_publicActions = ['test'];

И он начинает работать, но теперь он продолжает работать, даже если $_publicactions удален или закомментирован.

 0
Author: LucScu, 2018-02-20 09:26:40