Custom Attributes in System Configuration in Magento 2

Custom Attributes in System Configuration in Magento 2

In one of our current Magento 2 projects we has the need to create a custom shipping method which thhat should not be selectable when there a product in our cart with a specific value selected in a custom attribute.

In order to make it flexible which values should disable the shipping method we created a configuration for the shipping method. This way you can change the values in the admin backend without the need to change and redeploy the code. The problem was that you can't simply use the model in the <source> tag of the configuration, but the solution we came up with was quite simple and generic:

We created a class that provides all options of the custom attribute. In our case, the custom attribute was called 'series'.

<?php

namespace \bitExpert\CustomModule\Model\Config\Source\SeriesOptions;

use Magento\Catalog\Model\Product\Attribute\Repository;
use \Magento\Framework\Data\OptionSourceInterface;

class SeriesOptions implements OptionSourceInterface
{
    /**
     * @var AttributeRepositoryInterface
     */
    private $attributeRepository;

    /**
     * SeriesOptions constructor.
     * @param AttributeRepository $attributeRepository
     */
    public function __construct(AttributeRepository $attributeRepository) {
        $this->attributeRepository = $attributeRepository;
    }

    /**
     * Returns an array of all options of the series attribute
     *
     * @return array|null
     */
    public function toOptionArray()
    {
        /** @var \Magento\Eav\Model\Attribute $attribute */
        $attribute = $this->attributeRepository->get('series');
        $options = $attribute->getOptions();

        return $options;
    }
}


Then you can simply use this class in the system configuration - system.xml

<field id="excluded_series" translate="label" type="multiselect" 
    sortOrder="0" showInDefault="1" showInWebsite="1" showInStore="1">
    <label>Series that will make shipping method unavailable</label>
    <source_model>
        \bitExpert\CustomModule\Model\Config\Source\SeriesOptions
    </source_model>
</field>


Now you can easily retrieve the selected values with the ScopeConfig.



Tags: , ,

Eintrag von Philipp Sander am 31.08.2017

comments powered by Disqus