Comment puis-je ajouter un bouton dans la section de configuration du backend de Magento 2 et appeler une méthode PHP simple lorsque l'on clique sur le bouton?
Cet appel de méthode peut être un appel AJAX.
Nous allons décrire la solution en utilisant notre module Others Also Bought comme exemple, où MageWorx - un nom de fournisseur et AlsoBought - un nom de module:
Tout d'abord, vous devez ajouter votre bouton en tant que champ dans le fichier de configuration. (mageworx_collect comme exemple):
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>
Pour dessiner ce bouton de champ, le modèle frontal MageWorx\AlsoBought\Block\System\Config\Collect
sera utilisé. Créez-le:
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();
}
}
?>
Il s'agit d'un modèle de champ typique. Le bouton est dessiné en utilisant la getButtonHtml()
méthode. Utilisez la getAjaxUrl()
méthode pour obtenir une URL.
Ensuite, vous aurez besoin du modèle:
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>
Vous devrez réécrire la partie du code selon vos besoins mais je le laisserai comme exemple. La méthode de demande Ajax onCreate
et onSuccess
devrait répondre à vos besoins. Vous pouvez également supprimer l' <span class="collect-indicator" id="collect_span">
élément. Nous l'utilisons pour afficher le chargement (spinner) et le résultat de l'action.
De plus, vous aurez besoin d'un contrôleur, où toutes les opérations requises seront traitées, et d'un routeur.
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 Voici l'exemple de travail de notre module MageWorx Others Also Bought . Si vous souhaitez l'étudier, vous pouvez le télécharger gratuitement.
Controller/Adminhtml/System/Config/Collection.php
?Vous le vérifiez également dans le fournisseur / magento / module-customer / etc / adminhtml / system.xml pour le bouton. Sous le code, vérifiez-le dans le chemin ci-dessus. Créez frontend_model comme ce vendeur / magento / module-customer / Block / Adminhtml / System / Config / Validatevat.php .
Chemin ci-dessus pour votre référence. Maintenant, créez un module adapté à votre propre module.
la source
Pour ajouter un bouton dans la configuration du système et exécuter une fonction personnalisée, vous devez créer
frontend_model
pour rendre votre bouton. Dans le modèle defrontend_model
, vous pouvez écrire votre logique ajax.Voici un exemple:
Cette classe sera responsable du rendu du bouton html.
getButtonHtml()
La fonction générera le bouton html.Ici, nous avons notre
frontend_model
bouton de rendu. Maintenant, nous devons créer une classe de contrôleur qui gérera notre demande ajax.Nous avons une fonction
getAjaxSyncUrl()
dans notrefrontend_model
qui renverra l'url de ce contrôleur. En outre, il est variable$_template
dansfrontend_model
qui détient le chemin de notre fichier de modèle pour notre moteur de rendu.Vous pouvez voir dans le modèle, en cliquant sur le bouton, il déclenchera une requête ajax vers le contrôleur défini dans
forntend_model
.J'espère que cela aidera.
la source
Vous devez définir personnalisé
frontend_model
pour le champ de rendu personnalisé dans la configuration. Vous pouvez obtenir de l'aide à partir de ce lien .la source
Pour créer un bouton dans la section de configuration du backend, vous devez effectuer ces étapes:
Étape 1: Ajouter un champ est un bouton dans un fichier
system.xml
comme ces scripts:Étape 2: Créer un bouton système
Block
:Créer un fichier
Namspace\Module\Block\System\Config\Button.php
:Étape 3: créer un fichier
view/adminhtml/templates/system/config/button.phtml
:la source