Magento 2: Agregue un valor mediante programación a `core_config_data`

24

¿Magento 2 tiene una abstracción de alto nivel que permite a los programadores de usuarios finales actualizar los valores de configuración en la core_config_datatabla? ¿O está usando SQL directo la única forma de hacer esto en Magento 2?

es decir, en Magento 1, podrías hacer algo como esto

$config_model = new Mage_Core_Model_Config();
$config_model->saveConfig('my/config/path', $unique_id, 'default', 0);

y guardar los valores de configuración en core_config_data. ¿Hay un equivalente en Magento 2?

Alan Storm
fuente

Respuestas:

18

No usaría un modelo o un modelo de recurso, pero \Magento\Framework\App\Config\Storage\WriterInterfaceo \Magento\Framework\App\Config\ConfigResource\ConfigInterface(el primero delega al segundo).

Bastante sencillo también:

use Magento\Framework\App\Config\Storage\WriterInterface;

class SomeClass {

    public function __construct(WriterInterface $configWriter)
    {
        $configWriter->save('some/config/path', 'some value');
    }
}
nevvermind
fuente
¡Gracias! Creo que este es el mejor enfoque / abstracción de alto nivel que deberíamos estar usando. Porque \Magento\Framework\App\Config\Storage\WriterInterfacese implementa por lo \Magento\Framework\App\Config\Storage\Writerque a su vez se usa \Magento\Config\Model\ResourceModel\Config.
Andrei
4

También puedes usar \Magento\Config\Model\Config::save. Debajo de una muestra simple:

$configData = [
    'section' => 'MY_SECTION',
    'website' => null,
    'store'   => null,
    'groups'  => [
        'MY_GROUP' => [
            'fields' => [
                'MY_FIELD' => [
                    'value' => $myValue,
                ],
            ],
        ],
    ],
];

// $this->configFactory --> \Magento\Config\Model\Config\Factory
/** @var \Magento\Config\Model\Config $configModel */
$configModel = $this->configFactory->create(['data' => $configData]);
$configModel->save();

Esta sintaxis no es "simple", pero en algunos casos es más segura. De acuerdo con la lógica de guardar, la acción podría ser más lenta que el acceso directo a la base de datos.

En mi caso, $valuenecesito estar encriptado. En system.xml, configuré el modelo de back-end para el campo, y la lógica de guardar encripta los datos.

Editar: \Magento\Config\Model\Config::setDataByPathmás simple de usar

bchatard
fuente
4

Para una abstracción de alto nivel, inyectaría Magento\Framework\App\Config\Storage\WriterInterfaceen el constructor de un script de configuración de datos:

use Magento\Framework\App\Config\Storage\WriterInterface; 

public function __construct(WriterInterface $configWriter) {...}

Luego use el save()método, por ejemplo:

$website = $this->websiteRepository->get('main_website'); // inject Magento\Store\Model\WebsiteRepository;

$this->configWriter->save('general/country/default', 'US', ScopeInterface::SCOPE_WEBSITES, $website->getId()); // inject Magento\Store\Model\ScopeInterface;

Notas: Utilice la forma plural de ámbitos: sitios web / tiendas en Magento\Store\Model\ScopeInterface

William Tran
fuente
0

Aquí una muestra completa para manejar la configuración de Magento 2 mediante programación.

En mi caso, agrego para borrar el caché también, de lo contrario los cambios no aparecen en Tienda> Configuración .

/**
 * @var \Magento\Config\Model\ResourceModel\Config
 */
protected $resourceConfig;

/**
 * @var \Magento\Framework\App\Cache\TypeListInterface
 */
protected $cacheTypeList;

public function __construct(
    \Magento\Config\Model\ResourceModel\Config $resourceConfig,
    \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList
) {
    $this->resourceConfig = $resourceConfig;
    $this->cacheTypeList = $cacheTypeList;
}

public function process()
{
    $this->resourceConfig->saveConfig(
        'my/config/path',
        $unique_id,
        \Magento\Framework\App\ScopeInterface::SCOPE_DEFAULT,
        0
    );
     $this->cacheTypeList->cleanType(\Magento\Framework\App\Cache\Type\Config::TYPE_IDENTIFIER);
}
Antoine Martin
fuente