Как отфильтровать сбор продуктов по значениям опции администратора атрибута?

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

Вопрос

В настоящее время я разрабатываю конфигуратор продукта. Я отправляю форму, которая отправляет значения опции администратора моих пользовательских атрибутов через Post в действие контроллера. Если я использую этикетки атрибута текущего магазина, все работают просто нормально, сбор продуктов отфильтрована правильно, а простой продукт, связанный с настраиваемым продуктом, возвращается. К сожалению, я использую значения администратора для формы и генерации URL, потому что значения шведского магазина по умолчанию содержат слишком много специальных символов.

Итак, мой вопрос: как получить правильный продукт из моей коллекции при использовании значений опции администратора или более конкретного, как получить идентификатор значения опции администратора, как это для значений магазина по умолчанию:

$id = Mage::getResourceModel('catalog/product')
                                    ->getAttribute($key)
                                    ->getSource()
                                    ->getOptionId($value); 

Я уже пробовал фильтрацию от AddStoreFilter (0), но это тоже не сработало. Я уже читал, что это может иметь какое -то отношение к плоским таблицам, используемым в магазине по умолчанию, но не для администратора, но я довольно неопытен с Magento, поэтому я не совсем понимаю разницу, используя плоские таблицы и что это на самом деле означает.

Вот мой последний вопрос, касающийся фильтрации для справки:addfieldtofilter не возвращает правильный продукт для выбранных значений атрибутов

Вот моя функция getProduct ():

public function getProduct($attributes)
    {

        Mage::Log($attributes);

        $productModel = Mage::getModel('catalog/product');

        //Get Product Collection
        $collection = $productModel->getCollection()


        //Filter for Selected Product
        $collection->addAttributeToSelect('status');
        $collection->addAttributeToSelect('doorconfig_enable');
        $collection->addAttributeToFilter('doorconfig_enable',array('eq' => 1));

        foreach ($attributes as $key => $value) 
        {
            $collection->addAttributeToSelect($key);

            $id = Mage::getResourceModel('catalog/product')
                                    ->getAttribute($key)
                                    ->getSource()
                                    ->getOptionId($value);

            $collection->addAttributeToFilter($key,
                array(
                        'eq' => $id
                     )
            );

        }

        $selection = $collection->getSelect()->__toString();

        Mage::Log($selection);

        Mage::log($collection->getSize(),null,'custom.log');

        $product = $collection->getFirstItem();

        return $product;

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

Решение

Как и во всем Magento, ответ в источнике - все, что вам нужно сделать, это пойти копать (или прыгнуть, чтобы затем конец этого поста).

Сначала найдите класс для источника атрибута

$source = Mage::getResourceModel('catalog/product')
->getAttribute('color')
->getSource();        
var_dump(get_class($source));
exit;

В современных версиях Magento это должно указывать на класс Mage_Eav_Model_Entity_Attribute_Source_Table, который расположен в

#File: app/code/core/Mage/Eav/Model/Entity/Attribute/Source/Table.php
class Mage_Eav_Model_Entity_Attribute_Source_Table extends Mage_Eav_Model_Entity_Attribute_Source_Abstract
{
    //...
}

Далее мы рассмотрим определение getOptionId Метод на этом классе и/или это родительские классы. Мы найдем это в Mage_Eav_Model_Entity_Attribute_Source_Abstract учебный класс

#File: app/code/core/Mage/Eav/Model/Entity/Attribute/Source/Abstract.php
public function getOptionId($value)
{
    foreach ($this->getAllOptions() as $option) {
        if (strcasecmp($option['label'], $value)==0 || $option['value'] == $value) {
            return $option['value'];
        }
    }
    return null;
}

Изучая этот метод, мы можем увидеть, работает ли работает foreachза список вариантов из getAllOptions метод Итак, давайте посмотрим на определение этого метода.

#File: app/code/core/Mage/Eav/Model/Entity/Attribute/Source/Table.php
public function getAllOptions($withEmpty = true, $defaultValues = false)
{
    $storeId = $this->getAttribute()->getStoreId();
    if (!is_array($this->_options)) {
        $this->_options = array();
    }
    if (!is_array($this->_optionsDefault)) {
        $this->_optionsDefault = array();
    }
    if (!isset($this->_options[$storeId])) {
        $collection = Mage::getResourceModel('eav/entity_attribute_option_collection')
            ->setPositionOrder('asc')
            ->setAttributeFilter($this->getAttribute()->getId())
            ->setStoreFilter($this->getAttribute()->getStoreId())
            ->load();
        $this->_options[$storeId]        = $collection->toOptionArray();
        $this->_optionsDefault[$storeId] = $collection->toOptionArray('default_value');
    }
    $options = ($defaultValues ? $this->_optionsDefault[$storeId] : $this->_options[$storeId]);
    if ($withEmpty) {
        array_unshift($options, array('label' => '', 'value' => ''));
    }

    return $options;
}

Ах! Теперь мы что -то на чем -то. Похоже, это метод, который загружает всю информацию о опциях. В частности, мы заинтересованы

$storeId = $this->getAttribute()->getStoreId();

Итак, Magento получает идентификатор магазина для загрузки параметров из атрибута. Анкет Это означает, что вы должны быть в состоянии сделать что -то вроде следующего (замена color а также red Конечно, с вашими собственными переменными)

    //get the attribute
    $attribute = Mage::getResourceModel('catalog/product')
    ->getAttribute('color');

    //set the store id on the attribute
    $attribute->setStoreId(Mage_Core_Model_App::ADMIN_STORE_ID);

    //get the source
    $source = $attribute->getSource();

    //get the id
    $id = $source->getOptionId('red');
Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top