Wie kann ich ein benutzerdefiniertes Quellmodell für ein Produktattribut mit mehreren Auswahlmöglichkeiten in Magento 2 verwenden?

7

Ich habe in Magento 2 ein Attribut des Typs erstellt multiselectund möchte es nun mit einem benutzerdefinierten Quellmodell füllen.

Jetzt erinnere ich mich an Magento 1, dass Sie das Attribut in der Datenbank manuell bearbeiten und source_modelden Pfad des Quellmodells festlegen mussten, wenn Sie dies tun wollten .

Wenn ich dies jedoch in Magento 2 mache, wird eine Fehlermeldung angezeigt. Ich änderte source_modelin eav_attributezu Vendor\Module\Model\Config\Source\Product\Attributes, aber wenn ich das Produkt im Admin bearbeiten möchten, ich die folgende Fehlermeldung erhalten:

Fatal error: Uncaught Error: Call to undefined method Vendor\Module\Model\Config\Source\Product\Attributes::setAttribute() in .../vendor/magento/module-eav/Model/Entity/Attribute/AbstractAttribute.php:547

Stack trace: #0 .../var/generation/Magento/Catalog/Model/ResourceModel/Eav/Attribute/Interceptor.php(1129): Magento\Eav\Model\Entity\Attribute\AbstractAttribute->getSource()
#1 .../vendor/magento/module-backend/Block/Widget/Form.php(232): Magento\Catalog\Model\ResourceModel\Eav\Attribute\Interceptor->getSource()
#2 .../vendor/magento/module-backend/Block/Widget/Form.php(201): Magento\Backend\Block\Widget\Form->_applyTypeSpecificConfig('multiselect', Object(Magento\Framework\Data\Form\Element\Multiselect), Object(Magento\Catalog\Model\ResourceModel\Eav\Attribute\Interceptor))
#3 .../vendor/magento/module-catalog/Block/Adminhtml/Product/Edit/Tab/Attributes.php(51): Magento\Backend\Block\Widget\Form->_setFieldset(Array, Object(Magento\Framework\Data\Form\El in .../vendor/magento/module-eav/Model/Entity/Attribute/AbstractAttribute.php on line 547

Weiß jemand, wie ich ein Produktattribut mit einem benutzerdefinierten Quellmodell erstellen kann?

Bearbeiten:

Aktuelles Quellmodell:

use Vendor\Module\Model\Config\Source\AbstractSource;
use Magento\Catalog\Model\ResourceModel\Eav\AttributeFactory;
use Magento\Eav\Model\Entity\Attribute;
use Magento\Eav\Model\Entity\TypeFactory;

/**
 * Class Attributes
 */
class Attributes extends AbstractSource
{
    /**
     * @var AttributeFactory
     */
    protected $attributeFactory;

    /**
     * @var TypeFactory
     */
    protected $eavTypeFactory;

    /**
     * Attributes constructor.
     * @param AttributeFactory $attributeFactory
      @param TypeFactory $typeFactory
     */
    public function __construct(
        AttributeFactory $attributeFactory,
        TypeFactory $typeFactory
    )
    {
        $this->attributeFactory = $attributeFactory;
        $this->eavTypeFactory = $typeFactory;
    }

    /**
     * @return array
     */
    public function toArray()
    {
        $arr = [];

        $entityType = $this->eavTypeFactory->create()->loadByCode('catalog_product');        
        $collection = $this->attributeFactory->create()->getCollection();
        $collection->addFieldToFilter('entity_type_id', $entityType->getId());
        $collection->setOrder('attribute_code');

        /** @var Attribute $attribute */
        foreach ($collection as $attribute) {
            $arr[$attribute->getAttributeId()] = $attribute->getFrontendLabel();
        }

        return $arr;
    }
}

Klasse Vendor\Module\Model\Config\Source\AbstractSource:

namespace Vendor\Module\Model\Config\Source;

abstract class AbstractSource implements \Magento\Framework\Option\ArrayInterface
{
    /**
     * Options getter
     * @return array
     */
    final public function toOptionArray()
    {
        $arr = $this->toArray();
        $ret = [];

        foreach ($arr as $key => $value) {
            $ret[] = [
                'value' => $key,
                'label' => $value
            ];
        }

        return $ret;
    }

    /**
     * Get options in "key-value" format
     * @return array
     */
    public function toArray()
    {
        return [];
    }
}
Giel Berkers
quelle
Veröffentlichen Sie Ihren aktuellen Quellmodellcode.
Ryan Hoerr
Ich habe mein Quellmodell und die darin erweiterte abstrakte Klasse hinzugefügt. Die abstrakte Klasse ist nichts anderes als eine Methode, die die toOptionArray()Ausgabe generiert .
Giel Berkers

Antworten:

6

Ich habe es bekommen! Es stellt sich heraus, dass Multiselect das Backend-Modell verwendet Magento\Eav\Model\Entity\Attribute\Backend\ArrayBackend. Aus diesem Grund muss das Quellmodell auch EAV berücksichtigen. Wie können wir das machen? Einfach: Erweitern Sie einfach Ihr Quellmodell von Attribute\Source\AbstractSourceund implementieren Sie die getAllOptions()-method (die ein zweidimensionales Array mit valueund label-keys zurückgibt:

/**
 * @return array
 */
public function getAllOptions()
{
    $arr = $this->toArray();
    $ret = [];

    foreach ($arr as $key => $value) {
        $ret[] = [
            'value' => $key,
            'label' => $value
        ];
    }

    return $ret;
}

Das ist es! Genießen Sie die Verwendung Ihres benutzerdefinierten Quellmodells für Mehrfachauswahlattribute.

Giel Berkers
quelle