Magento-Produktattribut Wert abrufen

82

Wie erhalte ich einen bestimmten Produktattributwert, wenn ich die Produkt-ID kenne, ohne das gesamte Produkt zu laden?

Denis Óbukhov
quelle
1
Keine gute Antwort, aber Sie könnten ein Modell erstellen, das die entsprechenden Tabellen direkt abfragt :)
Joseph Mastey

Antworten:

141
Mage::getResourceModel('catalog/product')->getAttributeRawValue($productId, 'attribute_code', $storeId);
Daniel Kocherga
quelle
1
Wie bekomme ich den Optionstext dazu? Weiss es jemand?
Gefürchtetes Semikolon
2
Für diejenigen, denen es wichtig ist: Diese Methode ist nur in 1.6+ verfügbar
JMTyler
40

Ein Weg, den ich kenne:

$product->getResource()->getAttribute($attribute_code)
        ->getFrontend()->getValue($product)
Lucas Moeskops
quelle
3
Vielen Dank. Es war das, wonach ich gesucht habe.
Ricardo Martins
4
Ich bin neu in Magento. Warum $productzweimal verwenden?
Mr_Green
28
@ Mr_Green Weil dies Magento ist. Nein, warum bekommt eine vernünftige Antwort.
Nakajuice
@ Mr_Green, das heißt nicht, es zweimal zu verwenden: Die zweite Zeile ist eine Fortsetzung der ersten. Sie rufen getFrontend () für das von getAttribute () zurückgegebene Objekt auf.
Scott Buchanan
26

Sie können verwenden

<?php echo $product->getAttributeText('attr_id')  ?> 
Rakhi
quelle
2
Dieser Code funktioniert gut. Ich habe viele Blogs durchsucht, aber außer mir hat kein Code für mich funktioniert. Wirklich nett.
Patel Dixit
3
Dieser Code funktioniert nur, wenn das Produktmodell den Attributwert enthält. Wenn Sie nur die Produkt-ID kennen, funktioniert er nicht
Jiří Chmiel
1
Dies funktioniert für Attribute wie Dropdown-Listen. Wenn das Attribut jedoch ein einfaches Textfeld ist, wird eine andere Funktion benötigt. Angenommen, das Attribut ist my_name, dann wird der Code zu $ ​​product-> getMyName ()
Ken
1
@ Ken, wenn Sie ein dynamisches Attribut vom Produkt erhalten müssen, dann können Sie verwenden$product->getData('my_name')
pavlindrom
Und wie würden wir die Options-ID bekommen? $ product-> getAttributeId ('attr_id') ???
snh_nl
9

Bitte lesen Sie die Antwort von Daniel Kocherga , da diese in den meisten Fällen für Sie funktioniert.

Zusätzlich zu dieser Methode, um den Wert des Attributs abzurufen, möchten Sie manchmal die Bezeichnung eines selectoder erhalten multiselect. In diesem Fall habe ich diese Methode erstellt, die ich in einer Hilfsklasse speichere:

/**
 * @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.
quelle
8

Es scheint unmöglich, Wert zu erhalten, ohne das Produktmodell zu laden. Wenn Sie sich die Datei app / code / core / Mage / Eav / Model / Entity / Attribute / Frontend / Abstract.php ansehen, sehen Sie die Methode

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

Wie Sie sehen können, erfordert diese Methode ein geladenes Objekt, um Daten von ihm abzurufen (3. Zeile).

Azakolyukin
quelle
5

Zuerst müssen wir sicherstellen, dass das gewünschte Attribut geladen wird, und es dann ausgeben. Benutze das:

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

Versuche dies

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

Sie müssen nicht das gesamte Produkt laden. Magentos-Kollektionen sind sehr leistungsfähig und intelligent.

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

In dem Moment, in dem Sie getFirstItem () aufrufen, wird die Abfrage ausgeführt und das Ergebnisprodukt ist sehr minimal:

[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
quelle
1

Dieser funktioniert-

echo $_product->getData('ATTRIBUTE_NAME_HERE');
th3pirat3
quelle
2
Die Frage war "ohne das ganze Produkt zu laden".
Denis Óbukhov
0

Sie können den Attributwert folgendermaßen abrufen

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

Alle Dinge, die Sie verwenden, um die Bestellung eines benutzerdefinierten Optionswagens in Magento 2 abzurufen: https://www.mageplaza.com/how-get-value-product-custom-option-cart-order-magento-2.html

Vicent Nguyen
quelle
-2

Sie könnten eine Methode schreiben, die dies direkt über SQL tun würde, nehme ich an.

Würde ungefähr so ​​aussehen:

Variablen:

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

Abfrage:

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

Sie müssten den Wert aus der richtigen Tabelle basierend auf dem Backend-Typ des Attributs (Feld in eav_attribute) abrufen, sodass mindestens eine zusätzliche Abfrage erforderlich ist.

Lucas Moeskops
quelle
Vielen Dank! Sieht gut aus, aber nicht alle Attribute sind varchar und 3 ausgewählte Einschlüsse sind nicht gut. Vielleicht ist es besser, join zu verwenden?
Denis Óbukhov
Ich könnte mich irren, aber meines Wissens gibt es keinen großen Unterschied zwischen Auswählen und Verbinden, da sie vom Abfrageprozessor optimiert werden. Da jedoch nicht alle Attribute varchar sind, müssen Sie zuerst den Backend-Typ des Attributs abrufen, das Sie erhalten möchten, und dann die Tabelle sprintf ('catalog_product_entity_% s', $ backend_type) ^^ verwenden. Aber auch die anderen Typen können nicht mit FIND_IN_SET abgerufen werden, sodass Sie auch dafür etwas finden müssen. Viel Glück!
Lucas Moeskops
-2

Wenn Sie ein text / textarea-Attribut mit dem Namen my_attr haben, können Sie es erhalten durch: product->getMyAttr();

Shahroq
quelle
Ich habe gefragt "ohne das ganze Produkt zu laden"
Denis Óbukhov