Cómo crear Dynamic rows para configuraciones de Magento

por David Abad
Magento: Dynamic rows

Magento permite incluir campos de configuración en el administrador para personalizar la funcionalidad de nuestros módulos, pudiendo definir listados de elementos dinámicos (dynamic rows) con múltiples campos.
Aprende cómo añadir estos elementos de configuración para dar una mayor flexibilidad en las configuraciones de tus módulos.

Configuración de módulos

Magento incorpora una sección en el administrador destinada a establecer los diferentes parámetros de configuración de los módulos disponibles. 

Esta página es accesible desde el menú Stores > Configuration y agrupa los diferentes parámetros de configuración en secciones grupos.

Magento: Stores - Config

 Los valores de estos parámetros de configuración son almacenados en la tabla core_config_data de base de datos, clasificados por un “path” con el formato: sección/grupo/parámetro.

Los tipos de campo que podemos encontrar en estas configuraciones pueden ser inputs simples, selectores con diferentes valores predefinidos o incluso listados dinámicos de elementos (dynamic rows).

Crear configuraciones con Dynamic rows

Los Dynamic Rows son elementos que permiten la configuración de parámetros complejos, pudiendo definir varios campos (columnas) y configurar tantos ítems (filas) como sea necesario. 

Este tipo de elemento de configuración da una gran flexibilidad a nuestros desarrollos, ya que facilita una parametrización mucho más dinámica. 

Magento Dynamic rows

1. Indicar el nuevo campo de configuración en el fichero <Mi Modulo>/etc/adminhtml/system.xml con los siguientes parámetros:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Config:etc/system_file.xsd">
<system>
    <tab id="mi_modulo" translate="label">
        <label>Mi modulo</label>
    </tab>
    <section id="mi_modulo" translate="label" showInDefault="1">
        <label>Mi modulo</label>
        <tab>mi_modulo</tab>
        <resource>Magento_Config::config_system</resource>
        <group id="mi_configuracion" translate="label" showInDefault="1">
            <label>Configuracion</label>
            <field id="mi_parametro" translate="label" type="text" showInDefault="1">
                <label>Mi parametro</label>
                <frontend_model>MiVendor\MiModulo\Block\Adminhtml\Form\Field\DynamicRows</frontend_model>
                <backend_model>Magento\Config\Model\Config\Backend\Serialized\ArraySerialized</backend_model>
            </field>
        </group>
    </section>
</system>
</config>
2. Crear la clase del backend model en <Mi modulo>/Block/Adminhtml/Form/Field/DynamicRows.php, definiendo las columnas que incluirá nuestro campo de configuración:
<?php

declare(strict_types=1);

namespace MiVendor\MiModulo\Block\Adminhtml\Form\Field;

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

class DynamicRows extends AbstractFieldArray
{
    protected function _prepareToRender()
    {
        $this->addColumn('param1', ['label' => (string)__('Param 1')]);
        $this->addColumn('param2', ['label' => (string)__('Param 2')]);
        $this->addColumn('param3', ['label' => (string)__('Param 3')]);
        $this->_addAfter = false;
        $this->_addButtonLabel = (string)__('Add');
    }
}
3. Utilizar el parámetro de configuración desde nuestro código:
<?php

declare(strict_types=1);

namespace MiVendor\MiModulo\Helper;

use Magento\Framework\Serialize\Serializer\Json;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Store\Model\ScopeInterface;

class Data
{
    private ScopeConfigInterface $scopeConfig;
    private Json $jsonSerializer;

    public function __construct(
        ScopeConfigInterface $scopeConfig,
        Json $jsonSerializer
    ) {
        $this->scopeConfig = $scopeConfig;
        $this->jsonSerializer = $jsonSerializer;
    }

    public function getParam(): array 
    {
        $config = $this->scopeConfig->getValue(
            'mi_modulo/mi_configuracion/mi_parametro', 
            ScopeInterface::SCOPE_STORE
        );
        return $this->jsonSerializer->unserialize($config ?? '{}');
    }
}

Déjanos tu email para recibir contenido interesante en tu bandeja de entrada, cada mes.

¡No hacemos spam!

Otros artículos