Загрузка коллекции продуктов по определенному значению раскрывающегося списка атрибутов

magento.stackexchange https://magento.stackexchange.com//questions/86717

Вопрос

Я пытаюсь загрузить определенные виртуальные продукты с их настраиваемыми параметрами, но вместо этого получаю пустой массив.

Мой атрибут — «part_identifier» в наборе атрибутов «boat_part». Это атрибут раскрывающегося типа с несколькими параметрами.Вариант, который я пытаюсь использовать, — «Посмотреть».

Вот мой код:

$attribute = 'msh_boat_part_identifier';

$boatLookProducts = Mage::getModel('catalog/product')
    ->getCollection()
    ->addAttributeToSelect('*')
    ->addAttributeToFilter($attribute, array('like'=>'Look'))
    ->load()
    ->getItems();

foreach($boatLookProducts as $boatLookProduct)
{
    $return[] = array(
        "id" => (int)$boatLookProduct->getEntityId(),
        "name" => $boatLookProduct->getName(),
        "type" => "profile",
        "shortDesc" => $boatLookProduct->getShortDescription(),
        "desc" => $boatLookProduct->getDescription(),
        "active" => ($boatLookProduct->getStatus() === "2" ? false : true)
    );
}
echo Mage::helper('pb')->ConvertToJson($return);

Если в моем запросе к коллекции я изменю массив на

->addAttributeToFilter($attribute, array('like'=>'%%'))

он успешно вернет все продукты, но я не могу получить конкретный, который мне нужен!

Это было полезно?

Решение

Как part_identifier является атрибутом раскрывающегося списка, вы не можете фильтровать коллекцию по метке параметра.

Чтобы отфильтровать коллекцию по параметру, вам необходимо получить идентификатор метки этого параметра (фактическое значение параметра).

Затем вы можете отфильтровать коллекцию по этому идентификатору опции:

// use your own attribute code here 
$attributeCode = 'your_attribute_here';
$attributeOption = 'Look';

$attributeDetails = Mage::getSingleton('eav/config')
    ->getAttribute(Mage_Catalog_Model_Product::ENTITY, $attributeCode);
$options = $attributeDetails->getSource()->getAllOptions(false); 
$selectedOptionId = false;
foreach ($options as $option){ 
    // print_r($option) and find all the elements 
    echo $option['value']; 
    echo $option['label'];
    if ($option['label'] == $attributeOption) {
        $selectedOptionId = $option['value'];   
    }
}

if ($selectedOptionId) {
    $products = Mage::getModel('catalog/product')
        ->getCollection()
        ->addAttributeToSelect('*')
        ->addAttributeToFilter($attributeCode, array('eq' => $selectedOptionId))
}

Другие советы

Это поздно и, возможно, даже даже не действует во время спрашивания, хотя я нашел более лаконичный способ, делая:

$attributeOptionId = Mage::getSingleton('eav/config')
   ->getAttribute(Mage_Catalog_Model_Product::ENTITY, 'your_attribute_code')
   ->getSource()
   ->getOptionId('Option Text Value/Label');
.

Тогда вы используете его в фильтре для сбора, как обычно,

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top