Obsługa zgrupowanych atrybutów produktu

9

Pracuję nad budową nowego sklepu Magento (jest to mój pierwszy z Magento).

Chcę odtworzyć wygląd istniejącego sklepu na moich stronach produktów, przynajmniej pod względem układu:

http://www.panamericantool.com/cobalt-drills/drill-stops.html

http://www.panamericantool.com/screw-driver-bits/paint-cutters.html

Doszedłem do wniosku, że muszę używać produktów zgrupowanych, z prostymi produktami, aby stworzyć coś, czego szukam.

W powyższych przykładach każdy produkt ma osobne atrybuty, zakładam, że są one realizowane za pomocą różnych zestawów atrybutów w Magento.

Jak jednak wyświetlają te różne nagłówki / wartości tabeli w motywie?

Wiem, że mogę to zrobić ->getAttributeName()lub ->getAttribute('attribute_code')w grouped.phtmlpliku, ale spowodowałoby to ogromną ilość if (->getAttributeName() != '')...i musiałbym zmienić szablon, dodając więcej.

Jestem pewien, że istnieje sposób na uzyskanie wszystkich atrybutów i zapętlenie ich, ale w jaki sposób rozróżniłbyś powiedzmy meta_descriptionatrybut (zwrócony również przez $_product->getData()metodę) i atrybut, który chciałbym umieścić w tabeli?

Jak mogę osiągnąć coś podobnego do tego, co mają?

Obawiam się również o wydajność, w której sklep będzie miał 5 tys. Produktów w chwili premiery, zwiększając się może do 25–30 tys. W miarę dodawania naszych pozostałych produktów. Wiele z nich będzie wymagało różnych atrybutów, ale zgaduję, że mógłbym dzielić atrybuty między zestawami atrybutów bez zbyt wielu problemów z wydajnością?


Aktualizacja:

Nadal się tym bawiłem, znalazłem to, aby uzyskać wszystkie atrybuty produktów, jednak nadal nie znam prostego sposobu wyświetlania niektórych wartości w tabeli zgrupowanych produktów?

$attributes = Mage::getModel('catalog/product_attribute_api')->items($_product->getAttributeSetId());
foreach($attributes as $_attribute){
    print_r($_attribute);
}
Tom Green
źródło
Dlaczego nie użyć właściwości „Widoczny na stronie widoku produktu w interfejsie użytkownika” atrybutu, aby ustalić, czy ma być wyświetlany na stronie produktu?
BlueC

Odpowiedzi:

2

To powinno być to, czego potrzebujesz:

$product->getResource()->getAttribute('attribute_code')->getStoreLabel();
zalety
źródło
Ale dostałbym tylko jeden atrybut. Potrzebuję sposobu pokazania różnych atrybutów dla różnych produktów - zgodnie z linkami, które zawarłem w PO?
Tom Green
2

Dlaczego nie stworzyć atrybutu, który mówi mu, jakie atrybuty pokazać?

W końcu stworzyłem moduł, który ładuje wartość dwóch atrybutów tekstowych dla zgrupowanych produktów, które są ciągami kodów atrybutów. Zasadniczo pomocnik, który wybucha ten ciąg listy atrybutów i zapętla się nad nim, aby załadować dane atrybutów powiązanych produktów.

Utwórz atrybut, który nazwałem mój:

grouped_attr_array

Dodaj atrybut do zestawu atrybutów projektu zgrupowanego produktu w adminie, a następnie jako pola oddzielone średnikami w danych produktu

torque_range;torque_increments;torque_accuracy

Wyciągnąłem ten kod z mojego modułu. Robi trochę więcej ładowania lub ukrywania domyślnych atrybutów w oparciu o wartość atrybutu, a moduł jest nieco bardziej złożony. Ale aby uzyskać dane przedstawione w tabeli, są to niektóre z podstawowych funkcji. Mam nadzieję, że daje to pomysł, na którym można dalej budować. To używa Magento 1.9.2

Pomocnik modułu:

public function findAttributes($product, $attributes)
{
    //determined by attribute with id to add additional attributes to the table
    //string needs to be ; separated in ADMIN
    $strattributes = $product->getResource()->getAttribute('grouped_attr_array')->getFrontend()->getValue($product);
    if ($strattributes) {
        $strattributes = explode(';', $strattributes, 5);
        foreach ($strattributes as $additionAttribute) {
            //make sure these are valid attributes
            if ($product->getResource()->getAttribute($additionAttribute)) {
                array_push($attributes, $additionAttribute);
            }
        }
    }
}

public function groupedAttrDump($groupedProduct, $attributes)
{
    $cells = [];
    foreach ($attributes as $attrCode) {
        $attrText = $groupedProduct->getResource()->getAttribute($attrCode);
        if($attrText){
            array_push($cells, $attrText->getFrontend()->getValue($groupedProduct));
        }
    }
    return $cells;
}

public function groupedAttrHeaders($currentProduct, $attributes)
{
    $theads = [];
    foreach ($attributes as $attrCode) {
        $headerText = $currentProduct->getResource()->getAttribute($attrCode);
        if($headerText){
            $headerText = $headerText->getStoreLabel();
            array_push($theads,$headerText);
        }

    }
    return $theads;
}

Pobieranie danych z pomocnika w groupedproduct.phtml

$attrrSetName = Mage::getModel("eav/entity_attribute_set")->load($_product->getAttributeSetId())->getAttributeSetName();
$tableAttributes = Mage::helper('groupedtable')->findAttributes($_product, $attrrSetName);

TH's

     <?php foreach (Mage::helper('groupedtable')->groupedAttrHeaders($_product, $tableAttributes) as $attrLabel ): ?>
        <th><?php echo $attrLabel ?> </th>
     <?php endforeach; ?>

TD to stół

<?php foreach (Mage::helper('groupedtable')->groupedAttrDump($_associatedProduct, $tableAttributes) as $attr ):?>
        <td><?php if($attr != 'No'){ echo $attr; } ?></td>
   <?php endforeach; ?>

Chciałbym ustalić sposób wyboru tego atrybutu w oparciu o dostępne atrybuty sklepu. Może jest też o wiele lepszy sposób na zrobienie tego. Jeszcze do tego nie dotarłem.

asherrard
źródło