Magentoの製品属性値を取得


82

製品全体をロードせずに製品IDを知っている場合、特定の製品属性値を取得するにはどうすればよいですか?


1
良い答えではありませんが、適切なテーブルを直接クエリするモデルを作成できます:)
Joseph Mastey 2011

回答:



40

私が知っている方法:

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

3
ありがとう。それが私が探していたものでした。
リカルドマーティンズ2012

4
私はmagentoを初めて使用します。なぜ$product2回使用するのですか?
Mr_Green 2013年

28
@Mr_GreenこれはMagentoだからです。「なぜ」は合理的な答えを得ることができません。
nakajuice 2015

@Mr_Green、これは2回使用するという意味ではありません。2行目は最初の行の続きです。getAttribute()によって返されたオブジェクトに対してgetFrontend()を呼び出しています。
スコットブキャナン

26

あなたが使用することができます

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

2
このコードはうまく機能しています。私は多くのブログを検索しましたが、これ以外のコードは1つも機能しませんでした。すごくいい。
Patel Dixit 2014

3
このコードは、製品モデルは、属性値、あなただけの製品IDを知っているとき、それは動作しません含まれている場合にのみ動作します
イジーChmielの

1
これはドロップダウンリストなどの属性で機能しますが、属性が単純なテキストフィールドの場合は、別の関数が必要です。属性がmy_nameであるとすると、コードは$ product-> getMyName()になります
Ken

1
@Ken、製品から動的属性を取得する必要がある場合は、次を使用できます$product->getData('my_name')
pavlindrom 2015

そして、どのようにしてオプションIDを取得しますか?$ product-> getAttributeId( 'attr_id')???
snh_nl 2018年

9

ほとんどの場合はうまくいくので、DanielKochergaの回答を参照してください

属性の値を取得するためのそのメソッドに加えて、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;
}

ご覧のとおり、このメソッドでは、データを取得するためにロードされたオブジェクトが必要です(3行目)。


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
    )


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つの選択された包含は良くありません。たぶん、joinを使用する方が良いですか?
デニスオブホフ

私は間違っているかもしれませんが、私が知る限り、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();


私は、「製品全体をロードせずに、」求めてきました
デニス・オブホフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.