Magento 2: โดยทางโปรแกรมเพิ่มมูลค่าให้กับ `core_config_data`


24

Magento 2 มี abstraction ระดับสูงหรือไม่ที่อนุญาตให้ผู้ใช้ - โปรแกรมเมอร์สามารถอัปเดตค่าการกำหนดค่าใน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คำตอบที่ทำเครื่องหมายไว้ด้านบนหรือไม่
Alan Storm

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
Andrei

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

ไวยากรณ์นี้ไม่ได้ "ง่าย" แต่จะปลอดภัยกว่าสำหรับบางกรณี หากเปรียบเทียบกับตรรกะการบันทึกการดำเนินการอาจช้ากว่าการเข้าถึงฐานข้อมูลโดยตรง

ในกรณีของฉัน$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 โดยทางโปรแกรม

ในกรณีของฉันฉันจะเพิ่มไปยังแคชชัดเจนเกินไปการเปลี่ยนแปลงอื่นไม่ปรากฏอยู่ในร้านค้า> 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);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.