自定义产品类型在Magento 2

自定义产品类型在Magento 2

2016年6月24日发布 in 发展历程
Magento 2.1发布
Magento发布2.1
2016年6月23日
优雅的骆马 支持s Ride for Korah
2016年6月29日

总览

Magento支持多种产品类型,每种产品都有自己的行为和属性。这个强大的概念允许Magento通过在目录中混合和匹配产品体验来支持广泛的行业和商人需求。

但是,开发人员更容易添加新产品类型。

通常,当产品类具有不同的行为或属性时,应使用其自己的产品类型来表示。这使产品类型具有复杂的自定义逻辑和表示形式,而不会影响其他产品类型—确保本地产品类型可以继续按预期运行。

实作

配置XML

与Magento中的大多数内容一样,定义自定义产品类型的第一步涉及XML声明。具体来说,在 <Vendor>/<Module>/etc/product_types.xml,请添加以下形式的XML代码段,以声明新产品类型的关键信息。

XHTML
1
2
3
4
5
<?XML文件 ="1.0"?>
<config XML文件ns:si="http://www.w3.org/2001/XMLSchema-instance" si:noNamespaceSchemaLocation=“ ur:magento:模块:Magento_Catalog:etc / product_types.xsd”>
    <type 名称=“ custom_product_type_code” 标签=“自定义产品类型标签” modelInstance="供应商\Module\Model\Product\Type">
    </type>
</config>

类型 节点具有三个必需的属性。

  • 名称: 此属性定义在代码和数据库中使用的定制产品代码。
  • 标签: 在Magento管理员中定义产品类型标签。
  • modelInstance: 指定相应产品类型模型的标准名称空间。

尽管还有许多其他节点和属性可能会影响产品类型定义,但这只是最简单的例子。

产品型号

声明了产品类型后,下一个关键组件是产品类型模型。每个产品实例都与相应产品的实例相关联 类型 模型。该模型有机会修改产品类型的行为和属性,并在许多产品操作过程中被调用。

产品类型型号摘要

产品模型必须继承自 \ Magento \目录\模型\产品\类型\ 抽象类型 基类。基类只有一种抽象方法: deleteTypeSpecificData。如果产品实例的类型已更改,则会在产品实例保存期间调用此奇怪的特定方法,该方法使原始产品类型有机会在类型更改完成之前清除所有特定于类型的数据。

除非新的自定义产品类型具有此类特定于类型的数据,否则可以使用空方法覆盖该方法。

最后,尽管没有严格要求,但产品类型模型通常会包含名称为常量的常量 TYPE_CODE 它定义了产品类型代码字符串,因此可以以一致的方式在代码中引用它。

的PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
 
命名空间 供应商\模组\模型\产品;
 
类型 延伸 \Magento\目录\模型\产品\类型\抽象类型
{
    const TYPE_ID = 'custom_product_type_code';
 
    / **
     * {@inheritdoc}
     * /
    上市 功能 deleteTypeSpecificData(\Magento\目录\模型\产品 $产品)
    {
        //方法故意为空
    }
}

核心产品类型

自定义产品类型的行为通常与核心产品类型的行为相似且具有相似的要求。在这种情况下,可以方便地扩展一种核心产品类型而不是直接扩展抽象产品。

以下产品类型类在内核中本机可用。

  • 简单:\ Magento \ 目录 \ 模型 \ 产品 \ 类型 \ Simple
  • 虚拟:\ Magento \ 目录 \ 模型 \ 产品 \ 类型 \ Virtual
  • 可配置:\ Magento \ ConfigurableProduct \ 模型 \ 产品 \ 类型 \ Configurable
  • 分组:\ Magento \ GroupedProduct \ 模型 \ 产品 \ 类型 \ Grouped
  • 可下载的:\ Magento \ Downloadable \ 模型 \ 产品 \ 类型
  • 套件:\ Magento \ Bundle \ 模型 \ 产品 \ 类型
  • 礼品卡(仅企业版):\ Magento \ GiftCard \ 模型 \ 目录 \ 产品 \ 类型 \ Giftcard

