Magento 2: aggiungere a livello di codice un valore a `core_config_data`


24

Magento 2 ha un'astrazione di alto livello che consente ai programmatori degli utenti finali di aggiornare i valori di configurazione nella core_config_datatabella? O usare Straight SQL è l'unico modo per farlo in Magento 2?

cioè in Magento 1, potresti fare qualcosa del genere

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

e salva i valori di configurazione in core_config_data. C'è un equivalente in Magento 2?

Risposte:



18

Non userei un modello o un modello di risorsa, ma \Magento\Framework\App\Config\Storage\WriterInterfaceo\Magento\Framework\App\Config\ConfigResource\ConfigInterface (il primo delegando al secondo).

Anche abbastanza diretto:

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

class SomeClass {

    public function __construct(WriterInterface $configWriter)
    {
        $configWriter->save('some/config/path', 'some value');
    }
}

Grazie! Penso che questo sia l'approccio migliore / astrazione di alto livello che dovremmo usare. Perché \Magento\Framework\App\Config\Storage\WriterInterfaceè implementato dal \Magento\Framework\App\Config\Storage\Writerquale a sua volta utilizza \Magento\Config\Model\ResourceModel\Config.
Andrei,

4

Puoi anche usare \Magento\Config\Model\Config::save. Di seguito un semplice esempio:

$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();

Questa sintassi non è "semplice", ma in alcuni casi è più sicura. A seconda della logica di salvataggio, l'azione potrebbe essere più lenta dell'accesso diretto al db.

Nel mio caso, ho $valuebisogno di essere crittografato. Nelsystem.xml , ho impostato il modello di backend per il campo e la logica di salvataggio crittografa i dati.

Modifica: \Magento\Config\Model\Config::setDataByPathpiù semplice da usare


4

Per un'astrazione di alto livello inietterei Magento\Framework\App\Config\Storage\WriterInterfacenel costruttore di uno script di configurazione dei dati:

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

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

Quindi utilizzare il save()metodo, ad esempio:

$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;

Note: utilizzare la forma plurale di ambiti: siti Web / negozi in Magento\Store\Model\ScopeInterface


0

Ecco un esempio completo per gestire la configurazione di Magento 2 a livello di codice.

Nel mio caso, aggiungo anche per cancellare la cache, altrimenti le modifiche non vengono visualizzate in Store> Config .

/**
 * @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);
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.