Bagaimana saya bisa menambahkan tombol di bagian konfigurasi backend Magento 2 dan memanggil metode PHP sederhana ketika mengklik tombol?
Panggilan metode ini bisa menjadi panggilan AJAX.
Kami akan menjelaskan solusinya dengan menggunakan modul Lain Juga Membeli kami sebagai contoh, di mana MageWorx - nama vendor dan AlsoBought - nama modul:
Pertama, Anda perlu menambahkan tombol Anda sebagai bidang dalam file konfigurasi. (mageworx_collect sebagai contoh):
app / code / MageWorx / AlsoBought / etc / adminhtml / system.xml
<?xml version="1.0"?>
<!--
/**
* Copyright © 2016 MageWorx. All rights reserved.
* See LICENSE.txt for license details.
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Config:etc/system_file.xsd">
<system>
<tab id="mageworx" sortOrder="2001">
<label>MageWorx</label>
</tab>
<section id="mageworx_alsobought" translate="label" type="text" sortOrder="100" showInDefault="1" showInWebsite="1" showInStore="0">
<label>Also Bought</label>
<tab>mageworx</tab>
<resource>MageWorx_AlsoBought::config</resource>
<group id="general" translate="label" type="text" sortOrder="10" showInDefault="1" showInWebsite="1" showInStore="1">
<label>General</label>
<field id="mageworx_collect" translate="label comment" type="button" sortOrder="10" showInDefault="1" showInWebsite="1" showInStore="0">
<frontend_model>MageWorx\AlsoBought\Block\System\Config\Collect</frontend_model>
<label>Collect all available data (in separate table)</label>
</field>
</group>
</section>
</system>
</config>
Untuk menggambar tombol-bidang ini, model frontend MageWorx\AlsoBought\Block\System\Config\Collect
akan digunakan. Menciptakannya:
app / code / MageWorx / AlsoBought / Block / System / Config / Collect.php
<?php
/**
* Copyright © 2016 MageWorx. All rights reserved.
* See LICENSE.txt for license details.
*/
namespace MageWorx\AlsoBought\Block\System\Config;
use Magento\Backend\Block\Template\Context;
use Magento\Config\Block\System\Config\Form\Field;
use Magento\Framework\Data\Form\Element\AbstractElement;
class Collect extends Field
{
/**
* @var string
*/
protected $_template = 'MageWorx_AlsoBought::system/config/collect.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 collect button
*
* @return string
*/
public function getAjaxUrl()
{
return $this->getUrl('mageworx_alsobought/system_config/collect');
}
/**
* Generate collect button html
*
* @return string
*/
public function getButtonHtml()
{
$button = $this->getLayout()->createBlock(
'Magento\Backend\Block\Widget\Button'
)->setData(
[
'id' => 'collect_button',
'label' => __('Collect Data'),
]
);
return $button->toHtml();
}
}
?>
Ini adalah model lapangan yang khas. Tombol ditarik menggunakan getButtonHtml()
metode. Gunakan getAjaxUrl()
metode untuk mendapatkan URL.
Kemudian, Anda membutuhkan templat:
app / code / MageWorx / AlsoBought / view / adminhtml / templates / system / config / collect.phtml
<?php
/**
* Copyright © 2016 MageWorx. All rights reserved.
* See LICENSE.txt for license details.
*/
?>
<?php /* @var $block \MageWorx\AlsoBought\Block\System\Config\Collect */ ?>
<script>
require([
'jquery',
'prototype'
], function(jQuery){
var collectSpan = jQuery('#collect_span');
jQuery('#collect_button').click(function () {
var params = {};
new Ajax.Request('<?php echo $block->getAjaxUrl() ?>', {
parameters: params,
loaderArea: false,
asynchronous: true,
onCreate: function() {
collectSpan.find('.collected').hide();
collectSpan.find('.processing').show();
jQuery('#collect_message_span').text('');
},
onSuccess: function(response) {
collectSpan.find('.processing').hide();
var resultText = '';
if (response.status > 200) {
resultText = response.statusText;
} else {
resultText = 'Success';
collectSpan.find('.collected').show();
}
jQuery('#collect_message_span').text(resultText);
var json = response.responseJSON;
if (typeof json.time != 'undefined') {
jQuery('#row_mageworx_alsobought_general_collect_time').find('.value .time').text(json.time);
}
}
});
});
});
</script>
<?php echo $block->getButtonHtml() ?>
<span class="collect-indicator" id="collect_span">
<img class="processing" hidden="hidden" alt="Collecting" style="margin:0 5px" src="<?php echo $block->getViewFileUrl('images/process_spinner.gif') ?>"/>
<img class="collected" hidden="hidden" alt="Collected" style="margin:-3px 5px" src="<?php echo $block->getViewFileUrl('images/rule_component_apply.gif') ?>"/>
<span id="collect_message_span"></span>
</span>
Anda harus menulis ulang bagian kode sesuai dengan kebutuhan Anda, tetapi saya akan meninggalkannya sebagai contoh. Metode permintaan Ajax onCreate
dan onSuccess
harus sesuai dengan kebutuhan Anda. Anda juga dapat menghapus <span class="collect-indicator" id="collect_span">
elemen. Kami menggunakannya untuk menampilkan pemuatan (pemintal) dan hasil dari tindakan.
Selain itu, Anda akan memerlukan pengontrol, tempat semua operasi yang diperlukan akan diproses, dan router.
app / code / MageWorx / AlsoBought / etc / adminhtml / routes.xml
<?xml version="1.0"?>
<!--
/**
* Copyright © 2016 MageWorx. All rights reserved.
* See LICENSE.txt for license details.
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
<router id="admin">
<route id="mageworx_alsobought" frontName="mageworx_alsobought">
<module name="MageWorx_AlsoBought" before="Magento_Backend" />
</route>
</router>
</config>
app / code / MageWorx / AlsoBought / Controller / Adminhtml / System / Config / Collect.php
<?php
/**
* Copyright © 2016 MageWorx. All rights reserved.
* See LICENSE.txt for license details.
*/
namespace MageWorx\AlsoBought\Controller\Adminhtml\System\Config;
use Magento\Backend\App\Action;
use Magento\Backend\App\Action\Context;
use Magento\Framework\Controller\Result\JsonFactory;
use MageWorx\AlsoBought\Helper\Data;
class Collect extends Action
{
protected $resultJsonFactory;
/**
* @var Data
*/
protected $helper;
/**
* @param Context $context
* @param JsonFactory $resultJsonFactory
* @param Data $helper
*/
public function __construct(
Context $context,
JsonFactory $resultJsonFactory,
Data $helper
)
{
$this->resultJsonFactory = $resultJsonFactory;
$this->helper = $helper;
parent::__construct($context);
}
/**
* Collect relations data
*
* @return \Magento\Framework\Controller\Result\Json
*/
public function execute()
{
try {
$this->_getSyncSingleton()->collectRelations();
} catch (\Exception $e) {
$this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e);
}
$lastCollectTime = $this->helper->getLastCollectTime();
/** @var \Magento\Framework\Controller\Result\Json $result */
$result = $this->resultJsonFactory->create();
return $result->setData(['success' => true, 'time' => $lastCollectTime]);
}
/**
* Return product relation singleton
*
* @return \MageWorx\AlsoBought\Model\Relation
*/
protected function _getSyncSingleton()
{
return $this->_objectManager->get('MageWorx\AlsoBought\Model\Relation');
}
protected function _isAllowed()
{
return $this->_authorization->isAllowed('MageWorx_AlsoBought::config');
}
}
?>
PS Ini adalah contoh kerja dari modul MageWorx Others Also Bought kami . Jika Anda ingin mempelajarinya, Anda dapat mengunduhnya secara gratis.
Controller/Adminhtml/System/Config/Collection.php
?Anda memeriksanya juga di tombol vendor / magento / module-customer / etc / adminhtml / system.xml . Kode di bawah ini periksa di jalur di atas. Buat frontend_model seperti ini vendor / magento / module-customer / Block / Adminhtml / System / Config / Validatevat.php .
Jalur di atas untuk referensi Anda. Sekarang buat yang sesuai untuk modul Anda sendiri.
sumber
Untuk menambahkan tombol dalam konfigurasi sistem dan menjalankan fungsi kustom, Anda harus membuat
frontend_model
untuk membuat tombol Anda. Dalam templatefrontend_model
, Anda dapat menulis logika ajax Anda.Berikut ini sebuah contoh:
Kelas ini akan bertanggung jawab untuk rendering tombol html.
getButtonHtml()
fungsi akan menghasilkan tombol html.Di sini, kami punya kami
frontend_model
untuk membuat tombol. Sekarang, kita perlu membuat kelas controller yang akan menangani permintaan ajax kita.Kami memiliki fungsi
getAjaxSyncUrl()
di kamifrontend_model
yang akan mengembalikan url controller ini. Juga, ada variabel$_template
dalamfrontend_model
yang menyimpan path file templat kami untuk penyaji kami.Anda dapat melihat di template, pada klik tombol, itu akan memicu permintaan ajax ke controller yang ditentukan dalam
forntend_model
.Saya harap ini akan membantu.
sumber
Anda perlu menentukan kustom
frontend_model
untuk bidang render khusus dalam konfigurasi. Anda dapat mengambil bantuan dari tautan ini .sumber
Untuk membuat tombol di bagian konfigurasi backend, Anda perlu melakukan langkah-langkah ini:
Langkah 1: Tambahkan bidang is button dalam file
system.xml
seperti skrip ini:Langkah 2: Buat tombol sistem
Block
:Buat file
Namspace\Module\Block\System\Config\Button.php
:Langkah 3: Buat file
view/adminhtml/templates/system/config/button.phtml
:sumber