Magento 2开发教程 - 如何添加新产品属性

添加产品属性是一种在Magento 1 和 Magento 2最受欢迎的业务。 属性是解决许多与产品相关的实际任务的有力方法。

这是一个相当广泛的话题,但在这个视频中,我们将讨论添加一个下拉类型属性到产品的简单过程。

对于这个练习,假定安装了示例数据集。

  • 我们将添加一个属性叫做clothing_material与可能的值:Cotton, Leather, Silk, Denim, Fur, 和 Wool.
  • 我们将在“产品视图”页面上以粗体文本显示此属性。
  • 我们将它分配给默认属性集,并添加一个限制,任何“底部”的衣服,如休闲裤,不能是材料毛皮。

我们需要采取以下步骤来添加新的属性:

  1. 创建新模块.
  2. 添加一个安装数据脚本。
  3. 添加源模型。
  4. 添加后端模型。
  5. 添加前端模型
  6. 执行安装数据脚本验证它的工作。

让我们走过每一步。

1:创建新模块

如Magento是模块化的,我们通过创建一个新的模块称为启动过程Learning_ClothingMaterial.

$ cd <magento2_root>/app/code
$ mkdir Learning
$ mkdir Learning/ClothingMaterial

现在,创建两个文件:

etc/module.xml

<?xml version="1.0"?>
<!--
/**
 * Copyright ? 2016 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
  <module name="Learning_ClothingMaterial" setup_version="0.0.1">
  </module>
</config>

registration.php

/**
 * Copyright ? 2016 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    ‘Learning_ClothingMaterial‘,
    __DIR__
);

2:创建安装数据脚本

接下来,我们需要创建安装数据脚本 因为在技术上添加属性将记录添加到多个表中,例如 eav_attributecatalog_eav_attribute, 这是数据操作,而不是模式更改。 因此,我们用installschema 和 installdata。

创建文件 app/code/Learning/ClothingMaterial/Setup/InstallData.php:

/**
 * Copyright ? 2016 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */

namespace Learning\ClothingMaterial\Setup;

use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;

/**
* @codeCoverageIgnore
class InstallData implements InstallDataInterface
{
    /**
     * Eav setup factory
     * @var EavSetupFactory
     */
    private $eavSetupFactory;

    /**
     * Init
     * @param CategorySetupFactory $categorySetupFactory
     */
    public function __construct(\Magento\Eav\Setup\EavSetupFactory $eavSetupFactory)
    {
        $this->eavSetupFactory = $eavSetupFactory;
    }

    /**
     * {@inheritdoc}
     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
     * @SuppressWarnings(PHPMD.NPathComplexity)
     */
    public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
        $eavSetup = $this->eavSetupFactory->create();
        $eavSetup->addAttribute(
            \Magento\Catalog\Model\Product::ENTITY,
            ‘clothing_material‘,
            [
                ‘group‘ => ‘General‘,
                ‘type‘ => ‘varchar‘,
                ‘label‘ => ‘Clothing Material‘,
                ‘input‘ => ‘select‘,
                ‘source‘ => ‘Learning\ClothingMaterial\Model\Attribute\Source\Material‘,
                ‘frontend‘ => ‘Learning\ClothingMaterial\Model\Attribute\Frontend\Material‘,
                ‘backend‘ => ‘Learning\ClothingMaterial\Model\Attribute\Backend\Material‘,
                ‘required‘ => false,
                ‘sort_order‘ => 50,
                ‘global‘ => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL,
                ‘is_used_in_grid‘ => false,
                ‘is_visible_in_grid‘ => false,
                ‘is_filterable_in_grid‘ => false,
                ‘visible‘ => true,
                ‘is_html_allowed_on_front‘ => true,
                ‘visible_on_front‘ => true
            ]
        );
    }
}

让我们花点时间看看代码。

首先,我们需要使用一个特殊的设置对象,而不是作为参数的对象。
这是因为目录是一个EAV的实体,所以添加一个属性,我们要用eavsetup而不是标准。
这也适用于在Magento 2任何EAV实体(类,产品,客户,等等)。

