製品全体をロードせずに製品IDを知っている場合、特定の製品属性値を取得する方法は?
Mage::getResourceModel('catalog/product')->getAttributeRawValue($productId, 'attribute_code', $storeId);
私が知っている方法:
$product->getResource()->getAttribute($attribute_code)
->getFrontend()->getValue($product)
使用できます
<?php echo $product->getAttributeText('attr_id') ?>
Daniel Kochergaの answerを参照してください。ほとんどの場合、これでうまくいきます。
属性の値を取得するそのメソッドに加えて、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;
}
製品モデルをロードせずに価値を得るのは不可能のようです。ファイル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行目)。
まず、目的の属性がロードされていることを確認してから、出力する必要があります。これを使って:
$product = Mage::getModel('catalog/product')->load('<product_id>', array('<attribute_code>'));
$attributeValue = $product->getResource()->getAttribute('<attribute_code>')->getFrontend()->getValue($product);
これを試して
$attribute = $_product->getResource()->getAttribute('custom_attribute_code');
if ($attribute)
{
echo $attribute_value = $attribute ->getFrontend()->getValue($_product);
}
製品全体をロードする必要はありません。 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
)
これは動作します
echo $_product->getData('ATTRIBUTE_NAME_HERE');
次の方法で属性値を取得できます
$model = Mage::getResourceModel('catalog/product');
$attribute_value = $model->getAttributeRawValue($productId, 'attribute_code', $storeId);