Magento 2 EAV Model 介紹 (2) – 使用程式新增 Attribute
上一個篇幅的文章內,我們介紹了 Eav Model 的關係。今天我們要透過程式的方式來教大家如何新增 Attribute 及 Attribute Set,利用程式的方式新增,不僅可以確保在安裝模組的時候開發機、測試伺服器及正式伺服器內都擁有一樣的 Attribute,也可以更有效的管理 Attribute 唷!※Magento 版本:2.1 以上
一般來說,在安裝一個新的 Module 的時候, 會使用 upgrade 指令,若讀到這邊不知道指令操作的朋友,可以輸入 bin/magento 會有完整的指令列表,Upgrade 指令執行後,會去執行 InstallData 內的程式,而新增 Attribute 的部分就非常適合寫在這邊了。
1.Install Data
我們來新增一個空白的 InsatallData.php 在你所開設的模組內,路徑為:
{vendor}/{extension_name}/Setup/InstallData.php
程式碼如下:
<?php namespace Vendor\ExtensionName\Setup; use Magento\Framework\Setup\InstallDataInterface; use Magento\Framework\Setup\ModuleContextInterface; use Magento\Framework\Setup\ModuleDataSetupInterface; class InstallData implements InstallDataInterface { /** * Function install * @param ModuleDataSetupInterface $setup * @param ModuleContextInterface $context * @return void */ public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context) { //install data here } }
2.EavSetup
新增檔案後,我們就已經完成了第一步驟了,接下來是使用 Factory 方法產生 eavSetup 的 class,eavSetup 內有各種的 Method,無論是 addAttribute、addAttributeSet 都可以由這個 class 來操作。將以下程式碼貼至 install 的 function 內。
<?php /** @var EavSetup $eavSetup */ $eavSetup = $this->eavSetupFactory ->create([ 'setup' => $setup ]);
3.新增 Attribute Set
我們使用剛剛透過 factory 方法產生出來的 eavSetup 來新增一個屬於 catalog_product 的 Attribute set,並且將其命名為 features,使用 addAttributeSet 的方法,catelog_product 的 namespace 為 \Magento\Catalog\Model\Product,所以可以直接用 static property 靜態變數取得 catelog_product 的字串,不需要自己手動輸入,減少輸入錯誤的風險,將以下程式碼貼至 install 的 function 內:
<?php $eavSetup->addAttributeSet( \Magento\Catalog\Model\Product::ENTITY, 'features', '1' );
4.新增 Product Attribute
我們這邊要使用的是 addAttribute 這個 Method。假如我們要新增一個 is_featured 欄位,一樣使用 eavSetup 來新增。
* 第一個參數:為 entity type,這邊使用 catalog_product 的 namespace 靜態變數代入
* 第二個參數:為 attribute code,這是一個唯一值,在同一個 entity type 內不能夠被重複使用
* 第三個參數:為 attribute 屬性的陣列 ( array ),這邊介紹一下幾個重要欄位:
* group:所屬群組
* type:資料型別,決定資料存在哪一個資料表的關鍵
* label:在前端顯示的文字
* input:在後台的欄位呈現方式
* class:對應到的 class ,沒有可以不用寫
* default:預設資料為何
* searchable:是否可搜尋
* comparable:是否可比較
* filterable:是否可過濾
參考程式如下:
<?php $eavSetup->addAttribute( \Magento\Catalog\Model\Product::ENTITY, 'is_featured', [ 'group' => 'General', 'type' => 'int', 'backend' => '', 'frontend' => '', 'label' => 'Is Featured', 'input' => 'boolean', 'class' => '', 'source' => 'Magento\Eav\Model\Entity\Attribute\Source\Boolean', 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL, 'visible' => true, 'required' => false, 'user_defined' => false, 'default' => '1', 'searchable' => false, 'filterable' => false, 'comparable' => false, 'visible_on_front' => false, 'used_in_product_listing' => false, 'unique' => false, 'apply_to' => '' ] );
5.新增 Category Attribute
新增 Category Attribute 的方法跟 Product 的方法其實大同小異。唯一不同的是需要把 Entity type 置換掉。而 catalog_category 的 namespace 為 \Magento\Catalog\Model\Category,我們一樣可以使用靜態變數取得字串 ( String )。
參考程式如下:
<?php $eavSetup->addAttribute( \Magento\Catalog\Model\Category::ENTITY, 'is_featured', [ 'group' => 'General', 'type' => 'int', 'backend' => '', 'frontend' => '', 'label' => 'Is Featured', 'input' => 'boolean', 'class' => '', 'source' => 'Magento\Eav\Model\Entity\Attribute\Source\Boolean', 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL, 'visible' => true, 'required' => false, 'user_defined' => false, 'default' => '1', 'searchable' => false, 'filterable' => false, 'comparable' => false, 'visible_on_front' => false, 'used_in_product_listing' => false, 'unique' => false, 'apply_to' => '' ] );
6.注意事項
1.Attribute 或是 Attribute set 再新增的時候參數非常繁瑣,常常需要不斷的刪除 module 再 upgrade module 來驗證是否成功。
2.刪除 module 時,要記得至 eav_attribute 資料表內將剛剛新增的 attribute 刪除。
3.Catalog Product 及 Catalog Category 是 Magento 內最完整的 Eav model,若是需要參考,可以優先使用。
想看更多Magento 2 教學導覽,別忘了訂閱我們的電子報,以及追蹤我們的Facebook粉絲專頁唷!
延伸閱讀:
解決 Magento 2 新增 Product Attribute 自動新增至 Default AttributeSet 問題
Magento 2 EAV Model 介紹 (3) – 在 Magento 2 使用程式新增 entity type
更多Magento相關文章請看: Magento教學導覽
我要留言