Làm cách nào tôi có thể sử dụng mô hình nguồn tùy chỉnh cho thuộc tính sản phẩm đa lựa chọn trong Magento 2


7

Tôi đã tạo một thuộc tính trong Magento 2 thuộc loại multiselectvà 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_modeltrong 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 [];
    }
}

Gửi mã mô hình nguồn hiện tại của bạn.
Ryan Hoerr

Tôi đã thêm mô hình nguồn của mình và lớp trừu tượng mà nó mở rộng. Lớp trừu tượng không có gì khác hơn là một phương thức tạo toOptionArray()đầu ra.
Giel Berkers

Câu trả lời:


6

Tôi hiểu rồi! Nó chỉ ra rằng multiselect sử dụng mô hình phụ trợ Magento\Eav\Model\Entity\Attribute\Backend\ArrayBackend. Vì lý do này, mô hình nguồn, cũng phải tính đến EAV. Làm thế nào chúng ta có thể làm điều này? Đơn giản: chỉ cần mở rộng mô hình nguồn của bạn từ Attribute\Source\AbstractSourcevà triển khai getAllOptions()-method (trả về mảng 2 chiều với valuelabel-key:

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

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

    return $ret;
}

Đó là nó! Thưởng thức sử dụng mô hình nguồn tùy chỉnh của bạn cho các thuộc tính đa lựa chọn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.