Een nieuw productkenmerk toevoegen


Bijdragen via pull-verzoeken worden niet ondersteund voor dit onderwerp. Open een GitHub-probleem om feedback te geven.

Het toevoegen van een productkenmerk is een van de meest populaire bewerkingen in zowel Magento 1 als Magento 2. Attributen zijn een krachtige manier om veel praktische taken met betrekking tot een product op te lossen.

Dit is een vrij breed onderwerp, maar in deze video bespreken we het eenvoudige proces van het toevoegen van een dropdown-typekenmerk aan een product.

Ga er voor deze oefening van uit dat de voorbeeldgegevensset is geïnstalleerd.

  • We zullen een attribuut met de naam kleding_materiaal toevoegen met de mogelijke waarden: Katoen, Leer, Zijde, Denim, Bont en Wol.
  • We zullen dit attribuut zichtbaar maken op de productweergavepagina, vetgedrukt.
  • We zullen het toewijzen aan de standaardattributenset en een beperking toevoegen dat “onder”-kleding, zoals broeken, niet het materiaal Bont kan zijn.

We moeten de volgende stappen ondernemen om het nieuwe attribuut toe te voegen:

  1. Maak een nieuwe module aan.
  2. Voeg een InstallData-script toe.
  3. Voeg een bronmodel toe.
  4. Voeg een backend-model toe.
  5. Voeg een frontendmodel toe.
  6. Voer het InstallData-script uit en controleer of het werkt.

Laten we elke stap doornemen.

Stap 1: Maak een nieuwe module

Omdat Magento modulair is, starten we het proces met het maken van een nieuwe module met de naam Learning_ClothingMaterial.

1
cd <magento2_root>/app/code

1
mkdir Learning/ClothingMaterial

Maak nu twee bestanden:

etc/module.xml

Toon code

1
2
3
4
5
6
7
8
9
10
11
12
<?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

Toon code

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

use MagentoFrameworkComponentComponentRegistrar;

ComponentRegistrar::register(
    ComponentRegistrar::MODULE,
    'Learning_ClothingMaterial',
    __DIR__
);

Stap 2 Maak een InstallData-script

Vervolgens moeten we het InstallData-script maken. Omdat het toevoegen van een attribuut technisch gezien records toevoegt aan verschillende tabellen, zoals: eav_attribute en catalog_eav_attribute, dit is gegevensmanipulatie, geen schemawijziging. Daarom gebruiken we InstallData in plaats van InstallSchema.

Maak het bestand app/code/Learning/ClothingMaterial/Setup/InstallData.php:

Toon code

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
<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

namespace LearningClothingMaterialSetup;

use MagentoCatalogModelProduct;
use MagentoEavModelEntityAttributeScopedAttributeInterface;
use MagentoEavSetupEavSetupFactory;
use MagentoFrameworkSetupInstallDataInterface;
use MagentoFrameworkSetupModuleContextInterface;
use MagentoFrameworkSetupModuleDataSetupInterface;

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

    /**
     * Init
     * @param EavSetupFactory $eavSetupFactory
     */
    public function __construct(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(
            Product::ENTITY,
            'clothing_material',
            [
                'group' => 'General',
                'type' => 'varchar',
                'label' => 'Clothing Material',
                'input' => 'select',
                'source' => 'LearningClothingMaterialModelAttributeSourceMaterial',
                'frontend' => 'LearningClothingMaterialModelAttributeFrontendMaterial',
                'backend' => 'LearningClothingMaterialModelAttributeBackendMaterial',
                'required' => false,
                'sort_order' => 50,
                'global' => 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
            ]
        );
    }
}

Laten we even naar de code kijken.

Allereerst moeten we een speciaal setup-object gebruiken, niet degene die als parameter wordt geleverd. Dit komt omdat Catalog een EAV-entiteit is, dus om een ​​attribuut toe te voegen, moeten we eavSetup gebruiken in plaats van de standaardversie. Dit geldt voor elke EAV-entiteit in Magento 2 (categorie, product, klant, enzovoort).

Daarom hebben we eavSetupFactory toegevoegd in een constructor.

Voor de install() methode, alles wat we hoeven te doen is de addAttribute() methode met 3 parameters: entiteitstype, attribuutcode en eigenschappen.

