Ở bài viết trước chúng ta đã tìm hiểu về 6 loại product. Bài viết này sẽ hướng dẫn các bạn thêm một loại product tùy chỉnh trong Magento 2. Magento hỗ trợ một số loại sản phẩm, mỗi loại có hành vi và thuộc tính riêng. Khái niệm mạnh mẽ này cho phép Magento hỗ trợ nhiều ngành và nhu cầu của người bán hàng bằng cách trộn và kết hợp các trải nghiệm sản phẩm trong danh mục của họ.
Tuy nhiên, điều tuyệt vời ở đây là khả năng cho phép các nhà phát triển dễ dàng thêm các loại sản phẩm mới.
Nói chung, khi một loại sản phẩm có hành vi hoặc thuộc tính riêng biệt, thì nó phải được thể hiện bằng loại sản phẩm của chính nó. Điều này cho phép loại sản phẩm có cách trình bày và tùy chỉnh, không ảnh hưởng đến các loại sản phẩm khác – đảm bảo rằng các loại sản phẩm gốc có thể tiếp tục hoạt động như dự định.
Tạo file product_types.xml
Để thêm một product type thì điều đầu tiên các bạn cần làm là khai báo file product_types.xml trong module của bạn:
ViMagento/HelloWorld/etc/product_types.xml
1 2 3 4 |
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Catalog:etc/product_types.xsd"> <type name="custom_product_type_code" label="Custom Product Type" modelInstance="ViMagento\HelloWorld\Model\Product\Type"></type> </config> |
Thẻ type có ba thuộc tính bắt buộc.
- name: Thuộc tính này định nghĩa tên của product type được sử dụng để lưu vào trong cơ sở dữ liệu.
- label: Thuộc tính này sẽ được hiển thị trong admin.
- modelInstance: Xác định model tương ứng của product type.
Đây chỉ là ví dụ đơn giản nhất, ngoài ra còn có nhiều thẻ và thuộc tính dùng để định nghĩa product type.
Tạo model
Sau khi tạo product type bước tiếp theo chúng ta phải tạo model tương ứng với product type đã tạo. Mỗi product type được liên kết với một model tương ứng. Model này sẽ sửa đổi hành vi và thuộc tính của loại sản phẩm và được gọi trong quá trình thao tác sản phẩm.
ViMagento/HelloWorld/Model/Product/Type.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php namespace ViMagento\HelloWorld\Model\Product; class Type extends \Magento\Bundle\Model\Product\Type { const TYPE_ID = 'custom_product_type_code'; /** * {@inheritdoc} */ public function deleteTypeSpecificData(\Magento\Catalog\Model\Product $product) { // method cố ý để trống } } |
Thường thì product type hoạt động ra sao sẽ liên quan đến class mà nó kế thừa. Ví dụ ở trên custom product type tôi đã kế thừa từ bundle product. Ngoài ra sẽ có thêm các class type sau:
- Simple product: \Magento\Catalog\Model\Product\Type\Simple
- Virtual product: \Magento\Catalog\Model\Product\Type\Virtual
- Configurable product: \Magento\ConfigurableProduct\Model\Product\Type\Configurable
- Grouped product: \Magento\GroupedProduct\Model\Product\Type\Grouped
- Downloadable product: \Magento\Downloadable\Model\Product\Type
- Bundle product: \Magento\Bundle\Model\Product\Type
Sau khi xong các bạn xóa cache magento bằng câu lệnh php bin/magento cache:clean để áp dụng những thay đổi bạn vừa thực hiện. Nếu không có lỗi gì xảy ra bạn sẽ được kết qua như bên dưới:

Liên kết với các thuộc tính chung
Sau khi bạn thêm sản phẩm cho custom product type ở trên, bạn sẽ thấy thiếu một số field quan trọng như price, weight…Đó là những thuộc tính chung và chúng ta phải thêm nó vào.
ViMagento/HelloWorld/Setup/Patch/Data/Attribute.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
<?php namespace ViMagento\HelloWorld\Setup\Patch\Data; use Magento\Eav\Setup\EavSetup; use Magento\Eav\Setup\EavSetupFactory; use Magento\Framework\Setup\ModuleDataSetupInterface; use Magento\Framework\Setup\Patch\DataPatchInterface; class Attribute implements DataPatchInterface { /** * @var ModuleDataSetupInterface */ private $setup; /** * EAV setup factory * * @var EavSetupFactory */ protected $eavSetupFactory; /** * Init * * @param ModuleDataSetupInterface $setup * @param EavSetupFactory $eavSetupFactory */ public function __construct( ModuleDataSetupInterface $setup, EavSetupFactory $eavSetupFactory ) { $this->setup = $setup; $this->eavSetupFactory = $eavSetupFactory; } public function apply() { /** @var EavSetup $eavSetup */ $eavSetup = $this->eavSetupFactory->create(['setup' => $this->setup]); //liên kết những thuộc tính cần thiết cho product type $fieldList = [ 'price', 'special_price', 'special_from_date', 'special_to_date', 'minimal_price', 'cost', 'tier_price', 'weight', ]; foreach ($fieldList as $field) { $applyTo = explode( ',', $eavSetup->getAttribute(\Magento\Catalog\Model\Product::ENTITY, $field, 'apply_to') ); if (!in_array(\ViMagento\HelloWorld\Model\Product\Type::TYPE_ID, $applyTo)) { $applyTo[] = \ViMagento\HelloWorld\Model\Product\Type::TYPE_ID; $eavSetup->updateAttribute( \Magento\Catalog\Model\Product::ENTITY, $field, 'apply_to', implode(',', $applyTo) ); } } } /** * {@inheritdoc} */ public static function getDependencies() { return []; } /** * {@inheritdoc} */ public function getAliases() { return []; } public static function getVersion() { return '1.0.1'; } } |
Tiếp theo các bạn chạy câu lệnh php bin/magento setup:upgrade và sẽ được kết quả như bên dưới:

Composite Products
Khi thêm sản phẩm con cho các loại product kết hợp như grouped product hay bundle product. Hiện tại khi làm đến đây chúng ta chưa thêm được những sản phẩm thuộc custom product type vừa tạo làm sản phẩm con cho các sản phẩm kết hợp. Tức là ví dụ khi bạn thêm một sản phẩm thuộc grouped product, đến khi bạn thêm sản phẩm con cho sản phẩm này thì những sản phẩm thuộc custom product type sẽ không hiển thị cho bạn chọn. Để giải quyết vấn đề này bạn cần cần thêm đoạn code sau vào file product_types.xml đã tạo ở đầu bài viết:
ViMagento/HelloWorld/etc/product_types.xml
1 2 3 4 5 6 7 |
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Catalog:etc/product_types.xsd"> <type name="custom_product_type_code" label="Custom Product Type" modelInstance="ViMagento\HelloWorld\Model\Product\Type"></type> <composableTypes> <type name="custom_product_type_code" /> </composableTypes> </config> |
Kết luận
Vừa rồi tôi đã hướng dẫn các bạn tạo một custom product type trong Magento 2. Qua bài viết này hi vọng các bạn có thể tạo product type của mình. Nếu có bất kỳ thắc mắc nào các bạn có thể để lại bình luận bên dưới để được giải đáp. Thanks.