Magento 2: Lập trình thêm một giá trị vào `core_config_data`


24

Magento 2 có mức độ trừu tượng cao cho phép lập trình viên người dùng cuối cập nhật giá trị cấu hình trong core_config_databảng không? Hoặc sử dụng SQL thẳng là cách duy nhất để làm điều này trong Magento 2?

tức là trong Magento 1, bạn có thể làm một cái gì đó như thế này

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

và lưu các giá trị cấu hình vào core_config_data. Có tương đương trong Magento 2 không?

Câu trả lời:


21

+1 Hữu ích, cảm ơn bạn! Tôi sẽ để câu hỏi mở trong một thời gian để xem nếu một @apicâu trả lời được đánh dấu nổi lên trên đầu.
Alan Storm

18

Tôi sẽ không sử dụng một mô hình hoặc một mô hình tài nguyên, nhưng \Magento\Framework\App\Config\Storage\WriterInterfacehoặc \Magento\Framework\App\Config\ConfigResource\ConfigInterface(lần đầu tiên ủy thác cho lần thứ hai).

Khá đơn giản, quá:

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

class SomeClass {

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

Cảm ơn! Tôi nghĩ rằng đây là cách tiếp cận tốt hơn / mức độ trừu tượng cao mà chúng ta nên sử dụng. Bởi vì \Magento\Framework\App\Config\Storage\WriterInterfaceđược thực hiện theo \Magento\Framework\App\Config\Storage\Writerđó lần lượt sử dụng \Magento\Config\Model\ResourceModel\Config.
Andrei

4

Bạn cũng có thể sử dụng \Magento\Config\Model\Config::save. Dưới đây là một mẫu đơn giản:

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

Cú pháp này không "đơn giản", nhưng nó an toàn hơn trong một số trường hợp. Theo logic lưu, hành động có thể chậm hơn so với truy cập trực tiếp vào db.

Trong trường hợp của tôi, $valuecần phải được mã hóa. Trong system.xml, tôi đặt mô hình phụ trợ cho trường và logic lưu mã hóa dữ liệu.

Chỉnh sửa: \Magento\Config\Model\Config::setDataByPathđơn giản hơn để sử dụng


4

Để có mức độ trừu tượng cao, tôi sẽ đưa Magento\Framework\App\Config\Storage\WriterInterfacevào hàm tạo của tập lệnh thiết lập dữ liệu:

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

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

Sau đó sử dụng save()phương thức, ví dụ:

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

Ghi chú: Sử dụng dạng số nhiều của phạm vi: trang web / cửa hàng trong Magento\Store\Model\ScopeInterface


0

Đây là một mẫu hoàn chỉnh để xử lý cấu hình Magento 2 theo chương trình.

Trong trường hợp của tôi, tôi cũng thêm vào để xóa bộ nhớ cache, những thay đổi khác không xuất hiện trong 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);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.