Magento 2: ajouter par programme une valeur à `core_config_data`

24

Magento 2 a-t-il une abstraction de haut niveau qui permet aux programmeurs utilisateurs finaux de mettre à jour les valeurs de configuration dans le core_config_datatableau? Ou est-ce que l'utilisation de SQL simple est le seul moyen de le faire dans Magento 2?

c'est à dire dans Magento 1, vous pouvez faire quelque chose comme ça

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

et enregistrer les valeurs de configuration dans core_config_data. Y a-t-il un équivalent dans Magento 2?

Alan Storm
la source

Réponses:

18

Je n'utiliserais pas un modèle ou un modèle de ressource, mais \Magento\Framework\App\Config\Storage\WriterInterfaceou \Magento\Framework\App\Config\ConfigResource\ConfigInterface(la première délégation à la seconde).

Assez simple aussi:

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

class SomeClass {

    public function __construct(WriterInterface $configWriter)
    {
        $configWriter->save('some/config/path', 'some value');
    }
}
Nevermind
la source
Merci! Je pense que c'est la meilleure approche / abstraction de haut niveau que nous devrions utiliser. Parce que \Magento\Framework\App\Config\Storage\WriterInterfaceest mis en œuvre par \Magento\Framework\App\Config\Storage\Writerlequel à son tour utilise \Magento\Config\Model\ResourceModel\Config.
Andrei
4

Vous pouvez également utiliser \Magento\Config\Model\Config::save. Ci-dessous un simple échantillon:

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

Cette syntaxe n'est pas "simple", mais elle est plus sûre dans certains cas. Du à la logique de sauvegarde, l'action peut être plus lente que l'accès direct à la base de données.

Dans mon cas, $valuebesoin d'être crypté. Dans system.xml, j'ai défini le modèle principal pour le champ et la logique de sauvegarde crypte les données.

Edit: \Magento\Config\Model\Config::setDataByPathplus simple à utiliser

bchatard
la source
4

Pour une abstraction de haut niveau, j'injecterais Magento\Framework\App\Config\Storage\WriterInterfacedans le constructeur d'un script de configuration de données:

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

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

Utilisez ensuite la save()méthode, par exemple:

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

Remarques: Utilisez la forme plurielle des étendues: sites Web / magasins dans Magento\Store\Model\ScopeInterface

William Tran
la source
0

Voici un exemple complet pour gérer la configuration de Magento 2 par programmation.

Dans mon cas, j'ajoute également pour vider le cache, sinon les modifications n'apparaissent pas dans 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);
}
Antoine Martin
la source