Magento - Agregar / Eliminar atributos a productos configurables existentes

18

¿Cuál es el procedimiento correcto? En lugar de eliminar el producto y comenzar de nuevo para agregar o eliminar atributos a productos configurables existentes.

Al crear un producto configurable, se le pide que elija qué atributos usar para el producto.

Tengo muchos productos, ahora necesito eliminar algunos atributos para los que se seleccionaron inicialmente, y algunos que también necesitan agregar un atributo que no se seleccionaron inicialmente.

Se agradece cualquier ayuda con esto, ya que eliminar los productos no parece ser el mejor enfoque para esto. Especialmente porque muchas otras cosas están asociadas a los productos.

once11
fuente
La respuesta correcta aquí es: elimine el producto y cree uno nuevo, pero hay soluciones para este problema (y creo que los módulos) pero creo que puede buscar en Google, no tengo una solución para esto
Fabian Blechschmidt
¿Encontraste una solución para esto? ¿Es la respuesta a continuación la solución? Por favor dar una actualización.
philwinkle
No lo he probado todavía. Pero lo probaré muy pronto. Muchas gracias por responder
Marcaré
Como si tuviera un atributo de color y estaba vinculado con todos los productos configurables. En caso de que ese atributo haya sido eliminado. Para que no se encuentre ese atributo vinculado allí y se muestre un error como "Aviso: desplazamiento indefinido: 0 en /home/not1son/public_html/vendor/magento/module-configure-product/model/Product/Type/VariationMatrix.php en línea 43 ". Necesito ayuda para manejar esta situación. Gracias de antemano.
Bhagyashree

Respuestas:

14

Esto es lo que me funciona para eliminar un atributo del producto configurable.
Este es el escenario.
Todos los productos configurables se crearon incorrectamente con el atributo brandcomo un atributo configurable para aproximadamente 50 productos configurables que tienen aproximadamente 200 productos simples asociados.
Todos los productos simples asociados a un atributo configurable tienen la misma marca. La idea es eliminar brandde los atributos configurables y asignarlo como un atributo simple al producto configurable con el valor de uno de los productos simples.
Aquí está el código que hace esto. El código se ejecuta solo una vez. Se puede agregar en un script de actualización o en un simple archivo php.

<?php
//==>this is required only if you use a simple php file
error_reporting(E_ALL | E_STRICT);
$mageFilename = 'app/Mage.php';
require_once $mageFilename;
Mage::setIsDeveloperMode(true);
ini_set('display_errors', 1);
umask(0);
Mage::app();
//<==

$brand = 'brand';
//get the attribute instance
$brandAttribute = Mage::getModel('eav/config')->getAttribute('catalog_product', $brand);
//if this attribute exists
if ($brandAttribute->getId()){
    //make the attribute apply to al types of products in case it's not
    $brandAttribute->setApplyTo(null);
    $brandAttribute->save();
    $resource = Mage::getSingleton('core/resource');
    //get an object with access to direct queries
    $connection = $resource->getConnection('core_write');
    //get all configurable products - you can specify additional filters here
    $collection = Mage::getModel('catalog/product')->getCollection()
        ->addAttributeToFilter('type_id', 'configurable');
    foreach ($collection as $product){
        //the configurable attributes are stored in the table 'catalog_product_super_attribute'
        //remove the attribute references from that table. 
        //The constraints will take care of the cleanup.
        $q = "DELETE FROM {$resource->getTableName('catalog_product_super_attribute')}
            WHERE attribute_id = {$brandAttribute->getId()} AND product_id = {$product->getId()}";
        $connection->query($q);
        //get the simple products in the configurable product
        $usedProducts =  $product->getTypeInstance(true)->getUsedProducts(null, $product);
        foreach ($usedProducts as $p){
            //identify the first simple product that has a value for brand 
            //set that value to the configurable product.
            if ($brandValue = $p->getData($brand)){
                Mage::getSingleton('catalog/product_action')
                    ->updateAttributes(array($product->getId()), array($brand=>$brandValue), 0);
                break;
            }
        }
    }
}

Para los números enumerados anteriormente, esto tardó aproximadamente 15 segundos en ejecutarse en mi máquina local (no potente). Estoy seguro de que esto se puede optimizar. Lo más probable es que no sea necesario obtener todos los productos simples de un producto configurable para obtener el brandvalor, pero no me molesté.

Marius
fuente
2
Odio que tenga que hacerse de esta manera y no hay un método para lograr lo mismo, pero gracias por la información.
webnoob
@ Mario, ¿funcionará esto para 1.9?
Magento Learner
@MagentoLearner. No estoy seguro, pero tengo el presentimiento de que funciona.
Marius
@ Mario, una respuesta muy rápida !!! muchas gracias
Magento Learner
@ Mario, supongamos que quiero agregar un súper atributo. ¿Al agregar una fila con product_id y attribute_id a la tabla catalog_product_super_attributefuncionará? ¿O de lo contrario necesito modificar otras tablas? Como en stackoverflow.com/a/13381381/1749007
Magento Learner
5

