¿Cómo puedo agregar un botón en la sección de configuración del backend de Magento 2 y llamar a un método PHP simple cuando hago clic en el botón?
Esta llamada al método puede ser una llamada AJAX.
Describiremos la solución utilizando nuestro módulo Otros también comprados como ejemplo, donde MageWorx - un nombre de proveedor y AlsoBought - un nombre de módulo:
Primero, debe agregar su botón como campo en el archivo de configuración. (mageworx_collect como ejemplo):
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>
Para dibujar este botón de campo MageWorx\AlsoBought\Block\System\Config\Collect
se utilizará el modelo de interfaz . Créalo:
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();
}
}
?>
Este es un modelo de campo típico. El botón se dibuja utilizando el getButtonHtml()
método Use el getAjaxUrl()
método para obtener una URL.
Entonces, necesitará la plantilla:
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>
Tendrá que volver a escribir la parte del código de acuerdo con sus necesidades, pero lo dejaré como ejemplo. El método de solicitud de Ajax onCreate
y onSuccess
debe adaptarse a sus necesidades. Además, puede eliminar el <span class="collect-indicator" id="collect_span">
elemento. Lo usamos para mostrar la carga (spinner) y el resultado de la acción.
Además, necesitará un controlador, donde se procesarán todas las operaciones requeridas, y un enrutador.
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');
}
}
?>
PD Este es el ejemplo de trabajo de nuestro módulo MageWorx Otros también comprados . Si quieres estudiarlo, puedes descargarlo gratis.
Controller/Adminhtml/System/Config/Collection.php
?También puede verificarlo en vendor / magento / module-customer / etc / adminhtml / system.xml para el botón. Debajo del código, verifíquelo en la ruta anterior Cree frontend_model como este vendor / magento / module-customer / Block / Adminhtml / System / Config / Validatevat.php .
Por encima del camino para su referencia. Ahora cree apropiado para su propio módulo.
fuente
Para agregar un botón en la configuración del sistema y ejecutar una función personalizada, debe crear
frontend_model
para representar su botón. En la plantilla defrontend_model
, puede escribir su lógica ajax.Aquí hay un ejemplo:
Esta clase será responsable de representar el botón html.
getButtonHtml()
La función generará el botón html.Aquí, tenemos nuestro
frontend_model
botón de renderizado. Ahora, necesitamos crear una clase de controlador que maneje nuestra solicitud ajax.Tenemos una función
getAjaxSyncUrl()
en nuestrafrontend_model
que devolverá la url de este controlador. Además, no es variable$_template
en lafrontend_model
que se contiene la ruta de nuestro archivo de plantilla para nuestro procesador.Puede ver en la plantilla, al hacer clic en el botón, activará una solicitud ajax para el controlador definido en
forntend_model
.Espero que sea de ayuda.
fuente
Debe definir personalizado
frontend_model
para el campo de representación personalizado en la configuración. Puedes recibir ayuda de este enlace .fuente
Para crear un botón en la sección de configuración de back-end, debe seguir estos pasos:
Paso 1: Agregar un campo es un botón en un archivo
system.xml
como estos scripts:Paso 2: Crear botón del sistema
Block
:Crear archivo
Namspace\Module\Block\System\Config\Button.php
:Paso 3: Crear archivo
view/adminhtml/templates/system/config/button.phtml
:fuente