Magento 2 erstellt eine Admin-Konfigurationstabelle mit benutzerdefinierten Zeilen und Spalten

7

Ich möchte eine Administratorkonfiguration mit einer Tabelle erstellen, um die Daten zu übernehmen und in der Konfiguration zu speichern, für die ich diesem Link gefolgt bin .

Ich möchte aber auch programmgesteuert und auch ohne die letzte Aktionsspalte und die Schaltfläche zum Hinzufügen benutzerdefinierte Zeilen in dieser Tabelle erstellen. Bitte beziehen Sie sich auf das Bild Admin-Konfiguration

Ich konnte im Web keine Lösung für dieselbe oder die Datei finden

\ Magento \ Config \ Block \ System \ Config \ Form \ Field \ FieldArray \ AbstractFieldArray
dass wir verlängern, gab keine Hinweise.
Hätte dies leicht über jquery tun können, möchte aber die Standardlösung implementieren.

Code:

<?php
namespace Abc\Paymentmethod\Block\Adminhtml\System\Config\Form\Field;

class Feetable extends \Magento\Config\Block\System\Config\Form\Field\FieldArray\AbstractFieldArray
{
    /**
     * @var \Magento\Framework\Data\Form\Element\Factory
     */
    protected $_elementFactory;

    /**
     * @param \Magento\Backend\Block\Template\Context $context
     * @param \Magento\Framework\Data\Form\Element\Factory $elementFactory
     * @param array $data
     */
    public function __construct(
        \Magento\Backend\Block\Template\Context $context,
        \Magento\Framework\Data\Form\Element\Factory $elementFactory,
        array $data = []
    )
    {
        $this->_elementFactory  = $elementFactory;
        parent::__construct($context,$data);
    }
    protected function _construct(){
        $this->addColumn('noi', ['label' => __('NOI'),'readonly'=>'readonly']);
        $this->addColumn('fixed', ['label' => __('Fixed')]);
        $this->addColumn('percent', ['label' => __('Percent')]);
        $this->_addAfter = false;
        $this->_addButtonLabel = __('Add More');
        parent::_construct();
    }

    protected function _prepareArrayRow(\Magento\Framework\DataObject $row) {
        $options = [1,2,3];
        $row->setData('option_extra_attrs', $options);
    }

}

system.xml

<field id="abc_fee_table" translate="label comment tooltip" sortOrder="17.4" showInDefault="1" showInWebsite="1" showInStore="0">
                    <label>Abc Fee by Number of Installments(NOI)</label>
                    <frontend_model>Abc\Paymentmethod\Block\Adminhtml\System\Config\Form\Field\Feetable</frontend_model>
                    <backend_model>Magento\Config\Model\Config\Backend\Serialized\ArraySerialized</backend_model>                    
                </field>
Ashwani Shukla
quelle
@ Divyesh nein wird es nicht. Bitte beziehen Sie sich auf das Bild, um meine Anforderung zu verstehen
Ashwani Shukla
Können Sie Code teilen
Chirag Patel
Ich suchte das Gleiche, erkannte aber, dass ein solcher Tisch nicht wirklich notwendig ist. Jede 2D-Nachschlagetabelle kann in eine 1D-Tabelle umgewandelt werden. Wenn Sie eine Excel-Tabelle haben, finden Sie hier ein Tutorial zum Transformieren: Tabellenkalkulationsseite.com/index.php/tip/… . Könnte nicht die Lösung sein, nach der Sie suchen, würde Ihnen aber viel Arbeit ersparen;)
Mo3bius
Hier ein detaillierterer Vergleich beider Datendarstellungen: eagereyes.org/basics/spreadsheet-thinking-vs-database-thinking . Magento basiert auf Datenbanktabellen, daher ist es wahrscheinlich am besten, Daten auch im Backend auf diese Weise darzustellen.
Mo3bius
1
@MartinE Nachdem ich keine Antwort erhalten hatte, tat ich es über jQuery. Wenn Sie möchten, kann ich den Code mit Ihnen teilen.
Ashwani Shukla

