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:
- Maak een nieuwe module aan.
- Voeg een InstallData-script toe.
- Voeg een bronmodel toe.
- Voeg een backend-model toe.
- Voeg een frontendmodel toe.
- 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
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
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
:
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
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
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:
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:
- 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.
- 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 omdatEavSetup
moet weten aan welk attribuut u nieuwe opties wilt toewijzen.
- Wijs een reeks nieuwe opties toe aan een variabele:
1
$options = ['attribute_id' => null, 'values' => 'Option 1', 'Option 2', etc]];
- Werk uw array bij met het attribuut-ID uit de database:
1
$options['attribute_id'] = $eavSetup->getAttributeId($eavSetup->getEntityTypeId('catalog_product'), 'your_attribute_code');
- Voeg uw opties toe:
1
$eavSetup->addAttributeOption($options);