2011-08-18 6 views
7

Bir öznenin ön uç değerini almanın daha basit bir yolu var mı?

$attributes = array(
    'Category'   => 'type', 
    'Manufacturer'  => 'brand', 
    'Title'    => 'meta_title', 
    'Description'  => 'description', 
    'Product Link'  => 'url_path', 
    'Price'    => 'price', 
    'Product-image link' => 'image', 
    'SKU'    => 'sku', 
    'Stock'    => 'qty', 
    'Condition'   => 'condition', 
    'Shipping cost'  => 'delivery_cost'); 

değerlerini almak için gereken öznitelik kodları dizilim var. Bir ürün koleksiyonunu yineledikten sonra özniteliklerin ön değerlerini alıyorum:

$attributeId = Mage::getResourceModel('eav/entity_attribute') 
    ->getIdByCode('catalog_product', $attribute_code); 
$attribute = Mage::getModel('catalog/resource_eav_attribute') 
    ->load($attributeId); 
$value = $attribute->getFrontend()->getValue($product); 

$product->getDate($attribute) açılır ve çoklu seçim ile çalışmaz, yalnızca kendi değerlerini döndürür ve ön değerlerini döndürmez.

Yukarıdaki kod çalışırken, değeri elde etmenin uzun bir yolu gibi görünüyor, ancak daha önemlisi oldukça yavaş çalışıyor. Ürün özellikleri için önyüz değerleri almak için daha hızlı/daha duyarlı bir yol var mı?

Düzenleme
Şu anda (image ve qty gibi özel durumlarla uğraştıktan sonra) gözlerde biraz daha kolay olan ve daha hızlı çalıştığı görülüyor (nedenini bilmeme rağmen):

$inputType = $product->getResource() 
        ->getAttribute($attribute_code) 
        ->getFrontend() 
        ->getInputType(); 

switch ($inputType) { 
case 'multiselect': 
case 'select': 
case 'dropdown': 
    $value = $product->getAttributeText($attribute_code); 
    if (is_array($value)) { 
     $value = implode(', ', $value); 
    } 
    break; 
default: 
    $value = $product->getData($attribute_code); 
    break; 
} 

$attributesRow[] = $value; 

Bunu herhangi biri geliştirebilir (daha basit/daha verimli hale getirebilir), lütfen bir cevap gönderin.

+2

bu makalede bir göz atın http://blog.chapagain.com.np/magento-how-to-get-attribute-name-and- value/ –

+1

Teşekkürler, yararlı makale. – Jamie

cevap

11

Yalnızca açılır ürünler ve çoklu bağlantılar için ve ürünlerle (bu genel bir EAV numarası değildir) getAttributeText()'u kullanabilirsiniz. Sürüm 1.7 olarak

$value = $product->getAttributeText($attribute_code); 
+0

Bunu işaretlediğiniz için teşekkürler. Bu yöntemin bazı özniteliklerde değil, başka özelliklerde nasıl çalıştığını merak ederdim. – Jamie

0

Bu özellik (örneğin, meta_title için), fakat en basit şekilde böyle genellikle (o bunu Ulaşmaya çalıştığınız bağlamda erişilebilir?) Kurdunuz bağlıdır:

$product->getMetaTitle() 
+0

Teşekkürler, ancak bazı özelliklere magic getter yöntemi kullanılarak erişilemeyebilir. – Jamie

3

, $product->getAttributeText($attribute_code) ürün sayfasında benim için çalışmıyor. İlk başta bunun, catalog_product_flat dizininde bulunmadığını düşündüm. Ancak niteliğin orada olduğu ortaya çıktı. Her durumda, aşağıdaki kod benim için çalışır. Basit kodu deneyin, sonra EAV koduna geri dönün. Böyle

yüzden kullanıyorum kodu:

$value = $product->getAttributeText($attribute_code); // first try the flat table? 
if(empty($value)) { // use the EAV tables only if the flat table doesn't work 
    $value = $product->getResource()->getAttribute($attribute_code)->getFrontend()->getValue($product); 
} 
+1

Bir ürün koleksiyonu aldım ve 'getValue ($ product)' yapmak '' No'' döndürüyordu. '$ Product'' Mage :: getModel ('catalog/product') -> load ($ product-> getEntityId()) 'olarak değiştirdim ve yöntemleri veritabanına gidecek bir ürün aldım. Aksi takdirde, kod verileri dahili değer dizisinden almaya çalışır. Normal şartlar altında, yukarıdaki kodun iyi çalıştığını umuyorum. – pavlindrom