Die eigenschappen bepalen hoe een attribuut zich gedraagt. Een volledige lijst van eigenschappen is te zien in de catalog_eav_attribute en eav_attribute tafels. Merk op dat er een toewijzing is tussen de velden in die tabellen en de eigenschappen in de addAttribute() methode.

Om alle toewijzingen te zien, moet je kijken naar de MagentoCatalogModelResourceModelSetupPropertyMapper klas.

Voor nu zullen we snel de belangrijkste doornemen:

  • groep: Betekent dat we een attribuut toevoegen aan de attributengroep “Algemeen”, die aanwezig is in alle attributensets.
  • type: varchar betekent dat de waarden worden opgeslagen in de tabel catalog_eav_varchar.
  • label: Een label van het attribuut (dat wil zeggen, hoe het wordt weergegeven in de backend en op de frontend).
  • bron/frontend/backend: Speciale klassen die aan het attribuut zijn gekoppeld:
    • bronmodel: biedt een lijst met opties
    • voorkant: bepaalt hoe het moet worden weergegeven op de frontend
    • achterkant: stelt u in staat bepaalde acties uit te voeren wanneer een attribuut wordt geladen of opgeslagen. In ons voorbeeld zal het validatie zijn.
  • Globaal: definieert de reikwijdte van zijn waarden (wereldwijd, website of winkel)
  • zichtbaar_op_front: Een vlag die bepaalt of een attribuut moet worden weergegeven op het tabblad “Meer informatie” op de frontend
  • is_html_allowed_on_front: Definieert of een attribuutwaarde HTML mag bevatten

Stap 3: Voeg een bronmodel toe

Vervolgens moeten we het bronmodel maken:

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

Toon code

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
<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

namespace LearningClothingMaterialModelAttributeSource;

use MagentoEavModelEntityAttributeSourceAbstractSource;

class Material extends 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;
    }
}

Zoals de naam al aangeeft, is de getAllOptions methode biedt een lijst met alle beschikbare opties.

Stap 4: Een backend-model toevoegen

Nu gaan we een backend-model maken:

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

Toon code

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
<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

namespace LearningClothingMaterialModelAttributeBackend;

use MagentoCatalogModelProduct;
use MagentoEavModelEntityAttributeBackendAbstractBackend;
use MagentoFrameworkExceptionLocalizedException;

class Material extends AbstractBackend
{
    /**
     * Validate
     * @param Product $object
     * @throws LocalizedException
     * @return bool
     */
    public function validate($object)
    {
        $value = $object->getData($this->getAttribute()->getAttributeCode());
        if ( ($object->getAttributeSetId() == 10) && ($value == 'wool')) {
            throw new LocalizedException(
                __('Bottom can not be wool.')
            );
        }
        return true;
    }
}

In ons voorbeeld implementeren we alleen de validate() methode.

Het backend-model heeft mogelijk: beforeSave, afterSave, en afterLoad methoden die de uitvoering van een code mogelijk maken op het moment dat een attribuut wordt opgeslagen of geladen. Het backend-model maakt attribuutbeheer tot een echt krachtige methode van maatwerk.

Merk op dat we hardcoded attributeSetId hier voor de tijd. In andere gevallen kan het anders zijn. Zorg ervoor dat u de eav_attribute_set tabel voor de juiste ID.

Stap 5: Voeg een frontendmodel toe

En tot slot maken we een frontend-model om onze waarde vet te maken:

Toon code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

namespace LearningClothingMaterialModelAttributeFrontend;

use MagentoEavModelEntityAttributeFrontendAbstractFrontend;
use MagentoFrameworkDataObject;

class Material extends AbstractFrontend
{
    public function getValue(DataObject $object)
    {
        $value = $object->getData($this->getAttribute()->getAttributeCode());
        return "<b>$value</b>";
    }
}

Net als bij het backend-model is dit ook een heel eenvoudige klasse.

Stap 6: Voer het InstallData-script uit en controleer of het werkt

Nu kunnen we onze code uitvoeren en de resultaten controleren:

1
php bin/magento setup:upgrade

