Tôi đã tạo một thuộc tính trong Magento 2 thuộc loại multiselect
và bây giờ tôi muốn nó được tạo bởi một mô hình nguồn tùy chỉnh.
Bây giờ tôi nhớ từ Magento 1 rằng khi bạn muốn làm điều này, bạn phải chỉnh sửa thủ công thuộc tính trong cơ sở dữ liệu và đặt source_model
đường dẫn của mô hình nguồn.
Tuy nhiên, khi tôi làm điều này trong Magento 2, tôi gặp lỗi. Tôi đã thay đổi source_model
trong eav_attribute
để Vendor\Module\Model\Config\Source\Product\Attributes
, nhưng khi tôi muốn chỉnh sửa sản phẩm trong admin, tôi nhận được thông báo lỗi sau:
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
Có ai biết làm thế nào tôi có thể tạo một thuộc tính sản phẩm với một mô hình nguồn tùy chỉnh không?
Biên tập:
Mô hình nguồn hiện tại:
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;
}
}
Lớp 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()
đầu ra.