Esto requiere la edición directa de la base de datos, y la primera ley de Magento es no editar directamente la base de datos .

Pero si está lo suficientemente loco como para continuar, esto fue cubierto en StackOverflow hace unos meses:

ucts. He probado el siguiente truco de solución de problemas de DB en CE 1.6.2 y parece estar funcionando:

  • Crear atributo
  • Arrástrelo al conjunto de atributos apropiado
  • Vaya a db editor o phpmyadmin, tabla 'catalog_eav_attribute' y mire el último, tenga en cuenta el 'id de atributo', también tenga en cuenta el id del producto -> vaya a catalog_product_entity y busque el producto configurable que desea, y tenga en cuenta entity_id -> this es el product_id
  • Vaya a catalog_product_super_attribute e inserte un nuevo registro con product_id y attribute_id, nota del product_super_attribute_id
  • Vaya a catalog_product_super_attribute_label e inserte un nuevo registro con product_super_attribute_id y el valor de su nuevo atributo, como 'Color' o 'Tamaño' que utilizó al agregar el atributo en el administrador
  • Vuelva a admin y haga clic en el producto configurable, notará que ninguno de sus productos secundarios está asociado a su producto configurable.
  • Haga clic en uno de los productos secundarios y seleccione el valor de atributo apropiado, también puede cambiar el sku.
  • Exporte todos los productos secundarios y agregue los nuevos atributos y valores de sku, impórtelos de nuevo y listo, o puede que tenga que cambiar manualmente todo en el administrador sin usar el flujo de datos.

Crédito: /programming/5658197/add-new-attribute-to-existing-configurable-product-magento

No probado - YMMV.

philwinkle
fuente
2

Para eliminar un atributo de superproducto (como se les llama) de todos los productos configurables, puede ejecutar esta consulta SQL en la base de datos:

DELETE FROM catalog_product_super_attribute
WHERE attribute_id = <id>;

Aquí, está la identificación del atributo almacenado en la tabla eav_attribute con respecto a attribute_code. La tabla catalog_product_super_attribute vincula productos a atributos de superproductos. Puede agregar y eliminar atributos para crear productos configurables allí.

Abhinav Singh
fuente
1
Para eliminar solo el atributo de superproducto de un solo producto específico, puede extender la consulta SQL anterior para filtrar también en la ID del producto DELETE FROM catalog_product_super_attribute WHERE attribute_id = <attribute_id> AND product_id = <product_id>;
Judder
0

Hay un truco sucio para abrir un producto configurable, luego elija duplicar, seleccione el atributo antiguo y nuevo, el duplicado se realiza sin SKU, luego elimine el producto configurable original y los productos simples. Después de eso, puede dar el mismo SKU para duplicar. Entonces solo necesita hacer nuevos productos simples.

Es una solución rápida si no hay tantos productos simples.

Dinko
fuente
No es una respuesta adecuada
Deepak Rai
0

Acabo de hacer esto de manera más limpia usando la herramienta de exportación de importación Free Magmi en modo de actualización. (versión de comprensión)

Exporte campos clave, cambie la configuración de la columna configurable_attributes para especificar atributos configurables en SKUS simples y configurables y luego vuelva a importar utilizando Magmi

Como ex Consultor de Oracle, estoy de acuerdo en no meterse con la base de datos, especialmente una tan compleja como la estructura de datos de Magento, mejor usar una herramienta que haya sido probada para hacer esto.

Dave B
fuente
0

Necesitaba eliminar un atributo de ser uno de los atributos "configurables" para un producto configurable.

  • Las referencias anteriores sobre catalog_product_super_attribute fueron correctas. Usando la herramienta de base de datos Navicat hice secuencialmente algunas cosas.

    Para probar Cambió el Id. De atributo, eso lo cambió a otro campo que se usa en otros productos. (Confirmado que era el registro en cuestión). Anotó, por si acaso, el conjunto completo de datos de registro (product_super_attribute_id, product_id, attribute_id, position)

    Finalmente borré el registro todos juntos.

Eso hizo el truco. También mantuve una nota de lo que hice asumiendo que tendría que hacer esto nuevamente.

Nuevamente: Eliminar el registro en "catalog_product_super_attribute" resolvió mi problema que parecía relacionado con otros anteriores.

Información adicional: para correlacionar "attribute_id" con la lista correcta con nombre, es importante mirar: catalog_super_attribute_label -> y correlacionar a través de product_super_attribute_id.
Había estado buscando un campo relacionado "id_atributo" (aún no lo había encontrado).

"product_super_attribute_id" hace el truco para decirte qué es realmente el "attribute_id". (Me gustaría encontrar el conjunto de datos "predeterminado" para "attribute_id" para ver cómo se define por primera vez un atributo en la base de datos).

L Arnold
fuente