Magento 제품 속성 값 가져 오기


답변:



40

내가 아는 방법 :

$product->getResource()->getAttribute($attribute_code)
        ->getFrontend()->getValue($product)

3
감사. 내가 찾던 것이었다.
Ricardo Martins

4
나는 magento를 처음 사용합니다 .. 왜 $product두 번 사용합니까?
Mr_Green

28
@Mr_Green 마젠 토이기 때문입니다. '왜'는 합리적인 대답을 얻지 못합니다.
nakajuice

@Mr_Green, 두 번 사용하는 것이 아닙니다. 두 번째 줄은 첫 번째 줄의 연속입니다. getAttribute ()에 의해 반환 된 객체에 대해 getFrontend ()를 호출합니다.
Scott Buchanan

26

당신이 사용할 수있는

<?php echo $product->getAttributeText('attr_id')  ?> 

2
이 코드는 잘 작동합니다. 나는 많은 블로그를 검색했지만 이것을 제외하고는 아무도 나를 위해 일하지 않았습니다. 정말 좋습니다.
Patel Dixit 2014-07-05

3
제품 모델은 속성 값을 포함하는 경우에만 당신이 작동하지 않습니다 유일한 제품 ID를 알고있는 경우이 코드는 작동합니다
에 Jiří CHMIEL에게

1
이것은 드롭 다운 목록과 같은 속성에 대해 작동하지만 속성이 간단한 텍스트 필드 인 경우 다른 기능이 필요합니다. 속성이 my_name이면 코드는 $ product-> getMyName ()이됩니다.
Ken

1
@Ken, 제품에서 동적 속성을 $product->getData('my_name')
가져와야

그리고 우리는 옵션 ID를 얻을 수 있습니까? $ product-> getAttributeId ( 'attr_id') ???
snh_nl 2008

9

대부분의 경우에 효과가 있으므로 Daniel Kocherga의 답변을 참조하십시오 .

속성의 값을 가져 오는 방법 외에도 때때로 select또는 레이블을 가져오고 싶을 수 있습니다 multiselect. 이 경우 헬퍼 클래스에 저장하는이 메서드를 만들었습니다.

/**
 * @param int $entityId
 * @param int|string|array $attribute atrribute's ids or codes
 * @param null|int|Mage_Core_Model_Store $store
 *
 * @return bool|null|string
 * @throws Mage_Core_Exception
 */
public function getAttributeRawLabel($entityId, $attribute, $store=null) {
    if (!$store) {
        $store = Mage::app()->getStore();
    }

    $value = (string)Mage::getResourceModel('catalog/product')->getAttributeRawValue($entityId, $attribute, $store);
    if (!empty($value)) {
        return Mage::getModel('catalog/product')->getResource()->getAttribute($attribute)->getSource()->getOptionText($value);
    }

    return null;
}

8

제품 모델을로드하지 않고는 가치를 얻을 수없는 것 같습니다. app / code / core / Mage / Eav / Model / Entity / Attribute / Frontend / Abstract.php 파일을 살펴보면 메서드가 표시됩니다.

public function getValue(Varien_Object $object)
{
    $value = $object->getData($this->getAttribute()->getAttributeCode());
    if (in_array($this->getConfigField('input'), array('select','boolean'))) {
        $valueOption = $this->getOption($value);
        if (!$valueOption) {
            $opt = new Mage_Eav_Model_Entity_Attribute_Source_Boolean();
            if ($options = $opt->getAllOptions()) {
                foreach ($options as $option) {
                    if ($option['value'] == $value) {
                        $valueOption = $option['label'];
                    }
                }
            }
        }
        $value = $valueOption;
    }
    elseif ($this->getConfigField('input')=='multiselect') {
        $value = $this->getOption($value);
        if (is_array($value)) {
            $value = implode(', ', $value);
        }
    }
    return $value;
}

보시다시피이 메서드는 데이터를 가져 오기 위해로드 된 개체가 필요합니다 (세 번째 줄).


5

먼저 원하는 속성이로드되었는지 확인한 다음 출력해야합니다. 이것을 사용하십시오 :

$product = Mage::getModel('catalog/product')->load('<product_id>', array('<attribute_code>'));
$attributeValue = $product->getResource()->getAttribute('<attribute_code>')->getFrontend()->getValue($product);