Nadat u dit hebt uitgevoerd, zou het nieuwe kenmerk aan de database moeten zijn toegevoegd. U kunt de eav_attribute en catalog_eav_attribute tabellen om te controleren of het attribuut en zijn eigenschappen aanwezig zijn. We zien ClothingMaterial hier beneden, met de primaire sleutel van 155, en de bijbehorende invoer in catalog_eav_attribute, waarbij de primaire sleutel 155 is.

Laten we nu naar de backend gaan, een configureerbaar product openen, en we zouden dat uitklapmenu voor kledingmateriaal moeten zien. We zullen onze filters instellen als een configureerbaar product met de attributenset “bottom”.

We selecteren het eerste item. Eerst stellen we het kledingmateriaal in op Bont en proberen we ons kenmerk op te slaan. We zien dat ons backend-model succesvol is uitgevoerd, dus nu stellen we het in op Wool en slaan we het op.

Nadat we het product hebben opgeslagen, gaan we nu naar de frontend. Het moet zichtbaar zijn en vetgedrukt zijn.

Optie voor productkenmerk maken

Een productkenmerk van het type multiselect of select biedt de gebruiker selecteerbare opties. Deze opties kunnen handmatig worden toegevoegd via het beheerderspaneel of door een upgradescript. Het scriptproces is iets anders, afhankelijk van of de opties worden toegevoegd op het moment van het aanmaken van attributen of dat de opties op een later tijdstip worden toegevoegd aan een bestaand attribuut.

Opties toevoegen aan een nieuw prideuct-attribuut

Basisinstructies voor het maken van een productkenmerk door een installatie- of upgradescript zijn te vinden bovenstaand. Kies, voordat u scripts maakt voor het maken van attributen, een van deze twee gebruiksscenario’s voor uw opties:

  1. U wilt een reeks opties die niet door een gebruiker kunnen worden gewijzigd via het beheerderspaneel en die alleen kunnen worden gewijzigd door een toekomstige code-push.
  2. U wilt een reeks opties die kunnen worden gewijzigd, toegevoegd of verwijderd via het beheerderspaneel.

Voor gebruik: 1 (een ‘onveranderlijke’ reeks opties), volg de bovenstaande instructies “Voeg een bronmodel toe”. U maakt een model dat de selecteerbare opties van het kenmerk bevat en dynamisch terugstuurt naar de client.

Voor gebruik: 2 (een ‘veranderlijke’ set van opties), zie “EAV- en extensie-attributen”. Zorg ervoor dat u ‘MagentoEavModelEntityAttributeSourceTable’ declareert als de waarde voor de kenmerkoptie ‘source’. Dit zorgt ervoor dat Magento opties opslaat in de juiste databasetabel.

Met MagentoEavSetupEavSetup.php::addAttribute() en MagentoEavSetupEavSetup.php::addAttributeOptions() je kunt een reeks opties toevoegen met de volgende array:

1
'option' => ['values' => ['Option 1', 'Option 2', 'Option 3', etc.]];

Als alternatief kunt u als volgt een specifieke sorteervolgorde voor opties aanwijzen:

1
'option' => ['values' => [8 => 'Option 1', 3 => 'Option 2', 11 => 'Option 3', etc.]]

Opties toevoegen aan een bestaand productkenmerk

  • Om opties toe te voegen aan een ‘onveranderlijke’ set opties, wijzigt u het aangepaste bronmodel met de extra opties die u wilt bieden.

  • Het toevoegen van opties aan een ‘veranderlijke’ set opties maakt gebruik van hetzelfde EavSetup object zoals u gebruikt bij het maken van een attribuut met opties, maar vereist een extra stap omdat EavSetup moet weten aan welk attribuut u nieuwe opties wilt toewijzen.

  1. Wijs een reeks nieuwe opties toe aan een variabele:
1
   $options = ['attribute_id' => null, 'values' => 'Option 1', 'Option 2', etc]];

  1. Werk uw array bij met het attribuut-ID uit de database:
1
   $options['attribute_id'] = $eavSetup->getAttributeId($eavSetup->getEntityTypeId('catalog_product'), 'your_attribute_code');

  1. Voeg uw opties toe:
1
   $eavSetup->addAttributeOption($options);

badges

Let’s connect

We hebben altijd zin in nieuwe en uitdagende projecten. We gaan graag met je in gesprek!