Как отправить AJAX-запрос АДМИНИСТРАТОРУ?


Мне нужно получить некоторую информацию с моего пользовательского контроллера администратора с помощью AJAX. Но когда используется AJAX, я получаю всю текущую страницу HTML!

Я просто хочу получить некоторые JSON данные с моего пользовательского контроллера. Это я осуществлю позже.

Я вызываю свой пользовательский контроллер из блока в этом

URL .../admin/admin/order_shipment/new/order_id/...

Вот мой вызов ajax

 var param = 'form_key='+window.FORM_KEY;
         $.ajax({
                 showLoader: true,
                 url: "admin/PostaPlus/PostaPlusShipping/HSCodes",
                 data: param,
                 type: "POST",
                // dataType: 'json'
                }).done(function (data) {                        
                    alert(data);                        
                    console.log(data);
                 });

Вот мои пользовательские коды контроллера,

<?php
 namespace PostaPlus\PostaPlusShipping\Controller\Adminhtml;
 use Magento\Backend\App\Action;

 class HSCodes extends \Magento\Backend\App\Action
{

   protected $resultJsonFactory;

   public function __construct(
        \Magento\Backend\App\Action\Context $context,
        \Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory 
        )
  {
    parent::__construct($context);
    $this->resultFactory = $resultJsonFactory;
  }

  public function execute()
  {
    //return $this->resultJsonFactory->create()->setData(['a' => 'b']);
    return 'test string';
  }

  public function indexAction(){

    //echo 'test string';
  }
}

Вот мой файл маршрута,

<?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_hs_codes">
      <route id="PostaPlus" frontName="PostaPlus">
        <module name="PostaPlus_PostaPlusShipping"/>
      </route>
    </router>
 </config>
Author: PЯINCƏ, 2017-02-08

4 answers

Я перепробовал все вышеперечисленные методы, но ни один из них не работает или не завершен, поэтому я решил ответить на него подробно: Ниже будет приведена минимальная схема модуля

enter image description here

1)

<?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 frontName="groupproduct" id="groupproduct">
            <module before="Magento_Backend" name="Textmimedia_Partpicker"/>
        </route>
    </router>
</config>

2)

<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Levosoft_Partpicker" setup_version="1.0.0"/>
</config>

3) Необходимо объявить маршрутизатор администратора

    <?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 frontName="groupproduct" id="groupproduct">
            <module before="Magento_Backend" name="Levosoft_Partpicker"/>
        </route>
    </router>
</config>

4)

<?php


namespace Levosoft\Partpicker\Controller\Adminhtml\Imagetag;

/**
 * Class Save
 *
 * @package Levosoft\Partpicker\Controller\Adminhtml\Imagetag
 */
class Save extends \Magento\Backend\App\Action
{

    protected $resultPageFactory;
    protected $jsonHelper;

    /**
     * Constructor
     *
     * @param \Magento\Backend\App\Action\Context  $context
     * @param \Magento\Framework\Json\Helper\Data $jsonHelper
     */
    public function __construct(
        \Magento\Backend\App\Action\Context $context,
        \Magento\Framework\View\Result\PageFactory $resultPageFactory,
        \Magento\Framework\Json\Helper\Data $jsonHelper,
        \Psr\Log\LoggerInterface $logger
    ) {
        $this->resultPageFactory = $resultPageFactory;
        $this->jsonHelper = $jsonHelper;
        $this->logger = $logger;
        parent::__construct($context);
    }

    /**
     * Execute view action
     *
     * @return \Magento\Framework\Controller\ResultInterface
     */
    public function execute()
    {
        try {
            return $this->jsonResponse('your response');
        } catch (\Magento\Framework\Exception\LocalizedException $e) {
            return $this->jsonResponse($e->getMessage());
        } catch (\Exception $e) {
            $this->logger->critical($e);
            return $this->jsonResponse($e->getMessage());
        }
    }

    /**
     * Create json response
     *
     * @return \Magento\Framework\Controller\ResultInterface
     */
    public function jsonResponse($response = '')
    {
        return $this->getResponse()->representJson(
            $this->jsonHelper->jsonEncode($response)
        );
    }
}

Теперь клиентская часть, которая на самом деле немного сложна, я называю ее в файле js, как somefilename.js

var ajaxRequest;
                var saveUrl = gpImageTagSaveUrl+'?isAjax=true'; //module url declared globally in module;

                ajaxRequest = $.ajax({
                    showLoader: true,
                    url: saveUrl,
                    data: {form_key: window.FORM_KEY},
                    type: 'POST',
                    dataType: 'json',
                    beforeSend: function () {
                        $('#loader').show();
                    }
                });
                //Show successfully for submit message
                ajaxRequest.done(function (response, textStatus, jqXHR) {
                    $("#ajaxResponse").html(response);
                    $('#loader').hide();
                });

                //On failure of request this function will be called
                ajaxRequest.fail(function () {
                    //show error
                    $("#ajaxResponse").html('Oops, An error occured, please' +
                        ' try again later!');
                    $('#loader').hide();
                });