这就是为什么我们说在构造函数eavsetupfactory。

install() 方法, 我们所要做的就是给 addAttribute() 方法3个参数,实体类型、属性代码和属性。

这些属性定义属性的行为。
可以看到一个完整的属性列表 catalog_eav_attributeeav_attribute 表。
注意,这些表中的字段与属性在addAttribute() 方法。

要查看所有映射,您应该查看\Magento\Catalog\Model\ResourceModel\Setup\PropertyMapper 类.

3: 添加资源模型

接下来,我们需要创建资源模型:

app/code/Learning/ClothingMaterial/Model/Attribute/Source/Material.php

/**
 * Copyright ? 2016 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */

namespace Learning\ClothingMaterial\Model\Attribute\Source;

class Material extends \Magento\Eav\Model\Entity\Attribute\Source\AbstractSource
{
    /**
     * Get all options
     * @return array
     */
    public function getAllOptions()
    {
        if (!$this->_options) {
            $this->_options = [
                [‘label‘ => __(‘Cotton‘), ‘value‘ => ‘cotton‘],
                [‘label‘ => __(‘Leather‘), ‘value‘ => ‘leather‘],
                [‘label‘ => __(‘Silk‘), ‘value‘ => ‘silk‘],
                [‘label‘ => __(‘Denim‘), ‘value‘ => ‘denim‘],
                [‘label‘ => __(‘Fur‘), ‘value‘ => ‘fur‘],
                [‘label‘ => __(‘Wool‘), ‘value‘ => ‘wool‘],
            ];
        }
        return $this->_options;
    }
}

顾名思义,是 getAllOptions方法提供所有可用选项的列表。

4: 添加后端模型

app/code/Learning/ClothingMaterial/Model/Attribute/Backend/Material.php

/**
 * Copyright ? 2016 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */

namespace Learning\ClothingMaterial\Model\Attribute\Backend;

class Material extends \Magento\Eav\Model\Entity\Attribute\Backend\AbstractBackend
{
    /**
     * Validate
     * @param \Magento\Catalog\Model\Product $object
     * @throws \Magento\Framework\Exception\LocalizedException
     * @return bool
     */
    public function validate($object)
    {
        $value = $object->getData($this->getAttribute()->getAttributeCode());
        if ( ($object->getAttributeSetId() == 10) && ($value == ‘wool‘)) {
            throw new \Magento\Framework\Exception\LocalizedException(
                __(‘Bottom can not be wool.‘)
            );
        }
        return true;
    }
}

5: 添加一个前端模型

namespace Learning\ClothingMaterial\Model\Attribute\Frontend;

class Material extends \Magento\Eav\Model\Entity\Attribute\Frontend\AbstractFrontend
{
    public function getValue(\Magento\Framework\DataObject $object)
    {
        $value = $object->getData($this->getAttribute()->getAttributeCode());
        return "<b>$value</b>";
    }
}

与后端模型一样,这也是一个非常简单的类。

6: 执行installdata脚本验证它的工作

现在我们可以运行我们的代码和检查结果:

$ cd <magento2_root>
$ php bin/magento setup:upgrade

运行此之后,新属性应该已添加到数据库中。 您可以检查 eav_attributecatalog_eav_attribute 表来验证属性及其属性是否存在。

查看原文

时间: 2024-10-13 06:33:29

Magento 2开发教程 - 如何添加新产品属性的相关文章

转:ios开发--给应用添加新的字体的方法

