Magento Ürün Özelliği Değer Kazanın


82

Ürün kimliğinin tamamını ürünü yüklemeden biliyorsam belirli bir ürün özelliği değerini nasıl elde edebilirim?


1
Harika bir cevap değil, ancak uygun tabloları doğrudan sorgulayan bir model oluşturabilirsiniz :)
Joseph Mastey

Yanıtlar:



40

Bildiğim bir yol:

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

3
Teşekkürler. Aradığım buydu.
Ricardo Martins

4
Magento'da yeniyim .. neden $productiki kere kullanmalıyım ?
Mr_Green

29
@Mr_Green Çünkü bu Magento. Hiçbir 'neden' mantıklı bir cevap almaz.
nakajuice

@Mr_Green, bu onu iki kez kullanmak anlamına gelmiyor: ikinci satır birincinin devamı. GetAttribute () tarafından döndürülen nesnede getFrontend () 'i çağırıyorsunuz.
Scott Buchanan

26

kullanabilirsiniz

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

2
bu kod iyi çalışıyor. Birçok blogu araştırdım ama bunun dışında benim için hiçbir kod çalışmadı. Gerçekten hoş.
Patel Dixit

3
bu kod yalnızca ürün modeli öznitelik değerini içerdiğinde çalışır, yalnızca ürün kimliğini bildiğinizde çalışmaz
Jiří Chmiel

1
Bu, açılır listeler gibi öznitelikler için işe yarar, ancak öznitelik basit bir metin alanıysa, farklı bir işleve ihtiyaç vardır. Özelliğin my_name olduğunu ve ardından kodun $ product-> getMyName ()
Ken

1
@Ken, üründen dinamik bir özellik almanız gerekiyorsa, kullanabilirsiniz$product->getData('my_name')
pavlindrom

Ve Seçenek Kimliğini nasıl alacağız? $ product-> getAttributeId ('attr_id') ???
snh_nl

9

Daniel Kocherga en bakınız cevabı çoğu durumda sizin için çalışacağız olarak.

Özniteliğin değerini almak için bu yönteme ek olarak, bazen a selectveya etiketini almak isteyebilirsiniz multiselect. Bu durumda, bir yardımcı sınıfta sakladığım bu yöntemi oluşturdum:

/**
 * @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

Ürün modelini yüklemeden değer elde etmek imkansız görünüyor. App / code / core / Mage / Eav / Model / Entity / Attribute / Frontend / Abstract.php dosyalarına bakarsanız, yöntemi göreceksiniz.

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

Gördüğünüz gibi bu yöntem, ondan veri almak için yüklü nesneye ihtiyaç duyar (3. satır).


5

Öncelikle istenen özniteliğin yüklendiğinden emin olmalı ve ardından onu çıkarmalıyız. Bunu kullan:

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

4

Bunu dene

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

2

Ürünün tamamını yüklemenize gerek yok. Magentos koleksiyonları çok güçlü ve akıllıdır.

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

GetFirstItem () öğesini çağırdığınız anda sorgu yürütülür ve sonuç ürünü çok azdır:

[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
    )


0

Aşağıdaki yolu izleyerek nitelik değeri elde edebilirsiniz

$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'de değerli ürün özel seçenek sepeti siparişini almak için kullanacağınız her şey: https://www.mageplaza.com/how-get-value-product-custom-option-cart-order-magento-2.html


-2

Bunu doğrudan sql üzerinden yapacak bir yöntem yazabilirsiniz sanırım.

Şuna benzer bir şeye benzeyecektir:

Değişkenler:

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

Sorgu:

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

Değeri, özniteliğin arka uç_tipine (eav_ özniteliğindeki alan) göre doğru tablodan almanız gerekir, ancak bu nedenle en az 1 ek sorgu gerektirir.


Teşekkürler! İyi görünüyor, ancak tüm özellikler varchar değil ve 3 seçilmiş dahil etme iyi değil. Belki katılmayı kullanmak daha iyidir?
Denis Óbukhov

Yanılıyor olabilirim, ancak sorgu işlemcisi tarafından optimize edildikleri için seçme ve birleştirme arasında büyük bir fark olmadığını bildiğim kadarıyla. Ancak tüm özniteliklerin varchar olmadığına ilişkin olarak, önce almak istediğiniz özniteliğin arka uç_tipini almanız ve ardından tablo sprintf ('katalog_ürün_birliği_% s', $ arka uç_türü) ^^ kullanmanız gerekir. Ancak diğer türler de FIND_IN_SET kullanılarak elde edilemez, bu nedenle bunun için de bir şeyler bulmanız gerekecek. İyi şanslar!
Lucas Moeskops

-2

My_attr adında bir metin / metin alanı özelliğiniz varsa, bunu şu şekilde alabilirsiniz: product->getMyAttr();


"Ürünün tamamını yüklemeden" sordum
Denis Óbukhov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.