Как отправить 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>
4 answers
Я перепробовал все вышеперечисленные методы, но ни один из них не работает или не завершен, поэтому я решил ответить на него подробно: Ниже будет приведена минимальная схема модуля
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, например, в следующем
Я использовал 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>
Сначала вам нужно включить 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);
});
});
Я не знаю, почему, но запросы 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);
}
}
Я надеюсь, что это поможет вам или кому-то еще.
Добавьте свой файл контроллера в
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']);
}