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 [];
}
}
toOptionArray()Ausgabe generiert .