Magento 2开发教程

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

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

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

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

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

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

让我们走过每一步。

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;/*** @codeCoverageIgnoreclass 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 表来验证属性及其属性是否存在。

查看原文

与其在那里苦苦挣扎,碍于面子硬撑,倒不如微笑着面对,

Magento 2开发教程

相关文章:

你感兴趣的文章:

标签云: