Magento 2 資料設定欄位的方法
Magento 內部有一張資料表是用來儲存系統參數,但常常不知道怎麼新增自定義的欄位進去。
今天,我們就來介紹資料設定欄位的方法吧!
1. 資料表 Database
(1) Table Name: core_config_data
這張就是我們今天要介紹的主要資料表,它負責了幾乎一切 Magento 系統變數的儲存,我們透過以下表格來看看他有哪些欄位吧!
欄位名稱 | 型別 | 長度 | 說明 |
config_id | int | 10 | Entity Id |
scope_id | varchar | 8 | n/a |
scope_id | int | 11 | n/a |
path | varchar | 255 | 路徑由 section/group/field 所組成 |
value | text | n/a | 儲存資料內容 |
(2) 欄位名稱定義
裡面所有的 config Data 都是透過 section、group、field 這三個值來定義資料,那這三個又是什麼呢?
我們參考下圖:
2.資料處理 Data Process
(1) 讀取 Read
<?php $obj = \Magento\Framework\App\ObjectManager::getInstance(); /* @var $scopeConfig \Magento\Framework\App\Config\ScopeConfigInterface */ $scopeConfig = $obj->create('Magento\Framework\App\Config\ScopeConfigInterface'); $scopeConfig->getValue('section/group/field');
(2) 寫入 Write
<?php $obj = \Magento\Framework\App\ObjectManager::getInstance(); /* @var $scopeConfig \Magento\Framework\App\Config\ScopeConfigInterface */ $scopeConfig = $obj->create('Magento\Framework\App\Config\ScopeConfigInterface'); $scopeConfig->saveConfig('section/group/field',$value, 'default',0);
3. 自定義欄位 Custom Field
(1) XML 檔
跟大多數的 Magento 定義檔一樣,需要透過 XML 來定義 System 內的資料欄位,假設我們今天要開設一個遠端系統的 extension ,欄位有 username、password、ip address、port number 四個。檔案設定如下:
* 檔名及存放路徑
vendor/extension/etc/adminhtml/system.xml
* 程式碼
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Config:etc/system_file.xsd"> <system> <tab id="example_core_tab" translate="label" sortOrder="888"> <label>Remote System</label> </tab> <section id="example_core_setting" translate="label" sortOrder="130" showInDefault="1" showInWebsite="1" showInStore="1"> <label>Setting</label> <tab>example_core_tab</tab> <resource>Grayson_SysConfigExample::example_core_setting</resource> <group id="setting_ip" translate="label" type="text" sortOrder="10" showInDefault="1" showInWebsite="0" showInStore="0"> <label>Setting</label> <field id="field_ip" translate="label" type="text" sortOrder="20" showInDefault="1" showInWebsite="1" showInStore="1"> <label>Ip Address</label> </field> <field id="field_port" translate="label" type="text" sortOrder="20" showInDefault="1" showInWebsite="1" showInStore="1"> <label>Port</label> </field> <field id="field_username" translate="label" type="text" sortOrder="20" showInDefault="1" showInWebsite="1" showInStore="1"> <label>Username</label> </field> <field id="password" translate="label" type="obscure" sortOrder="25" showInDefault="1" showInWebsite="1" showInStore="1"> <label>Password</label> <backend_model>Magento\Config\Model\Config\Backend\Encrypted</backend_model> <depends> <field id="*/*/active">1</field> </depends> </field> </group> </section> </system> </config>
(2) 賦予預設值
通常除了帳號密碼之外,我們可能會給予一些變數預設的資料,像是 Port Number,或是 IP Address 等等,而我們透過 config.xml 設定檔可以完成這件事情,讓資料永遠都有預設值。底下範例給予預設 IP 為 127.0.0.1,預設 port 為 22,預設 username 為 default_username。
* 檔名及存放路徑
vendor/extension/etc/config.xml
* 程式碼:
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/config.xsd"> <default> <example_core_setting> <setting_ip> <field_ip>127.0.0.1</field_ip> <field_port>22</field_port> <field_username>default_username</field_username> <password backend_model="Magento\Config\Model\Config\Backend\Encrypted" /> </setting_ip> </example_core_setting> </default> </config>
(3) 密碼欄位
Magento 在 core_config_data 的 value 中,可以儲存加密過後的字串。Magento 也實作了加 ( 解 ) 密的方法,讓開發人員能夠使用,在需要用到時 decode 回原本的字串。
!!注意!!這邊的加密非 MD5 或是 SHA256 類的雜湊 ( Hash ) 演算法!
因為有 Magento 實作了 Encrypted 方法,所以我們在設定 Password 的時候,要賦予 backend_model 的參數,才能用 getValue 方法正確的取得解密過後的字串。
* system.xml 程式碼
<field id="password" translate="label" type="obscure" sortOrder="25" showInDefault="1" showInWebsite="1" showInStore="1"> <label>Password</label> <backend_model>Magento\Config\Model\Config\Backend\Encrypted</backend_model> <depends> <field id="*/*/active">1</field> </depends> </field>
* config.xml 程式碼
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/config.xsd"> <default> <example_core_setting> <setting_ip> <field_ip>127.0.0.1</field_ip> <field_port>22</field_port> <field_username>default_username</field_username> <password backend_model="Magento\Config\Model\Config\Backend\Encrypted" /> </setting_ip> </example_core_setting> </default> </config>
(4) 清除 Cache
因為有動到 XML 設定檔,更改完設定後,記得要用指令清除 Cache。
$ bin/magento cache:flush
$ bin/magento cache:clean
4. 範例程式碼:
如果想了解更多相關Magento的教學,可以參考我們的其他文章喔!
我要留言