Проверка наличия значения атрибута. Что это делает?

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

  •  16-10-2019
  •  | 
  •  

Вопрос

Я получил этот код от здесь, и это работает. Однако есть раздел, который я не совсем понимаю. Пожалуйста, смотрите строки [A] и [b].

public function attributeValueExists($attCode, $attributeValue)
{
    $attributeModel = Mage::getModel('eav/entity_attribute');
    $attributeOptionModel = Mage::getModel('eav/entity_attribute_source_table') ;

    $attributeId = $attributeModel->getIdByCode('catalog_product', $attCode);    // [A]
    $attribute = $attributeModel->load($attributeId);    // [B]

    $attributeTable = $attributeOptionModel->setAttribute($attribute);
    $options = $attributeOptionModel->getAllOptions(false);

    foreach($options as $option) {
        if ($option['label'] == $attributeValue) {
            return $option['value'];
        }
    }

    return false;
}

Переменная, полученная из строк [a] и [b], $attributeTable, кажется, не используется. Тем не менее, если я прокомментирую эти две строки, код не работает. Что на самом деле делают эти строки и почему $attributeTable за?

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

Решение

Вы ошибаетесь, когда говорите, что они «не используются». Они на самом деле:

Эта строка приносит $ attributyId:

$attributeId = $attributeModel->getIdByCode('catalog_product', $attCode);    // [A]

Эта линия загружает атрибут:

$attribute = $attributeModel->load($attributeId);    // [B]

Эта строка использует атрибут $ в сеттере на $ attributeOptionModel:

$attributeTable = $attributeOptionModel->setAttribute($attribute);

Getalloptions требует, чтобы атрибут был установлен:

$options = $attributeOptionModel->getAllOptions(false);

Я думаю, что то, где вас споткнутся, это то, что $ attributeatable не используется, но это просто возвратное значение из метода сеттера. Волшебные сеттеры в Magento всегда возвращают родительский объект чтобы вы могли построить свободный интерфейс.

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

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

public function attributeValueExists($attCode, $attributeValue)
{
    $attributeModel = Mage::getModel('eav/entity_attribute');
    $attributeOptionModel = Mage::getModel('eav/entity_attribute_source_table') ;

    //retrieve attribute_id using attribute_code
    $attributeId = $attributeModel->getIdByCode('catalog_product', $attCode);    // [A] 
    //load attribute model using attribute_id
    $attribute = $attributeModel->load($attributeId);    // [B] 

    $options = $attributeOptionModel->setAttribute($attribute)->getAllOptions(false);

    foreach($options as $option) {
        if ($option['label'] == $attributeValue) {
            return $option['value'];
        }
    }

    return false;
}

Но это долгий путь, и мы можем использовать этот фрагмент, чтобы получить значение атрибута:

 public function attributeValueExists($attCode, $attributeValue)
 {
     /**
     * @var $attribute Mage_Eav_Model_Entity_Attribute_Abstract
     */
    $attribute = Mage::getModel('catalog/resource_eav_attribute')
        ->loadByCode(Mage_Catalog_Model_Product::ENTITY, $attCode);

    $options   = $attribute->getSource()->getAllOptions();
    foreach ($options as $option) {
        if ($option['label'] == $attributeValue) {
            return $option['value'];
        }
    }
    return false;
 }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top