2016-01-07 3 views
3

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

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

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

$product->getAllAttributeValues('my_custom_attribute'); 

Это печатает что-то вроде:

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

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

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

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

Предположим, что у меня есть переменная

$value = "3" 

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

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

Например:

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

EDIT: Есть ли способ, чтобы сделать "нин" (не) в массиве, а так, что если значение $ = 1, только [14] и [32] будет отображаться? Например:

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

ответ

0

ПРИМЕЧАНИЕ: Цель этого вопроса было выяснить, есть ли новый способ 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)); 
} 

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

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

Смежные вопросы