Magento 2 - "Свойство\"Слайдер\" не имеет соответствующего задатчика в классе "Magento\\Eav\\Api\\Данные\\Attributeoptionинтерфейс\"."


Я пытаюсь переопределить Magento\Eav\Api\Data\AttributeOptionInterface в своем пользовательском модуле. Я хочу добавить одну новую опцию в существующий интерфейс.

Идея заключается в том, что на данный момент мы можем передавать только определенные данные параметров в параметрах атрибутов REST API

Смотрите ниже формат запроса API для большей ясности.

Api-интерфейс

Url = http://test.com/index.php/rest/V1/products/attributes/manufacturer/options/
Api Methodd - Post
Api body - {
  "option": {
    "label": "test",
    "is_default": "true",
  }
}

На данный момент он передает 3 параметра в качестве значения, я хочу добавить свой пользовательский 4-й параметр Ex-слайдер.

Итак, параметры должно быть

{
  "option": {
    "label": "test",
    "is_default": "true",
    "slider":"test1"
  }
}

Я попытался переопределить интерфейс и его метод, но его задающий параметр свойств не определен

Сообщение об ошибке

"message": "Property \"Slider\" does not have corresponding setter in class \"Magento\\Eav\\Api\\Data\\AttributeOptionInterface\"."

Итак, мой вопрос в том, как я могу переопределить интерфейс API и передать свой пользовательский или добавить свой параметр в существующие параметры.

Спасибо.

Author: Rakesh Jesadiya, 2017-06-26

1 answers

Чтобы решить эту проблему, нам требуется переопределить в основном два интерфейса и модель. После переопределения интерфейсов и модели переопределенные интерфейсы требуют привязки к модели с использованием di.xml для инициализации объектов во время вызова API.

Проверьте приведенный ниже код, чтобы добавить новые поля в Интерфейс атрибутов.

[ имя_пакета][имя_модуля]\etc\di.xml

<?xml version="1.0"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">  
    <preference for="Magento\Eav\Model\Entity\Attribute\Option" type="[Package_Name]\[Module_Name]\Model\Eav\Entity\Attribute\Option" />  
    <preference for="[Package_Name]\[Module_Name]\Api\Eav\Data\AttributeOptionInterface" type="[Package_Name]\[Module_Name]\Model\Eav\Entity\Attribute\Option" />
    <preference for="[Package_Name]\[Module_Name]\Api\Catalog\ProductAttributeOptionManagementInterface" type="Magento\Catalog\Model\Product\Attribute\OptionManagement" />
</config>

[ имя_пакета][имя_модуля]\Api\Eav\Data\AttributeOptionInterface.php

<?php 

namespace [Package_Name]\[Module_Name]\Api\Eav\Data;

interface AttributeOptionInterface extends \Magento\Eav\Api\Data\AttributeOptionInterface
{
    /**
     * Get slider
     *
     * @return string
     */
    public function getSlider();

    /**
     * Set slider
     *
     * @param string $slider
     * @return $this
     */
    public function setSlider($slider);
}

[ имя_пакета][имя_модуля]\Model\Eav\Entity\Attribute\Option.php

<?php 

namespace [Package_Name]\[Module_Name]\Model\Eav\Entity\Attribute;

class Option extends \Magento\Eav\Model\Entity\Attribute\Option implements \Ktpl\SliderEavOptions\Api\Eav\Data\AttributeOptionInterface
{
    /**
     * {@inheritdoc}
     */
    public function getSlider()
    {
        return $this->getData('slider');
    }

    /**
     * Set slider value
     *
     * @param string $slider
     * @return $this
     */
    public function setSlider($slider)
    {
        return $this->setData('slider', $slider);
    }
}

После переопределения интерфейса для добавления поля "ползунок" и переопределения option.php , требуется изменить тип параметра вызова API для параметров атрибута в webapi.xml для Magento_catalog модуль.

[ имя_пакета][имя_модуля]\etc\webapi.xml

<?xml version="1.0"?>

<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd">
    <route url="/V1/products/attributes/:attributeCode/options" method="GET">
        <service class="[Package_Name]\[Module_Name]\Api\Catalog\ProductAttributeOptionManagementInterface" method="getItems"/>
        <resources>
            <resource ref="Magento_Catalog::attributes_attributes" />
        </resources>
    </route>    
    <route url="/V1/products/attributes/:attributeCode/options" method="POST">
        <service class="[Package_Name]\[Module_Name]\Api\Catalog\ProductAttributeOptionManagementInterface" method="add" />
        <resources>
            <resource ref="Magento_Catalog::attributes_attributes" />
        </resources>
    </route>    
    <route url="/V1/products/attributes/:attributeCode/options/:optionId" method="DELETE">
        <service class="[Package_Name]\[Module_Name]\Api\Catalog\ProductAttributeOptionManagementInterface" method="delete" />
        <resources>
            <resource ref="Magento_Catalog::attributes_attributes" />
        </resources>
    </route>        
</routes>

И, Наконец,

[Package_Name][Module_Name]\Api\Catalog\ProductAttributeOptionManagementInterface.php

<?php

namespace [Package_Name]\[Module_Name]\Api\Catalog;

/**
 * @api
 */
interface ProductAttributeOptionManagementInterface
{
    /**
     * Retrieve list of attribute options
     *
     * @param string $attributeCode
     * @throws \Magento\Framework\Exception\StateException
     * @throws \Magento\Framework\Exception\InputException
     * @return \Ktpl\SliderEavOptions\Api\Eav\Data\AttributeOptionInterface[]
     */
    public function getItems($attributeCode);

    /**
     * Add option to attribute
     *
     * @param string $attributeCode
     * @param \Ktpl\SliderEavOptions\Api\Eav\Data\AttributeOptionInterface $option
     * @throws \Magento\Framework\Exception\StateException
     * @throws \Magento\Framework\Exception\InputException
     * @return bool
     */
    public function add($attributeCode, $option);

    /**
     * Delete option from attribute
     *
     * @param string $attributeCode
     * @param string $optionId
     * @throws \Magento\Framework\Exception\StateException
     * @throws \Magento\Framework\Exception\NoSuchEntityException
     * @throws \Magento\Framework\Exception\InputException
     * @return bool
     */
    public function delete($attributeCode, $optionId);
}
 6
Author: Hitarth Pattani, 2017-06-28 04:57:24