Antworten:

0

Sie müssen diesen Code wie folgt in system.xml einfügen:

<field id="abc_fee_table" ranslate="label comment tooltip" sortOrder="17.4" showInDefault="1" showInWebsite="1" showInStore="0">
            <label>Additional Emails</label>
            <frontend_model>Abc\Paymentmethod\Block\Adminhtml\Form\Field\AdditionalItem</frontend_model>
    <backend_model>Abc\Paymentmethod\Config\Backend\AdditionalItem</backend_model>
</field>

Bitte fügen Sie einen benutzerdefinierten Serializer hinzu

 <?php
namespace Abc\Paymentmethod\Config\Backend;

use Magento\Framework\App\Cache\TypeListInterface;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\App\Config\Value as ConfigValue;
use Magento\Framework\Data\Collection\AbstractDb;
use Magento\Framework\Model\Context;
use Magento\Framework\Model\ResourceModel\AbstractResource;
use Magento\Framework\Registry;
use Magento\Framework\Serialize\SerializerInterface;

class AdditionalItem extends ConfigValue
{
    /**
     * Json Serializer
     *
     * @var SerializerInterface
     */
    protected $serializer;

    /**
     * ShippingMethods constructor
     *
     * @param SerializerInterface $serializer
     * @param Context $context
     * @param Registry $registry
     * @param ScopeConfigInterface $config
     * @param TypeListInterface $cacheTypeList
     * @param AbstractResource|null $resource
     * @param AbstractDb|null $resourceCollection
     * @param array $data
     */
    public function __construct(
        SerializerInterface $serializer,
        Context $context,
        Registry $registry,
        ScopeConfigInterface $config,
        TypeListInterface $cacheTypeList,
        AbstractResource $resource = null,
        AbstractDb $resourceCollection = null,
        array $data = []
    ) {
        $this->serializer = $serializer;
        parent::__construct($context, $registry, $config, $cacheTypeList, $resource, $resourceCollection, $data);
    }

    public function beforeSave()
    {
        $value = $this->getValue();
        unset($value['__empty']);
        $encodedValue = $this->serializer->serialize($value);

        $this->setValue($encodedValue);
    }

    protected function _afterLoad()
    {
        $value = $this->getValue();
        $decodedValue = $this->serializer->unserialize($value);

        $this->setValue($decodedValue);
    }
}

Admin benutzerdefiniert abgelegt

<?php
namespace Abc\Paymentmethod\Block\Adminhtml\Form\Field;

use Magento\Config\Block\System\Config\Form\Field\FieldArray\AbstractFieldArray;

class AdditionalItem extends AbstractFieldArray
{
    protected function _prepareToRender()
    {
         $this->addColumn('noi', ['label' => __('NOI'),'readonly'=>'readonly']);
        $this->addColumn('fixed', ['label' => __('Fixed')]);
        $this->addColumn('percent', ['label' => __('Percent')]);
        $this->_addAfter = false;
        $this->_addButtonLabel = __('Add More');
    }
}
Birjitsinh Zala
quelle
Vielen Dank für Ihre Antwort. Dies ist jedoch nicht die Lösung. Hier erfahren Sie nur, wie Sie die Standardtabelle erstellen. Ich muss wissen, wie man die Zeilen dynamisch mit Daten erstellt (zum Beispiel mit einem Datenarray) und wie man die Aktionsschaltflächen und die Schaltfläche "Hinzufügen" entfernt.
MartinE
/root/vendor/dotmailer/dotmailer-magento2-extension/Block/Adminhtml/Config/Automation/Customdatafields.php
Birjitsinh Zala
Bitte überprüfen Sie Customdatafields.php für weitere Details
Birjitsinh Zala
-1 keine funktionierende Lösung. Ich suche auch nach einer Lösung. Wie @MartinE sagte, ist dies für eine Standardtabelle.
Akif
ok ich verstehe
Birjitsinh Zala