4

이 시도

 $attribute = $_product->getResource()->getAttribute('custom_attribute_code');
    if ($attribute)
    {
        echo $attribute_value = $attribute ->getFrontend()->getValue($_product);
    }

2

전체 제품을로드 할 필요가 없습니다. Magentos 컬렉션은 매우 강력하고 스마트합니다.

$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addAttributeToFilter('entity_id', $product->getId());
$collection->addAttributeToSelect('manufacturer');
$product = $collection->getFirstItem();
$manufacturer = $product->getAttributeText('manufacturer');

getFirstItem ()을 호출하는 순간 쿼리가 실행되고 결과 제품은 매우 최소화됩니다.

[status] => 1
[entity_id] => 38901
[type_id] => configurable
[attribute_set_id] => 9
[manufacturer] => 492
[manufacturer_value] => JETTE
[is_salable] => 1
[stock_item (Varien_Object)] => Array
    (
        [is_in_stock] => 1
    )

1

이것은 작동합니다.

echo $_product->getData('ATTRIBUTE_NAME_HERE');

2
질문은 "전체 제품을로드하지 않음"이었습니다.
Denis Óbukhov

0

다음과 같은 방법으로 속성 값을 얻을 수 있습니다.

$model = Mage::getResourceModel('catalog/product');
$attribute_value = $model->getAttributeRawValue($productId, 'attribute_code', $storeId);

-1

$orderId = 1; // YOUR ORDER ID
$items = $block->getOrderItems($orderId);
 
foreach ($items as $item) {
    $options = $item->getProductOptions();        
    if (isset($options['options']) && !empty($options['options'])) {        
        foreach ($options['options'] as $option) {
            echo 'Title: ' . $option['label'] . '<br />';
            echo 'ID: ' . $option['option_id'] . '<br />';
            echo 'Type: ' . $option['option_type'] . '<br />';
            echo 'Value: ' . $option['option_value'] . '<br />' . '<br />';
        }
    }
}

Magento 2에서 가치있는 제품 맞춤 옵션 장바구니 주문을 검색하는 데 사용할 모든 것 : https://www.mageplaza.com/how-get-value-product-custom-option-cart-order-magento-2.html


-2

내가 생각하는 SQL을 통해 직접 수행하는 메서드를 작성할 수 있습니다.

다음과 같이 보일 것입니다.

변수:

$store_id = 1;
$product_id = 1234;
$attribute_code = 'manufacturer';

질문:

SELECT value FROM eav_attribute_option_value WHERE option_id IN (
    SELECT option_id FROM eav_attribute_option WHERE FIND_IN_SET(
        option_id, 
        (SELECT value FROM catalog_product_entity_varchar WHERE
            entity_id = '$product_id' AND 
            attribute_id = (SELECT attribute_id FROM eav_attribute WHERE
                attribute_code='$attribute_code')
        )
    ) > 0) AND
    store_id='$store_id';

속성의 backend_type (eav_attribute의 필드)을 기반으로 올바른 테이블에서 값을 가져와야하므로 최소한 1 개의 추가 쿼리가 필요합니다.


감사! 좋아 보이지만 모든 속성이 varchar는 아니며 3 개의 선택 포함이 좋지 않습니다. 조인을 사용하는 것이 더 좋을까요?
Denis Óbukhov

내가 틀렸을 수도 있지만 내가 아는 한 select와 join은 쿼리 프로세서에 의해 최적화되므로 큰 차이가 없습니다. 그러나 모든 속성이 varchar 인 것은 아니라면 먼저 얻고 자하는 속성의 backend_type을 얻은 다음 sprintf ( 'catalog_product_entity_ % s', $ backend_type) ^^ 테이블을 사용해야합니다. 그러나 FIND_IN_SET을 사용하여 다른 유형도 얻을 수 없으므로 이에 대한 내용도 찾아야합니다. 행운을 빕니다!
Lucas Moeskops 2011 년

-2

my_attr이라는 text / textarea 속성이있는 경우 다음을 통해 얻을 수 있습니다. product->getMyAttr();


나는 "로드 전체 제품없이"요청했습니다
데니스 Óbukhov을
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.