Atrybut produktu Magento zyskuje wartość

82

Jak uzyskać określoną wartość atrybutu produktu, jeśli znam identyfikator produktu bez ładowania całego produktu?

Denis Óbukhov
źródło
1
Nie jest to idealne rozwiązanie, ale można stworzyć model, który odpytuje odpowiednie tabele bezpośrednio :)
Joseph Mastey

Odpowiedzi:

141
Mage::getResourceModel('catalog/product')->getAttributeRawValue($productId, 'attribute_code', $storeId);
Daniel Kocherga
źródło
1
jak uzyskać tekst opcji tego? czy ktoś wie?
Przerażony średnik
2
Dla tych, dla których ma to znaczenie: ta metoda jest dostępna tylko w wersji
1.6+
40

Sposób, który znam:

$product->getResource()->getAttribute($attribute_code)
        ->getFrontend()->getValue($product)
Lucas Moeskops
źródło
3
Dzięki. To było to, czego szukałem.
Ricardo Martins
4
Jestem nowy w magento… dlaczego używam $productdwa razy?
Mr_Green
29
@Mr_Green Ponieważ to jest Magento. Nie, „dlaczego” otrzymuje rozsądną odpowiedź.
nakajuice,
@Mr_Green, to nie mówi o używaniu go dwa razy: druga linia jest kontynuacją pierwszej. Wywołujesz getFrontend () na obiekcie zwróconym przez getAttribute ().
Scott Buchanan
26

możesz użyć

<?php echo $product->getAttributeText('attr_id')  ?> 
Rakhi
źródło
2
ten kod działa dobrze. Przeszukałem wiele blogów, ale żaden kod nie zadziałał dla mnie poza tym. Bardzo miły.
Patel Dixit,
3
ten kod działa tylko wtedy, gdy model produktu zawiera wartość atrybutu, gdy znasz tylko identyfikator produktu, to nie zadziała
Jiří Chmiel
1
Działa to w przypadku atrybutów takich jak listy rozwijane, ale jeśli atrybut jest prostym polem tekstowym, potrzebna jest inna funkcja. Powiedzmy, że atrybut to my_name, a następnie kod zmieni się na $ product-> getMyName ()
Ken,
1
@Ken, jeśli chcesz uzyskać atrybut dynamiczny z produktu, możesz użyć$product->getData('my_name')
pavlindrom
I jak mamy dostać identyfikator opcji? $ product-> getAttributeId ('attr_id') ???
snh_nl
9

Zapoznaj się z odpowiedzią Daniela Kocherga , ponieważ w większości przypadków zadziała.

Oprócz tej metody, aby uzyskać wartość atrybutu, czasami możesz chcieć uzyskać etykietę selectlub multiselect. W takim razie stworzyłem tę metodę, którą przechowuję w klasie pomocniczej:

/**
 * @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;
}
Tyler V.
źródło
8

Wydaje się niemożliwe uzyskać wartość bez załadowania modelu produktu. Jeśli spojrzysz na plik app / code / core / Mage / Eav / Model / Entity / Attribute / Frontend / Abstract.php zobaczysz metodę

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

Jak widać ta metoda wymaga załadowanego obiektu, aby pobrać z niego dane (3 linia).

azakolyukin
źródło
5

Najpierw musimy upewnić się, że żądany atrybut został załadowany, a następnie wyprowadzić go. Użyj tego:

$product = Mage::getModel('catalog/product')->load('<product_id>', array('<attribute_code>'));
$attributeValue = $product->getResource()->getAttribute('<attribute_code>')->getFrontend()->getValue($product);
Sveta Oksen
źródło
4

Spróbuj tego

 $attribute = $_product->getResource()->getAttribute('custom_attribute_code');
    if ($attribute)
    {
        echo $attribute_value = $attribute ->getFrontend()->getValue($_product);
    }
Keshav Kalra
źródło
2

Nie musisz ładować całego produktu. Kolekcje Magentos są bardzo wydajne i inteligentne.

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

W momencie wywołania metody getFirstItem () zapytanie zostanie wykonane, a wynikowy produkt będzie bardzo minimalny:

[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
    )
Eydamos
źródło
1

Ten działa-

echo $_product->getData('ATTRIBUTE_NAME_HERE');
th3pirat3
źródło
2
Pytanie brzmiało „bez ładowania całego produktu”.
Denis Óbukhov
0

Możesz uzyskać wartość atrybutu, wykonując następujące czynności

$model = Mage::getResourceModel('catalog/product');
$attribute_value = $model->getAttributeRawValue($productId, 'attribute_code', $storeId);
Magecode
źródło
-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 />';
        }
    }
}

wszystkie rzeczy, których użyjesz do pobrania niestandardowego zamówienia produktu wartościowego w Magento 2: https://www.mageplaza.com/how-get-value-product-custom-option-cart-order-magento-2.html

Vicent Nguyen
źródło
-2

Mógłbyś napisać metodę, która zrobiłaby to bezpośrednio przez sql, jak przypuszczam.

Wyglądałoby to mniej więcej tak:

Zmienne:

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

Pytanie:

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';

Musisz jednak pobrać wartość z odpowiedniej tabeli na podstawie typu backend_type atrybutu (pole w eav_attribute), więc wymaga co najmniej 1 dodatkowego zapytania.

Lucas Moeskops
źródło
Dzięki! Wygląda dobrze, ale nie wszystkie atrybuty to varchar, a 3 wybrane inkluzje nie są dobre. Może lepiej użyć dołączenia?
Denis Óbukhov
Mogę się mylić, ale o ile wiem, nie ma dużej różnicy między wyborem i dołączaniem, ponieważ są one optymalizowane przez procesor zapytań. Ale biorąc pod uwagę, że nie wszystkie atrybuty są varchar, najpierw musisz pobrać backend_type atrybutu, który chcesz uzyskać, a następnie użyć tabeli sprintf ('catalog_product_entity_% s', $ backend_type) ^^. Ale także innych typów nie można uzyskać za pomocą FIND_IN_SET, więc będziesz musiał również znaleźć coś do tego. Powodzenia!
Lucas Moeskops,
-2

Jeśli masz atrybut text / textarea o nazwie my_attr, możesz go uzyskać przez: product->getMyAttr();

Shahroq
źródło
Zapytałem „bez ładowania całego produktu”
Denis Óbukhov