Атрибут продукта с множественным выбором не отображает метки опций на внешнем интерфейсе
-
13-12-2019 - |
Вопрос
Я проверил партию и попробовал много вещей, но я все еще не получаю метку выбранных значений с множественным выбором продукта на странице просмотра продукта.
У меня есть атрибут продукта с именем пакета, который является мультисекционным, кодом, который создает атрибут продукта
$this->addAttribute(
'catalog_product',
'package',
array(
'group' => 'Package',
'backend' => 'eav/entity_attribute_backend_array',
'frontend' => '',
'class' => '',
'default' => '',
'label' => 'Package',
'input' => 'multiselect',
'type' => 'text',
'source' => 'npm_recurrex/package_source',
'global' => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,
'is_visible' => 1,
'required' => 0,
'searchable' => 0,
'filterable' => 0,
'unique' => 0,
'comparable' => 0,
'visible_on_front' => 0,
'user_defined' => 1,
)
);
это работает нормально, я успешно сохраняю продукт.Но на странице просмотра продукта во внешнем интерфейсе, когда я говорю
Mage::log(print_r($_product->getData('package'), true));
Его печатает результат как 1,2, но я хотел отобразить варианты метки Multielect Not идентификатора опции.Итак, я попробовал с этим кодом
Mage::log(print_r($_product->getAttributeText('package'), true));
Ничего не печатает, просто пустое место :(.
Я проверил это связь но бесполезно.
Меня это смущает, Где я не прав?и что не так?
Может ли кто-нибудь объяснить мне, что происходит в моем случае?
мой метод getOptionText
public function getOptionText($value)
{
$options = $this->getAllOptions(false);
foreach ($options as $item) {
if ($item['value'] == $value) {
return $item['label'];
}
}
return false;
}
Решение
Метод getAttributeText
выглядит так:
public function getAttributeText($attributeCode)
{
return $this->getResource()
->getAttribute($attributeCode)
->getSource()
->getOptionText($this->getData($attributeCode));
}
Обратите внимание на последние 2 строки.
Они означают, что метод вызывает getOptionText
из исходного класса модели.
Я вижу, что ваш атрибут имеет собственную исходную модель. npm_recurrex/package_source
.Убедитесь, что в модели есть метод getOptionText
или его родительский класс имеет его и возвращает то, что вам нужно.
[РЕДАКТИРОВАТЬ]
Твой getOptionText
неправильно.
Это сработало бы, если бы атрибут имел тип select
.
Но это не работает для множественного выбора.
Вот сценарий.На самом деле я использую ваш сценарий.
$_product->getData('package')
возвращает 1,2
.
И я предполагаю, что ваши варианты примерно такие:
$options[] => array('value' => 1, 'label'=>'Option 1');
$options[] => array('value' => 2, 'label'=>'Option 2');
$options[] => array('value' => 3, 'label'=>'Option 3');
$options[] => array('value' => 4, 'label'=>'Option 4');
В этом случае ваш метод получает в качестве параметра 1,2
и вы проверяете, есть ли элемент в $options
с value = 1,2
.и нет.
Попробуйте сделать свой метод таким:
public function getOptionText($value)
{
$options = $this->getAllOptions(false);
$optionsByValue = array();
foreach ($options as $item) {
$optionsByValue[$item['value']] = $item['label'];
}
$values = explode(',', $value);
$returnValue = array();
foreach ($values as $_value) {
if (isset($optionsByValue[$_value])) {
$returnValue[] = $optionsByValue[$_value];
}
}
return implode(', ', $returnValue);
}
Непроверенный код, поэтому следите за опечатками.