Атрибут продукта с множественным выбором не отображает метки опций на внешнем интерфейсе

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

Вопрос

Я проверил партию и попробовал много вещей, но я все еще не получаю метку выбранных значений с множественным выбором продукта на странице просмотра продукта.

У меня есть атрибут продукта с именем пакета, который является мультисекционным, кодом, который создает атрибут продукта

$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);
}

Непроверенный код, поэтому следите за опечатками.

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