Magento 2 - Коллекция фильтров для настраиваемого атрибута продукта с множественным выбором

Я новичок в Magento 2, и у меня есть собственный модуль, который использует плагин для изменения своей коллекции продуктов на уровне модели каталога. Я создал настраиваемый атрибут с множественным выбором для продукта с опцией:

backend => '\Magento\Eav\Model\Entity\Attribute\Backend\ArrayBackend'

Он успешно создает, заполняет и сохраняет поле множественного выбора и его данные из формы редактирования продукта. Я также могу без проблем получить все значения из массива множественного выбора:

$product->getAllAttributeValues('my_custom_attribute');

Это выводит что-то вроде:

Array
(
    [18] => Array
    (
        [0] => 1,3,4
    )

    [14] => Array
    (
        [0] => 
    )

    [32] => Array
    (
        [0] => 3,8
    )
)

Итак, вот моя проблема:

Допустим, у меня есть переменная

$value = "3"

и я хочу отображать только те продукты, которые имеют это значение $ в my_custom_attribute. В приведенном выше примере будут отображаться только [18] и [32].

Есть ли способ сделать это в Magento 2 с помощью метода addAttributeToFilter ()?

Например:

$product->addAttributeToFilter('my_custom_attribute', $value);

РЕДАКТИРОВАТЬ: Есть ли способ сделать "нин" (не внутри) в массиве, чтобы, если $ value = 1, отображались только [14] и [32]? Например:

$value = 1;
$product->addAttributeToFilter('my_custom_attribute', array('nin' => $value))

person Jared    schedule 07.01.2016    source источник
comment
вот список фильтров devdocs.magento.com/guides/ v2.3 / rest / performance-search.html, возможно, вам нужны finset и nfinset   -  person Erfan    schedule 30.07.2020


Ответы (1)


ПРИМЕЧАНИЕ. Целью этого вопроса было выяснить, есть ли новый способ сделать это в Magento 2, но после нескольких дней поиска и отсутствия ответов я пришел с пустыми руками. Итак, этот ответ основан на моем опыте работы с Magento 1.x. Он работает в Magento 2, но может быть более подходящий способ сделать это.

Вот мое решение:

/**
 * @param $product
 * @return mixed
 */
public function filterProducts($product) {
    $attributeValues = $product->getAllAttributeValues('my_custom_attribute');

    foreach($attributeValues as $entity_id => $value) {
        if($this->_isItemHidden($value[0])) {
            $this->_removeCollectionItems($product, $entity_id);
        }
    }

    return $product;
}

/**
 * @return int
 */
protected function _getCustomValue() {
    return '3';
}

/**
 * @param $string
 * @return bool
 */
protected function _isItemHidden($string) {

    $customValue= $this->_getCustomValue();

    $multiselectArray= explode(',', $string);

    foreach($multiselectArray as $value) {
        if($value== $customValue){
            return true;
        }
    }
    return false;
}

/**
 * @param $collection
 * @param $customValue
 */
protected function _removeCollectionItems($collection, $entity_id)
{
    $collection->addAttributeToFilter('entity_id', array('nin' => $entity_id));
}

Где $ this -> _ getCustomValue () == любое значение, которое вы пытаетесь включить или исключить.

Итак, из моего плагина filterProducts () называется передачей возвращаемого значения из исходной функции.

person Jared    schedule 08.01.2016