Magento 2: - Auswahlattribut zur Kategorie hinzufügen

9

Ich möchte einer Kategorie ein Auswahl- / Dropdown-Attribut hinzufügen und es im Backend anzeigen, damit der Ladenbesitzer es auswählen kann. Nach einigen Recherchen fand ich Folgendes heraus:

  • Erstellen Sie ein Attribut über Setupscript
  • Fügen Sie es über die UI-Komponentendeklaration ein

Das habe ich also getan:

public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
{
    /** @var $eavSetup \Magento\Eav\Setup\EavSetup */
    $eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);

    $eavSetup->addAttribute(
        \Magento\Catalog\Model\Category::ENTITY,
        'attribute_code',
        [
            'type' => 'int',
            'label' => 'Top Navigation CMS Block',
            'input' => 'select',
            'source' => 'Magento\Catalog\Model\Category\Attribute\Source\Page',
            'required' => false,
            'sort_order' => 10,
            'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE,
            'group' => 'MyOwnGroup'
        ]
    );
}

view / adminhtml / ui_component / category_form.xml:

<?xml version="1.0" encoding="UTF-8"?>
<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <fieldset name="content">
        <field name="attribute_code">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="sortOrder" xsi:type="number">61</item>
                    <item name="dataType" xsi:type="string">string</item>
                    <item name="formElement" xsi:type="string">select</item>
                    <item name="label" xsi:type="string" translate="true">Top Navigation CMS Block</item>
                </item>
            </argument>
        </field>
    </fieldset>
</form>

Das reicht aber nicht aus, die Sortierung der Tabs im Backend ist durcheinander. Auch das Dropdown wird gerendert, jedoch ohne Optionen. Also habe ich herausgefunden, dass man auch bearbeiten muss Magento\Catalog\Model\Category\DataProvider::getFieldsMap(). Dazu müssen wir es über di.xml überschreiben:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Magento\Catalog\Model\Category\DataProvider" type="Vendor\Module\Model\Category\DataProvider" />
</config>

Im moduleigenen Datenprovider müssen Sie das Attribut in die Funktion einfügen. Und dann funktioniert es.

Also hier sind meine Fragen:

  • Ich denke nicht, dass Sie diesen Datenprovider wirklich überschreiben müssen, damit er funktioniert. Es muss einen besseren Weg geben
  • Es gibt 3 Stellen im Code, an denen Sie das neue Attribut deklarieren müssen (Setup-Skript, UI-Komponente, Datenprovider). Ich kann nicht glauben, dass so viel Overhead notwendig ist.
  • Warum haben Sie redundante Informationen für das Attribut? Das Label befindet sich beispielsweise im Setup-Skript UND in der UI-Komponente, wobei das Label im Backend aus der Deklaration der UI-Komponente gelesen wird.
Prüfer
quelle
Ich erstelle bereits ein Kategorieattribut vom Dropdown-Typ. Es ist nicht erforderlich, über DataProvider zu verfügen.
Dhiren Vasoya
Können Sie Ihre Lösung veröffentlichen?
Tester
Ich poste eine Antwort, bitte überprüfen.
Dhiren Vasoya
Mögliches Duplikat von Magento2.1 Kategorie benutzerdefinierte Attribut Dropdown
Teja Bhagavan Kollepara

Antworten:

3

Sie müssen der UI-Komponentenkonfiguration einen Knoten "Optionen" hinzufügen

<field name="roflcopter">
    <argument name="data" xsi:type="array">
        <item name="options" xsi:type="object">Magento\Catalog\Model\Category\Attribute\Source\Page</item>
        <item name="config" xsi:type="array">
            <item name="sortOrder" xsi:type="number">70</item>
            <item name="dataType" xsi:type="string">string</item>
            <item name="formElement" xsi:type="string">select</item>
            <item name="label" xsi:type="string" translate="true">Roflcopter</item>
        </item>
    </argument>
</field>

von hier genommen Magento2.1 Kategorie benutzerdefinierte Attribut Dropdown

Eugen Bogdanovich
quelle
2

Ich habe den folgenden Code verwendet, um ein Attribut in InstallData.php zu erstellen .

Vendor \ Extension \ Setup \ InstallData.php

<?php
namespace Vendor\Extension\Setup;

use Magento\Eav\Setup\EavSetup;
use Magento\Eav\Setup\EavSetupFactory;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;

class InstallData implements InstallDataInterface
{
    private $eavSetupFactory;

    public function __construct(EavSetupFactory $eavSetupFactory)
    {
        $this->eavSetupFactory = $eavSetupFactory;
    }

    public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
        $setup->startSetup();
        $eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);

        //Category Attribute Create Script
        $eavSetup->addAttribute(
            \Magento\Catalog\Model\Category::ENTITY,
            'attribute_id',
            [
                'group' => 'Mygroup',
                'label' => 'Attribute Label',
                'type'  => 'int',
                'input' => 'boolean',
                'source' => 'Magento\Eav\Model\Entity\Attribute\Source\Boolean',
                'source' => '',
                'required' => false,
                'sort_order' => 1,
                'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE,
                'used_in_product_listing' => true,
                'visible_on_front' => false
            ]
        );

        $setup->endSetup();
    }
}

Und dann erstelle ich eine Datei category_form.xml

Vendor \ Extension \ view \ adminhtml \ ui_component \ category_form.xml

<?xml version="1.0" encoding="UTF-8"?>
<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <fieldset name="attribute_id">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="label" xsi:type="string" translate="true">Attribute Label</item>
                <item name="collapsible" xsi:type="boolean">true</item>
                <item name="sortOrder" xsi:type="number">25</item>
            </item>
        </argument>
        <field name="attribute_id">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="sortOrder" xsi:type="number">20</item>
                    <item name="dataType" xsi:type="string">boolean</item>
                    <item name="formElement" xsi:type="string">checkbox</item>
                    <item name="source" xsi:type="string">category</item>
                    <item name="prefer" xsi:type="string">toggle</item>
                    <item name="valueMap" xsi:type="array">
                        <item name="true" xsi:type="string">1</item>
                        <item name="false" xsi:type="string">0</item>
                    </item>
                    <item name="validation" xsi:type="array">
                        <item name="required-entry" xsi:type="boolean">false</item>
                    </item>
                    <item name="default" xsi:type="string">0</item>
                    <item name="label" xsi:type="string" translate="true">Attribute Label</item>
                </item>
            </argument>
        </field>
</form>
Dhiren Vasoya
quelle
Wie erstellen Sie benutzerdefinierte Werte für Ihr Dropdown-Menü und lassen diese speichern? Bitte sehen Sie: magento.stackexchange.com/questions/181756/…
heady12