Magento 2: Programlı olarak 'core_config_data`' ya bir değer ekleyin


24

Magento 2, son kullanıcı programcıların core_config_datatablodaki konfigürasyon değerlerini güncellemesini sağlayan yüksek bir soyutlama var mı? Yoksa Magento 2'de bunu yapmanın tek yolu düz SQL mi kullanıyor?

yani, Magento 1'de böyle bir şey yapabilirdiniz.

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

ve yapılandırma değerlerini kaydedin core_config_data. Magento 2'de eşdeğeri var mı?

Yanıtlar:



18

Bir model veya kaynak model kullanmam, ama \Magento\Framework\App\Config\Storage\WriterInterfaceveya \Magento\Framework\App\Config\ConfigResource\ConfigInterface(ikinciye delegasyon yapan).

Ayrıca oldukça yalındır:

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

class SomeClass {

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

Teşekkürler! Bence bu kullanmamız gereken daha iyi yaklaşım / yüksek seviye soyutlamadır. Çünkü hangi sırayla kullanır ki \Magento\Framework\App\Config\Storage\WriterInterfaceuygulanmaktadır . \Magento\Framework\App\Config\Storage\Writer\Magento\Config\Model\ResourceModel\Config
Andrei

4

Ayrıca kullanabilirsiniz \Magento\Config\Model\Config::save. Basit bir numunenin altında:

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

Bu sözdizimi "basit" değildir, ancak bazı durumlar için daha güvenlidir. Kaydetme mantığına bağlı olarak, eylem db'ye doğrudan erişimden daha yavaş olabilir.

Benim durumumda $valueşifreli olması gerekiyor. İçinde system.xml, alan için arka uç modelini ayarlarım ve kaydetme mantığı verileri şifreler.

Düzenleme: \Magento\Config\Model\Config::setDataByPathkullanımı daha basit


4

Üst düzey bir soyutlama Magento\Framework\App\Config\Storage\WriterInterfaceiçin, bir veri kurulum betiğinin kurucusuna enjekte ederim :

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

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

Ardından save()yöntemi kullanın, örneğin:

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

Notlar: Birden fazla kapsam biçimi kullanın: Magento\Store\Model\ScopeInterface


0

İşte Magento 2 konfigürasyonunu programlı olarak ele almak için eksiksiz bir örnek.

Benim durumumda da önbelleği temizlemeye ekliyorum, başka değişiklikler Mağaza> Yapılandırma'da görünmüyor .

/**
 * @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);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.