gpImageTagSaveUrl является ли переменная globel, которая будет содержать URL-адрес ваших модулей вы можете объявить в каком-нибудь файле js, например, в следующем

enter image description here

Я использовал catalog_product_edit.xml файл, потому что я хочу, чтобы он находился в месте редактирования продукта, вы можете добавить его в необходимый файл или в default.xml если требуется для всех.

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="admin-1column"
      xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceContainer name="js">
            <block class="Magento\Backend\Block\Template" template="Levosoft_Partpicker::js.phtml"
                   name="custom_js_backend"/>
        </referenceContainer>
    </body>
</page>

Теперь в js.phtml объявите URL-адрес действия следующим образом:

<script>
    require([
        "prototype"
    ], function () {
        window.gpImageTagSaveUrl = '<?= /** @noEscape */ $block->getUrl('groupproduct/imagetag/save')?>';
    });
</script>
 0
Author: Hassan Ali Shahzad, 2020-04-15 19:25:04

Сначала вам нужно включить jquery. Используйте это для кода, чтобы сделать это:

require([
    "jquery"
], function ($) {
     //your code to send ajax request here
    $.ajax({
        showLoader: true, 
        url: "admin/PostaPlus/PostaPlusShipping/HSCodes", 
        data: param,
        type: "POST", 
        dataType: 'json'
    }).done(function (data) { 
        alert(data); console.log(data); 
    });
});
 1
Author: magento noob, 2017-06-21 14:28:11

Я не знаю, почему, но запросы Ajax администратора в любом случае передаются только GET для меня.

У меня была та же проблема, что и у вас, и я решил свою проблему с передачей запроса в GET, и это работает правильно.

Еще одна очень важная вещь - отключить секретный ключ администратора в URL, иначе вы не сможете получить доступ к своему контроллеру.

Вы можете удалить его в : Stores > Configuration > Advanced > Admin > security > Add Secret Key to URLs > No.

Также вы должны использовать dataType: 'json', чтобы не возвращать html-код ответ.

Пример AJAX администратора:

Adminhtml/шаблоны/файл.phtml

    require(['jquery', 'jquery/ui'], function($){
        var ajaxRequest;
        ajaxRequest = jQuery.ajax({
            url: "<?php echo $this->getUrl('adminrouter/folder/index'); ?>",
            type: 'GET',
            data: {id : 1}, //exemple
            dataType: 'json',
            beforeSend: function () {
                jQuery('#loader').show();
            }
        });
            //Show successfully for submit message
        ajaxRequest.done(function (response, textStatus, jqXHR) {
            jQuery("#ajaxResponse").html(response);
            jQuery('#loader').hide();
        });

            //On failure of request this function will be called
        ajaxRequest.fail(function () {
            //show error
            jQuery("#ajaxResponse").html('Oops, An error occured, please try again later!');
            jQuery('#loader').hide();
        });
    });

Приложение/код/{Поставщик}/{Модуль}/Controller/Adminhtml/Folder/Index.php

<?php
namespace Vendor\Module\Controller\Adminhtml\Folder;

use Magento\Backend\App\Action\Context;
use Magento\Framework\View\Result\PageFactory;
use Magento\Backend\App\Action;
use Magento\Framework\Controller\ResultFactory;

class Index extends Action
{
    protected $logger;

    public function __construct(
        \Magento\Backend\App\Action\Context $context
        ,\Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory,
        \Psr\Log\LoggerInterface $logger
    ) {
        parent::__construct($context);
        $this->resultJsonFactory = $resultJsonFactory;
        $this->logger = $logger;
    }

    /**
     * @return \Magento\Framework\Controller\Result\Json
     */
    public function execute() {

        //get AjaxQuery params, GET method !
        $params = $this->getRequest()->getParams();
        $this->logger->info($params); // For debug
        \Zend_Debug::dump($params);   // For debug

        //Send response to Ajax query
        $data = 200;
        $result = $this->resultJsonFactory->create();
        return $result->setData($data);
    }
}

Я надеюсь, что это поможет вам или кому-то еще.

 1
Author: PЯINCƏ, 2018-06-25 22:21:42

Добавьте свой файл контроллера в

PostaPlus\PostaPlusShipping\Controller\Adminhtml\PostaPlusShipping\HSCodes.php

Теперь ваш URL-адрес ajax - это имя маршрута\контроллер\действие

Postaplus\Доставка по почте\HSCODES

Добавить код ajax

var param = 'ajax=1';
     $.ajax({
       showLoader: true,
       url: YOUR_URL_HERE,
       data: param,
       type: "POST",
       dataType: 'json'
         }).done(function (data) {
            console.log(data);
      });

Метод выполнения контроллера изменений

public function execute()
  {
    return $this->resultJsonFactory->create()->setData(['a' => 'b']);
  }
 0
Author: Prashant Valanda, 2017-02-08 09:30:23