我正在尝试通过Magento 2管理区域中的AJAX访问URL。我尝试了很多东西,但每次回复都是404禁止。
这是我模块的代码:
供应商/模块的/ etc / module.xml
<?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="Vendor_Module" setup_version="1.0.0">
</module>
</config>
供应商/模块的/ 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="adminhtml">
<module name="Vendor_Module" before="Magento_Backend" />
</route>
</router>
</config>
使用Prototype的AJAX JS代码:
new Ajax.Request('<?php /* @escapeNotVerified */ echo $block->getAdminUrl(); ?>adminhtml/action/add', {
method: 'post',
parameters: {'order_id' : <?php /* @escapeNotVerified */ echo $block->getOrderId(); ?>},
onSuccess: function(response) {
console.log($response);
this.add();
}.bind(this)
});
供应商/模块/控制器/ Adminhtml /动作/ Add.php
<?php
namespace Vendor\Module\Controller\Adminhtml\Action;
class Add extends \Magento\Backend\App\Action
{
protected $_context;
protected $_pageFactory;
protected $_jsonEncoder;
public function __construct(
\Magento\Backend\App\Action\Context $context,
\Magento\Framework\Json\EncoderInterface $encoder,
\Magento\Framework\View\Result\PageFactory $pageFactory
) {
$this->_context = $context;
$this->_pageFactory = $pageFactory;
$this->_jsonEncoder = $encoder;
parent::__construct($context);
}
public function execute()
{
$response = array('status' => 'success');
$this->getResponse()->representJson($this->_jsonEncoder->encode($response));
return;
}
}
请告诉我如何通过AJAX访问此管理员网址。
答案 0 :(得分:0)
<?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="adminhtml" frontName="xyz">
<module name="Vendor_Module" before="Magento_Backend" />
</route>
</router>
</config>
我坚信,路由配置文件中缺少frontName是弹出错误404的原因,因此请用上面指定的frontName替换xyz
答案 1 :(得分:0)
我已经尝试了上述所有方法,但是没有一个是有效的或不完整的,因此我决定详细回答: 以下是模块最小图
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变量,它将保存您的模块网址,您可以在如下所示的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="Textmimedia_Partpicker::js.phtml"
name="custom_js_backend"/>
</referenceContainer>
</body>
</page>
现在在js.phtml中声明操作网址,如下所示:
<script>
require([
"prototype"
], function () {
window.gpImageTagSaveUrl = '<?= /** @noEscape */ $block->getUrl('groupproduct/imagetag/save')?>';
});
</script>