Manejo de atributos de productos agrupados

9

Estoy trabajando en la construcción de una nueva tienda de Magento (esta es la primera con Magento).

Estoy buscando replicar el aspecto de una tienda existente para mis páginas de productos, al menos en términos de diseño:

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

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

He descubierto que necesito usar productos agrupados, con productos simples para crear el tipo de cosas que busco.

En los ejemplos anteriores, cada producto tiene atributos separados, supongo que estos se realizan a través de diferentes conjuntos de atributos en Magento.

Sin embargo, ¿cómo van a mostrar esos diferentes encabezados / valores de tabla en el tema?

Sé que puedo hacer ->getAttributeName()o ->getAttribute('attribute_code')en el grouped.phtmlarchivo, pero esto resultaría en una gran cantidad de if (->getAttributeName() != '')...y necesitaría cambiar la plantilla al agregar más.

Estoy seguro de que hay una forma de obtener todos los atributos y recorrerlos en bucle, pero entonces, ¿cómo diferenciaría entre decir el meta_descriptionatributo (también devuelto por el $_product->getData()método) y un atributo que quisiera enumerar en la tabla?

¿Cómo podría lograr algo similar a lo que tienen?

También estoy preocupado por el rendimiento, la tienda tendrá 5k productos en el lanzamiento, creciendo a quizás 25k-30k a medida que agreguemos nuestro stock restante. Muchos de estos necesitarán diferentes atributos, pero supongo que podría compartir atributos entre conjuntos de atributos sin demasiados problemas de rendimiento.


Actualizar:

He seguido jugando con esto, he encontrado que esto obtiene todos los atributos de un producto, sin embargo, todavía no conozco una forma simple de mostrar ciertos valores en una tabla de productos agrupados.

$attributes = Mage::getModel('catalog/product_attribute_api')->items($_product->getAttributeSetId());
foreach($attributes as $_attribute){
    print_r($_attribute);
}
Tom Green
fuente
¿Por qué no usar la propiedad "Visible en la página de vista del producto en el front-end" del atributo para determinar si se muestra en la página del producto?
BlueC

Respuestas:

2

Esto debería ser lo que necesitas:

$product->getResource()->getAttribute('attribute_code')->getStoreLabel();
puntos de referencia
fuente
Pero esto solo obtendría un único atributo, necesito una forma de mostrar diferentes atributos para diferentes productos, según los enlaces que incluí en el OP.
Tom Green
2

¿Por qué no crear un atributo que le diga qué atributos mostrar?

Terminé creando un módulo que carga el valor de dos atributos de texto para productos agrupados que son cadenas de código de atributo. Esencialmente un ayudante que explota esa cadena de lista de atributos y la recorre para cargar los datos de atributos de los productos asociados.

Crea un atributo que llamé mío:

grouped_attr_array

Agregue el atributo al conjunto de atributos de diseño del producto agrupado en el administrador y luego, como un campo separado por punto y coma en los datos del producto

torque_range;torque_increments;torque_accuracy

Saqué este código de mi módulo. Está cargando u ocultando un poco más los atributos predeterminados basados ​​en un valor de atributo y el módulo es un poco más complejo. Pero para obtener los datos que se muestran en la tabla, estas son algunas de las funciones principales. Esperemos que te dé una idea sobre la cual construir. Esto está usando magento 1.9.2

El ayudante del 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;
}

Obteniendo datos de helper en 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 es la mesa

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

Me gustaría desarrollar la forma de elegir ese atributo en función de los atributos disponibles de la tienda. Tal vez hay una manera mucho mejor de hacer esto también. Todavía no he llegado a eso.

asherrard
fuente