Wie kann ich eine Schaltfläche im Magento 2-Backend-Konfigurationsabschnitt hinzufügen und eine einfache PHP-Methode aufrufen, wenn ich auf die Schaltfläche klicke?
Dieser Methodenaufruf kann ein AJAX-Aufruf sein.
Wir werden die Lösung anhand unseres Moduls "Andere auch gekauft" als Beispiel beschreiben, wobei MageWorx - ein Anbietername und AlsoBought - ein Modulname:
Zunächst müssen Sie Ihre Schaltfläche als Feld in die Konfigurationsdatei einfügen. (mageworx_collect als Beispiel):
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>
Zum Zeichnen dieser Feldschaltfläche wird das Frontend-Modell MageWorx\AlsoBought\Block\System\Config\Collect
verwendet. Erstelle es:
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();
}
}
?>
Dies ist ein typisches Feldmodell. Die Schaltfläche wird mit der getButtonHtml()
Methode gezeichnet . Verwenden Sie die getAjaxUrl()
Methode, um eine URL abzurufen.
Dann benötigen Sie die Vorlage:
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>
Sie müssen den Teil des Codes entsprechend Ihren Anforderungen neu schreiben, aber ich werde ihn als Beispiel belassen. Die Ajax-Anforderungsmethode onCreate
und onSuccess
sollte Ihren Anforderungen entsprechen. Sie können das <span class="collect-indicator" id="collect_span">
Element auch entfernen . Wir verwenden es, um das Laden (Spinner) und das Ergebnis der Aktion anzuzeigen.
Außerdem benötigen Sie einen Controller, auf dem alle erforderlichen Vorgänge verarbeitet werden, und einen Router.
app / code / MageWorx / AlsoBought / etc / adminhtml / route.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 Dies ist das Arbeitsbeispiel aus unserem MageWorx- Modul " Andere haben auch gekauft" . Wenn Sie es studieren möchten, können Sie es kostenlos herunterladen.
Controller/Adminhtml/System/Config/Collection.php
?Sie überprüfen es auch in der Schaltfläche vendor / magento / module-customer / etc / adminhtml / system.xml für. Unterhalb des Codes überprüfen Sie es im obigen Pfad. Erstellen Sie ein Frontend- Modell wie dieses: vendor / magento / module-customer / Block / Adminhtml / System / Config / Validatevat.php .
Über dem Pfad als Referenz. Erstellen Sie nun das richtige Modul für Ihr eigenes Modul.
quelle
Um eine Schaltfläche in der Systemkonfiguration hinzuzufügen und eine benutzerdefinierte Funktion auszuführen, müssen Sie eine erstellen
frontend_model
, um Ihre Schaltfläche zu rendern. In der Vorlage vonfrontend_model
können Sie Ihre Ajax-Logik schreiben.Hier ist ein Beispiel:
Diese Klasse ist für das Rendern der Schaltfläche HTML verantwortlich.
getButtonHtml()
Funktion generiert Button HTML.Hier haben wir unsere
frontend_model
Schaltfläche zum Rendern. Jetzt müssen wir eine Controller-Klasse erstellen, die unsere Ajax-Anforderung verarbeitet.Wir haben eine Funktion
getAjaxSyncUrl()
in unsererfrontend_model
, die die URL dieses Controllers zurückgibt. Außerdem gibt es Variable$_template
infrontend_model
die den Pfad unserer Vorlagendatei für unsere Renderer hält.Sie können in der Vorlage sehen, dass durch Klicken auf die Schaltfläche eine Ajax-Anforderung an den in definierten Controller ausgelöst wird
forntend_model
.Ich hoffe es wird helfen.
quelle
Sie müssen
frontend_model
in der Konfiguration Benutzerdefiniert für benutzerdefiniertes Renderfeld definieren. Über diesen Link können Sie Hilfe erhalten .quelle
Um eine Schaltfläche im Backend-Konfigurationsabschnitt zu erstellen, müssen Sie die folgenden Schritte ausführen:
Schritt 1: Hinzufügen eines Feldes ist eine Schaltfläche in einer Datei
system.xml
wie diese Skripte:Schritt 2: Schaltfläche System erstellen
Block
:Datei erstellen
Namspace\Module\Block\System\Config\Button.php
:Schritt 3: Datei erstellen
view/adminhtml/templates/system/config/button.phtml
:quelle