Wie erhalte ich einen bestimmten Produktattributwert, wenn ich die Produkt-ID kenne, ohne das gesamte Produkt zu laden?
Wie erhalte ich einen bestimmten Produktattributwert, wenn ich die Produkt-ID kenne, ohne das gesamte Produkt zu laden?
Antworten:
Mage::getResourceModel('catalog/product')->getAttributeRawValue($productId, 'attribute_code', $storeId);
Ein Weg, den ich kenne:
$product->getResource()->getAttribute($attribute_code)
->getFrontend()->getValue($product)
$product
zweimal verwenden?
Sie können verwenden
<?php echo $product->getAttributeText('attr_id') ?>
$product->getData('my_name')
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 select
oder 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;
}
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).
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);
Versuche dies
$attribute = $_product->getResource()->getAttribute('custom_attribute_code');
if ($attribute)
{
echo $attribute_value = $attribute ->getFrontend()->getValue($_product);
}
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
)
Dieser funktioniert-
echo $_product->getData('ATTRIBUTE_NAME_HERE');
$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
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.
Wenn Sie ein text / textarea-Attribut mit dem Namen my_attr haben, können Sie es erhalten durch:
product->getMyAttr();