1.网上搜索字体文件(后缀名为.ttf,或.odf) 2.把字体库导入到工程的resouce中 3.在程序添加以下代码 输出所有字体 NSArray *familyNames = [UIFont familyNames];      for( NSString *familyName in familyNames ){          printf( "Family: %s \n", [familyName UTF8String] );          NSArray *fontN

Magento入门开发教程

Modules->模块 Controller->控制器 Model->模型 Magento是这个星球上最强大的购物车网店平台.当然,你应该已经对此毫无疑问了.不过,你可能还不知道,Magento同样是一个面向对象的PHP框架.你可以配合Magento购物车程序强大的功能,开发动态WEB应用程序. 这是Magento中文开发手册的开篇,我们会在整个手册中介绍绝大部分Magento的开发框架特性.不要想在这片文章中立刻掌握所有的特性.这仅仅是个开始,但是足够让你在同行中鹤立鸡群了. 在这片文

Magento 2开发教程 - 创建新模块

视频在youtube网站国内访问不了,可以使用FQ软件查看. 视频地址:www.youtube.com/embed/[email protected]=1 下面是视频文字介绍: Magento 2系统整体结构是建立在模块的基础上.通常,创建定制的第一步是构建模块. 要创建模块,需要完成以下步骤: 创建模块文件夹 创建 etc/module.xml 文件. 创建 registration.php 文件. 运行 bin/magento setup:upgrade脚本安装新模块 检查模块是否正常工作

星辉Odoo开发教程4-创建新的模型(Model)

模型是应用的基本组件,包含了所需使用到的数据结构和存储.接下来我们就为 To-do 项目添加模型,将包含三个字段:? Description? Is done? 标记? Work team 用户列表 如前所述,通过菜单 Settings > Technical > Database Structure > Models 可进入模型创建页面,步骤如下:1. 进入模型菜单,点击左上角 Create 按钮,在弹出页面填入:? Model Description: To-do Item? Mod

ios开发--给应用添加新的字体的方法

1.网上搜索字体文件(后缀名为.ttf,或.odf) 2.把字体库导入到工程的resouce中 3.在程序添加以下代码 输出所有字体 NSArray *familyNames = [UIFont familyNames];      for( NSString *familyName in familyNames ){          printf( "Family: %s \n", [familyName UTF8String] );          NSArray *fontN

CTFd 二次开发之注册处添加新的个人属性

菜的扣脚的我为了使在 CTFd 中注册页面中新增一个学号的功能,捣鼓了半天.最后终于弄好了,这里做下总结.个人对 flask 还是不是很熟悉.. 这里以添加一个 sid 的字段为例 数据库配置 在 mysql 数据库中添加一个列名为 sid 的字段名 alter table users add column sid varchar(20) default 0; 有两个注意的点: 字段需要设置默认值,不然 flask 会报错 字段位置不能在中间的某个位置,只能放置在最后面(默认是最后) html

Magento2开发教程 - 如何向数据库添加新表

Magento 2具有特殊的机制,允许你创建数据库表,修改现有的,甚至添加一些数据到他们(如安装数据,已被添加在模块安装). 这种机制允许这些变化可以在不同的设备之间传输. 关键的概念是,而不是做你能做的一次又一次重新安装系统时,手动SQL操作,开发人员创建一个安装(或升级)脚本包含数据. 每次安装模块时,脚本将被执行. Magento 2有四种类型的脚本:installschema,installdata,upgradeschema和upgradedata. 安装脚本只执行一次,而升级脚本每次

Drupal8开发教程:模块开发——创建新页面

之前我们已经通过<Drupal8开发教程:认识.info.yml文件>对模块的YAML文件有了了解,今天我们来看如何通过模块开发的方式添加一个新的页面. 在 Drupal 7 中,通过模块添加新页面非常简单,使用 hook_menu 定义路径及回调函数返回要显示的结果即可.但 Drupal 8 却要麻烦很多,虽然也是定义路径,然后关联用于显示内容的函数,但却要在两个文件中分开进行.而且 Controller 文件还有目录结构要求,这些变化都需要慢慢来适应了. 除了上文中定义的 hello_wo

Unity 2D游戏开发教程之为游戏场景添加多个地面

Unity 2D游戏开发教程之为游戏场景添加多个地面 为游戏场景添加多个地面 显然,只有一个地面的游戏场景太小了,根本不够精灵四处活动的.那么,本节就来介绍一种简单的方法,可以为游戏场景添加多个地面.具体的操作方法是: (1)在Project视图里,新建一个文件夹,命名为Prefabs.然后将Hierarchy视图里的Platform对象,拖动到Prefabs文件夹中,如此一来就可以生成一个同名的预置资源,如图2-11所示. 图2-11  通过拖动对象到Project视图的方式,新建预置资源 (