结果

一旦用XML声明了产品类型并创建了相关的产品类型模型,便可以在管理员中创建新类型的产品。

m2定制产品类型

附加步骤

成功创建新产品类型后,有一些常规(尽管可选)步骤可以充分利用它。

与通用属性相关

由于可以将产品属性划分为相关的产品类型,因此任何已经划分范围的核心属性都将不适用于新产品类型。任何这样的属性 确实需要将相关数据与安装数据脚本中的新产品类型相关联。

的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
<?php
 
命名空间 供应商\模组\建立;
 
使用 Magento\伊夫\建立\伊夫设置;
使用 Magento\伊夫\建立\伊夫设置Factory;
使用 Magento\构架\建立\安装数据Interface;
使用 Magento\构架\建立\模组ContextInterface;
使用 Magento\构架\建立\模组DataSetupInterface;
 
安装数据 实施 安装数据Interface
{
    / **
     * EAV设置工厂
     *
    * @var 伊夫设置Factory
     * /
    受保护的 $ eavSetupFactory;
 
    / **
     * 在里面
     *
    * @参数EavSetupFactory $ eavSetupFactory
     * /
    上市 功能 __构造(伊夫设置Factory $ eavSetupFactory)
    {
        $ this->eavSetupFactory = $ eavSetupFactory;
    }
 
    / **
     * {@inheritdoc}
     * /
    上市 功能 安装(模组DataSetupInterface $设置, 模组ContextInterface $ context)
    {
        / ** @var 伊夫设置 $ eavSetup * /
        $ eavSetup = $ this->eavSetupFactory->创建(['建立' => $设置]);
        
        //将这些属性与新产品类型相关联
        $ fieldList = [
            '价钱',
            '特惠价',
            'special_from_date',
            'special_to_date',
            'minimal_price',
            '成本',
            'tier_price',
            '重量',
        ];
 
        //使这些属性适用于新产品类型
        前言 ($ fieldList $ field) {
            $ applyTo = 爆炸(
                ',',
                $ eavSetup->getAttribute(\Magento\目录\模型\产品::实体, $ field, '适用于')
            );
            如果 (!在 _array(\供应商\模组\模型\产品\类型::TYPE_ID, $ applyTo)) {
                $ applyTo[] = \供应商\模组\模型\产品\类型::TYPE_ID;
                $ eavSetup->updateAttribute(
                    \Magento\目录\模型\产品::实体,
                    $ field,
                    '适用于',
                    内爆(',', $ applyTo)
                );
            }
        }
    }
}

此示例安装脚本将价格和重量属性关联到 $ fieldList 具有新产品类型的数组。运行此安装脚本后,在编辑或创建新类型的产品时,这些产品属性将显示在管理员中。

复合产品

将子产品添加到组合产品类型(分组的,可配置的或捆绑的产品)时,管理界面将仅显示相关产品类型已明确声明其资格为组合产品的子产品的产品。通过将节点添加到新产品类型,可以使自己成为复合产品类型的子级。 composableTypes 节点在 供应商/Module/etc/product_types.xml .

XHTML
1
2
3
4
5
6
7
8
<?XML文件 ="1.0"?>
<config XML文件ns:si="http://www.w3.org/2001/XMLSchema-instance" si:noNamespaceSchemaLocation=“ ur:magento:模块:Magento_Catalog:etc / product_types.xsd”>
    <type 名称=“ custom_product_type_code” 标签=“自定义产品类型标签” modelInstance="供应商\Module\Model\Product\Type">
    </type>
    <composableTypes>
        <type 名称=“ custom_product_type_code” />
    </composableTypes>
</config>

从这往哪儿走

创建新产品类型仅仅是个开始。定义完成后,新产品类型为范围内的自定义提供了巨大的功能。

产品类型型号方法

产品的行为会受到产品类型模型中的替代方法的显着影响。这允许将自定义行为封装在产品类型中,而不是全局观察者/插件中。

