¿Cómo puedo establecer valores de configuración en Magento 2?

12

Anteriormente (en Magento 1, es decir) creamos un módulo llamado Configuración que contenía la configuración del sitio. Los scripts de actualización se parecen a esto:

$installer = $this;
$installer->startSetup();
$installer->setConfigData("fastsimpleimport/general/partial_indexing", 1);
$installer->setConfigData("fastsimpleimport/product/disable_preprocess_images", 1);
$installer->setConfigData('general/country/default', 'GB');
$installer->setConfigData('general/locale/firstday', 1); 
$installer->setConfigData('general/locale/timezone', 'Europe/London');
$installer->setConfigData('general/store_information/merchant_country', 'GB');
$installer->setConfigData('design/header/welcome', 'Enter your value');
$installer->setConfigData('design/head/title_suffix', 'Enter your value');
$installer->setConfigData('currency/options/base', 'GBP');
$installer->setConfigData('currency/options/default', 'GBP');
// ...

No puedo entender cómo hacer lo anterior en M2.

En otras palabras: ¿cómo hago para configurar los datos de configuración en M2?

Martin Wickman
fuente
2
¿Por qué los necesitas en el DB? ¿No puedes simplemente agregarlo al config.xmlarchivo?
Marius
Así es como se hacen las cosas. Parece ser la configuración de manejo de enfoque común en extensiones de módulos (al menos en M1). También deben manejarse según la versión para que puedan migrarse cuando se actualiza nuestro módulo.
Martin Wickman

Respuestas:

15

Esto parece funcionar:

class InstallData implements InstallDataInterface 
{
    public function __construct(
        LoggerInterface $loggerInterface,
        \Magento\Framework\App\Config\ConfigResource\ConfigInterface  $resourceConfig)
    {
        $this->logger = $loggerInterface;
        $this->resourceConfig = $resourceConfig;
    }        

    public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
        $setup->startSetup();

        $this->resourceConfig->saveConfig(
            'a/b/c', 
            'value', 
            \Magento\Framework\App\Config\ScopeConfigInterface::SCOPE_TYPE_DEFAULT, 
            \Magento\Store\Model\Store::DEFAULT_STORE_ID
        );

        $setup->endSetup();
    }   
}
Martin Wickman
fuente
1
Creo que también puede funcionar (y ser más limpio) usar la interfaz de DI en el constructor para el objeto $ resourceConfig. Así:\Magento\Framework\App\Config\ConfigResource\ConfigInterface $resourceConfig
Hervé Guétin
Hola Martin, ¿puedes compartir un poco más de tu módulo? Estoy luchando en qué espacio de nombres, etc., ¿debo usar?
Klettseb
¿por qué agregaste logger también? solo un hábito o?
OZZIE
6

Se puede utilizar la siguiente interfaz \Magento\Framework\App\Config\Storage\WriterInterface, tiene 2 métodos:

  • save($path, $value, $scope = ScopeConfigInterface::SCOPE_TYPE_DEFAULT, $scopeId = 0)
  • delete($path, $scope = ScopeConfigInterface::SCOPE_TYPE_DEFAULT, $scopeId = 0)

Es más de alto nivel en comparación con \Magento\Config\Model\ResourceModel\Config, y debe usarse desde el código del cliente.

Alex Paliarush
fuente