Как отфильтровать сбор продуктов по значениям опции администратора атрибута?
-
16-10-2019 - |
Вопрос
В настоящее время я разрабатываю конфигуратор продукта. Я отправляю форму, которая отправляет значения опции администратора моих пользовательских атрибутов через 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');