此类方法的一些示例:

  • beforeSave()和save():这些方法分别在给定类型的产品的beforeSave()和afterSave()过程中运行。
  • isSalable():允许自定义产品类型自定义产品可销售性。
  • _prepareProduct():当产品最初添加到购物车时,它提供了一个钩子,可以通过请求与信息进行交互。

价格模型

除了产品类型模型之外,模块还可以在产品类型定义XML中指定价格模型。

XHTML
1
2
3
4
5
6
<?XML文件 ="1.0"?>
<config XML文件ns:si="http://www.w3.org/2001/XMLSchema-instance" si:noNamespaceSchemaLocation=“ ur:magento:模块:Magento_Catalog:etc / product_types.xsd”>
    <type 名称=“ custom_product_type_code” 标签=“自定义产品类型标签” modelInstance="供应商\Module\Model\Product\Type">
    <priceModel 实例="供应商\Module\Model\Product\Price" />
    </type>
</config>

引用的价格模型应扩展 \ Magento \目录\型号\产品\类型\价格。该类没有必须实现的抽象方法,但允许扩展类与价格计算的几乎每个方面进行交互。

概要

通过提供定义自定义产品类型的框架,Magento使商家和开发人员能够实施重要的自定义以满足业务需求,而不会冒默认产品行为的风险。

13 评论s

  1. PJ 说:

    数据设置脚本不起作用。它给出了一个错误:
    安装数据…

    [Exception]注意:未定义的索引:D:wamp64www..vendorm agentomodule-eavSetupEavSetup.php中的object_type_id,行1065

    设置:升级[–keep-generated] [–magento-init-params=”…”]

  2. 阿巴斯 说:

    谢谢您这么简单的帖子。

    我正在尝试创建一种新产品类型,其基本功能类似于该产品的可配置产品,’s为什么我使用\ Magento \ ConfigurableProduct \ 模型 \ 产品 \ 类型 \ Configurable扩展产品类型,但仍未显示Configurable的功能。例如,我的自定义产品类型在创建我的自定义产品类型时未显示“税种”字段和“配置”选项卡。

    您能帮我实现它吗?非常感谢你

    • 安迪·迈尔斯(Andy Myers) 说:

      Anyone facing the same problem I sorted this by adding tax_class_id to the $ fieldList variable.

  3. 塔兹 说:

    我遵循了本教程,但是在管理员中,当我创建产品时,它不显示价格选项。你能提供一些意见吗?

  4. 亚历克斯 说:

    感谢您的分享,这是另一本对我有帮助的指南, //www.cloudways.com/blog/magento-2-bundle-products/

  5. 夏登 说:

    我是Magento 2的新手,但是在如何从管理控制台的下拉菜单中删除/隐藏核心产品类型时遇到问题。
    非常感谢,

  6. 佛陀 说:

    在我的项目中,我们对厨柜的供应以及我们需要哪种产品类型提出了要求,这让我感到困惑。那你可以指导我吗?

  7. 拉文德拉 说:

    很棒的帖子,我真的很感激这篇帖子,看来那里’这个网站上有很多有趣的东西,我会在您的页面上添加书签,以获取您网站上的更多新更新。保持 。

  8. 卡萨塔 说:

    I’d想创建可以运输或下载的产品。有人对实现它有想法吗?我要这样做是为了避免创建包含简单产品和可下载产品的分组产品(这是我到目前为止所做的)。

  9. 来自Magecom的Kirill 说:

    感谢有用的文章。
    顺便说一句,在Magento 2.3中,我面临下一个问题– there’对于xml中的类型标记,还需要一个attrubute– isQty=”true”。如果没有这个,你就可以’当您要填写管理员时,请为给定类型的产品设置数量。
    因此,Magento 2.3的最终解决方案应该是这样的:

  10. Ars 说:

    请撰写有关的教程
    如何扩展捆绑产品类型’不工作,我没有’t found any help…..

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.

最近的帖子查看全部
2020年10月22日
通过 阿什莉·科利弗 商业见解, 优雅的骆马 2020年10月22日
毫无疑问,2020年是历史性的一年。火灾,全球大流行,暴动,老虎王等’只是冰山一角。如 […]