2011-08-18 8 views
7

Mam tablicę kodów atrybutów, które trzeba uzyskać wartości:Czy istnieje prostszy sposób uzyskania wartości frontend atrybutu?

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

Po iteracja kolekcji produktów otrzymuję wartości frontend atrybutów tak:

$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); 

Simply użycie $product->getDate($attribute) nie będzie działać z rozwijanymi i wielokrotnymi zaznaczeniami, po prostu zwraca ich identyfikator, a nie wartość frontendu.

Chociaż powyższy kod działa, wydaje się, że uzyskanie wartości jest dalekie, ale co ważniejsze, działa dość wolno. Czy istnieje szybszy/bardziej rozsądny sposób uzyskania wartości frontendu dla atrybutów produktu?

Edit
Mam teraz następujące (po kontaktach ze szczególnych przypadkach, takich jak image i qty), która jest nieco łatwiej na oczy i wydaje się działać szybciej (choć nie wiem dlaczego):

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

Jeśli ktokolwiek może to poprawić (spraw, aby był prostszy/bardziej wydajny), proszę napisać odpowiedź.

+2

Spójrz na ten artykuł http://blog.chapagain.com.np/magento-how-to-get-attribute-name-and- value/ –

+1

Dzięki, użyteczny artykuł. – Jamie

Odpowiedz

11

Dla dropdownów i multiselectów oraz tylko z produktami (nie jest to ogólna sztuczka EAV), można użyć getAttributeText().

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

Dzięki za wskazanie tego. Zastanawiałem się, jak to jest, że ta metoda działa na pewne atrybuty, a nie na inne. – Jamie

0

To zależy od sposobu skonfigurowania atrybutu (jest dostępny z kontekstu, który próbujesz go osiągnąć?), Ale najprostszym sposobem jest zwykle tak (dla meta_title, na przykład):

$product->getMetaTitle() 
+0

Dzięki, ale niektóre atrybuty mogą być niedostępne za pomocą magicznej metody gettera. – Jamie

3

W wersji 1.7, $product->getAttributeText($attribute_code) nie działa na mnie na stronie produktu. Początkowo myślałem, że to dlatego, że atrybut nie był w katalogu catalog_product_flat index. Okazało się jednak, że atrybut istnieje. W każdym razie poniższy kod działa dla mnie. Próbuję prosty kod, a następnie cofam kod EAV.

Więc używam kod tak:

$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

Wyszukałem kolekcję produktów, a zrobienie 'getValue ($ product)' zwróciło '' No''. Zmieniłem '$ product' na' Mage :: getModel ("katalog/produkt") -> load ($ product-> getEntityId()) 'i otrzymałem produkt, którego metody trafiłyby do bazy danych. W przeciwnym razie kod spróbuje pobrać dane z wewnętrznej tablicy wartości. W normalnych okolicznościach, spodziewam się, że powyższy kod działa dobrze. – pavlindrom