Ich habe in Magento 2 ein Attribut des Typs erstellt multiselect
und 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_model
den 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_model
in eav_attribute
zu 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 [];
}
}
quelle
toOptionArray()
Ausgabe generiert .Antworten:
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 vonAttribute\Source\AbstractSource
und implementieren Sie diegetAllOptions()
-method (die ein zweidimensionales Array mitvalue
undlabel
-keys zurückgibt:Das ist es! Genießen Sie die Verwendung Ihres benutzerdefinierten Quellmodells für Mehrfachauswahlattribute.
quelle