Manipulação de atributos do produto agrupado

9

Estou trabalhando na construção de uma nova loja Magento (esta é a minha primeira vez com Magento).

Estou procurando replicar a aparência de uma loja existente para minhas páginas de produtos, pelo menos em termos de layout:

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

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

Eu descobri que preciso usar produtos agrupados, com produtos simples para criar o tipo de coisa que eu procuro.

Nos exemplos acima, cada produto possui atributos separados, suponho que eles sejam feitos por diferentes conjuntos de atributos no Magento.

No entanto, como eles exibem esses títulos / valores de tabela diferentes no tema?

Eu sei que posso fazer ->getAttributeName()ou ->getAttribute('attribute_code')no grouped.phtmlarquivo, mas isso resultaria em uma grande quantidade de if (->getAttributeName() != '')...e eu precisaria alterar o modelo ao adicionar mais.

Tenho certeza de que existe uma maneira de obter todos os atributos e fazer um loop sobre eles, mas como você diferenciaria entre digamos o meta_descriptionatributo (também retornado pelo $_product->getData()método) e um atributo que eu gostaria listado na tabela?

Como eu poderia conseguir algo parecido com o que eles têm?

Também estou preocupado com o desempenho, pois a loja terá 5 mil produtos no lançamento, aumentando para talvez 25 mil a 30 mil à medida que adicionamos nosso estoque restante. Muitos deles precisarão de atributos diferentes, mas acho que eu poderia compartilhar atributos entre conjuntos de atributos sem muitos problemas de desempenho?


Atualizar:

Eu continuei brincando com isso, achei isso para obter todos os atributos de um produto, mas ainda não conheço uma maneira simples de mostrar certos valores em uma tabela agrupada de produtos?

$attributes = Mage::getModel('catalog/product_attribute_api')->items($_product->getAttributeSetId());
foreach($attributes as $_attribute){
    print_r($_attribute);
}
Tom Green
fonte
Por que não usar a propriedade "Visível na página de exibição do produto no front-end" do atributo para determinar se a exibirá na página do produto?
BlueC

Respostas:

2

Deve ser o que você precisa:

$product->getResource()->getAttribute('attribute_code')->getStoreLabel();
benmarks
fonte
Mas isso apenas obteria um único atributo. Preciso de uma maneira de mostrar atributos diferentes para produtos diferentes - conforme os links que incluí no OP?
Tom Green
2

Por que não criar um atributo que informa quais atributos mostrar?

Acabei criando um módulo que carrega o valor de dois atributos de texto para produtos agrupados que são cadeias de código de atributo. Essencialmente, um ajudante que Explode essa cadeia de caracteres da lista e circula sobre ela para carregar os dados de atributo dos produtos associados.

Crie um atributo que chamei de meu:

grouped_attr_array

Inclua o atributo no atributo de design do produto agrupado definido no administrador e depois como um campo separado por ponto e vírgula nos dados do produto

torque_range;torque_increments;torque_accuracy

Peguei esse código do meu módulo. Ele está carregando mais ou ocultando atributos padrão com base em um valor de atributo e o módulo é um pouco mais complexo. Mas, para obter os dados mostrados na tabela, estas são algumas das principais funções. Espero que isso lhe dê uma idéia para construir. Isso está usando o magento 1.9.2

O Auxiliar do Módulo:

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

Obtendo dados do auxiliar em 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 é a mesa

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

Eu gostaria de criar uma maneira de escolher esse atributo com base nos atributos disponíveis da loja. Talvez haja uma maneira muito melhor de fazer isso também. Ainda não chegamos a isso.

asherrard
fonte