Magento 2: Програмно додайте значення до `core_config_data`


24

Чи має Magento 2 абстракцію високого рівня, яка дозволяє кінцевим користувачам-програмістам оновлювати значення конфігурації в core_config_dataтаблиці? Або використання прямого SQL - єдиний спосіб зробити це в Magento 2?

тобто в Magento 1 ви можете зробити щось подібне

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

і зберегти значення конфігурації в core_config_data. Чи є еквівалент у Magento 2?

Відповіді:


21

+1 Корисно, дякую! Я залишаю питання відкритим на деякий час, щоб побачити, чи @apiпозначається відповідь міхуром до верху.
Алан Шторм

18

Я б не використовував модель або модель ресурсу, але \Magento\Framework\App\Config\Storage\WriterInterfaceабо \Magento\Framework\App\Config\ConfigResource\ConfigInterface(перший делегуючи другий).

Також досить прямо:

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

class SomeClass {

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

Спасибі! Я думаю, що це кращий підхід / абстракція високого рівня, який ми повинні використовувати. Тому що \Magento\Framework\App\Config\Storage\WriterInterfaceреалізується, \Magento\Framework\App\Config\Storage\Writerв свою чергу використовує \Magento\Config\Model\ResourceModel\Config.
Андрій

4

Ви також можете використовувати \Magento\Config\Model\Config::save. Нижче простий зразок:

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

Цей синтаксис не є "простим", але для певного випадку він більш безпечний. Згідно з логікою збереження, дія може бути повільнішою, ніж прямий доступ до db.

У моєму випадку $valueпотрібно зашифрувати. В system.xmlя встановив модель для бекенда для поля, і логіка збереження шифрує дані.

Редагування: \Magento\Config\Model\Config::setDataByPathпростіший у використанні


4

Для абстракції високого рівня я б ввів Magento\Framework\App\Config\Storage\WriterInterfaceу конструктор сценарію настройки даних:

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

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

Потім використовуйте save()метод, наприклад:

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

Примітки: Використовуйте форму множини: сфери веб-сайтів / магазинів у Magento\Store\Model\ScopeInterface


0

Ось повний зразок для програмного керування Magento 2.

У моєму випадку я також додаю до очищення кешу, інакше зміни не відображаються в магазині> Налаштувати .

/**
 * @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);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.