Magento - Adicionar / remover atributos de produtos configuráveis ​​existentes

18

Qual é o procedimento correto - em vez de excluir o produto e começar novamente para adicionar ou remover atributos de produtos configuráveis ​​existentes.

Ao criar um produto configurável, você é solicitado a escolher quais atributos usar para o produto.

Agora eu tenho muitos produtos para remover alguns atributos que foram selecionados inicialmente e alguns que também precisam de uma adição de atributos que não foram selecionados inicialmente.

Qualquer ajuda para isso é apreciada - pois excluir os produtos não parece ser a melhor abordagem para isso. Especialmente porque muitas outras coisas estão associadas aos produtos.

eleven11
fonte
A resposta correta aqui é: exclua o produto e crie um novo, mas existem soluções para esse problema (e eu acho que módulos), mas acho que você pode pesquisar no google, não tenho uma solução para isso
Fabian Blechschmidt
Você encontrou uma solução para isso? A resposta abaixo é a solução? Por favor, atualize.
philwinkle
Ainda não tentei. Mas testarei isso muito em breve. Muito obrigado pela resposta - Eu vou marcar como respondeu se ele funciona
eleven11
Como se eu tivesse um atributo de cor e estivesse vinculado a todos os produtos configuráveis, esse atributo foi excluído. Para que ele não encontre esse atributo vinculado e mostre um erro como "Aviso: deslocamento indefinido: 0 em /home/not1son/public_html/vendor/magento/module-configure-product/model/Product/Type/VariationMatrix.php on-line 43 ". Precisa de ajuda para lidar com esta situação. Agradecemos antecipadamente.
Bhagyashree

Respostas:

14

Aqui está o que costuras para trabalhar para remover um atributo do produto configurável.
Este é o cenário.
Todos os produtos configuráveis ​​foram criados incorretamente com o atributo brandcomo atributo configurável para cerca de 50 produtos configuráveis ​​com cerca de 200 produtos associados simples.
Todos os produtos simples associados a um atributo configurável têm a mesma marca. A idéia é remover branddos atributos configuráveis ​​e atribuí-lo como um atributo simples ao produto configurável com o valor de um dos produtos simples.
Aqui está o código que faz isso. O código é executado apenas uma vez. Ele pode ser adicionado em um script de atualização ou em um arquivo php simples.

<?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 os números listados acima, demorou cerca de 15 segundos para executar na minha máquina local (não uma poderosa). Tenho certeza de que isso pode ser otimizado. Provavelmente, não há necessidade de obter todos os produtos simples de um produto configurável para obter o brandvalor, mas não me incomodei.

Marius
fonte
2
Eu odeio que isso tenha que ser feito dessa maneira e não existe um método para conseguir a mesma coisa, mas obrigado pela informação.
Webnoob 18/08/14
@ Marius, isso funcionará para 1,9?
Magento Learner
@MagentoLearner. Não sei ao certo, mas tenho um palpite de que funciona.
Marius
@ Marius, uma resposta muito rápida !!! muito obrigado
Magento Learner
@ Marius, suponha que eu queira adicionar um super atributo. Adicionando uma linha com product_id e attribute_id à tabela catalog_product_super_attributefuncionará? Ou então eu preciso modificar outras tabelas? Como em stackoverflow.com/a/13381381/1749007
Magento Learner 16/16
5

Isso requer edição direta do banco de dados, e a primeira lei do Magento é não editar diretamente o banco de dados .

Mas se você é louco o suficiente para continuar, isso foi abordado no StackOverflow há alguns meses:

ucts. Testei o hack da solução alternativa do banco de dados abaixo no CE 1.6.2 e parece estar funcionando:

  • Criar atributo
  • Arraste-o para o conjunto de atributos apropriado
  • Vá para o editor de db ou phpmyadmin, tabela 'catalog_eav_attribute' e veja o último, observe o 'atributo id', observe também o ID do produto -> vá para catalog_product_entity e procure o produto configurável desejado e observe entity_id -> this é o product_id
  • Vá para catalog_product_super_attribute e insira um novo registro com product_id e attribute_id, nota do product_super_attribute_id
  • Vá para catalog_product_super_attribute_label e insira um novo registro com product_super_attribute_id e o valor do seu novo atributo, como 'Cor' ou 'Tamanho', que você usou ao adicionar o atributo no administrador
  • Volte para admin e clique no produto configurável. Você perceberá que nenhum dos seus produtos filhos está associado ao seu produto configurável.
  • Clique em um dos produtos filhos e selecione o valor do atributo apropriado. Você também pode alterar o sku.
  • Exporte todos os produtos filhos e inclua o novo atributo e os valores de sku, importe-o de volta e está pronto ou talvez seja necessário alterar manualmente tudo no administrador sem usar o fluxo de dados.

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

Não testado - YMMV.

philwinkle
fonte
2

Para remover um atributo de superproduto (como são chamados) de todos os produtos configuráveis, você pode executar esta consulta SQL no banco de dados:

DELETE FROM catalog_product_super_attribute
WHERE attribute_id = <id>;

Aqui está o ID do atributo armazenado na tabela eav_attribute em relação ao attribute_code. A tabela catalog_product_super_attribute vincula produtos a atributos de superprodutos. Você pode adicionar e remover atributos para criar produtos configuráveis ​​lá.

Abhinav Singh
fonte
11
Para remover apenas o atributo superproduto de um único produto específico, você pode estender a consulta SQL acima para filtrar também no ID do produto DELETE FROM catalog_product_super_attribute WHERE attribute_id = <attribute_id> AND product_id = <product_id>;
Judder
0

Há um truque sujo para abrir o produto configurável, em seguida, escolha duplicar, selecione o atributo antigo e o novo, a duplicação é feita sem o SKU e exclua o produto configurável original e produtos simples. Depois disso, você pode dar o mesmo SKU para duplicar. Então você só precisa criar novos produtos simples.

É uma solução rápida, se não houver muitos produtos simples.

Dinko
fonte
Resposta não apropriada
Deepak Rai
0

Acabei de fazer isso de forma mais limpa usando a ferramenta de exportação de importação Free Magmi no modo de atualização. (versão compreensiva)

Exporte os campos-chave, altere as configurações da coluna configurable_attributes para especificar atributos configuráveis ​​no SKUS simples e configurável e depois reimporte usando o Magmi

Como ex-consultor da Oracle, eu concordo que não mexa com o banco de dados, especialmente um tão complexo quanto a estrutura de dados do Magento - melhor usar uma ferramenta que foi bem testada para fazer isso.

Dave B
fonte
0

Eu precisava remover um atributo de ser um dos atributos "configuráveis" para um produto configurável.

  • As referências acima sobre catalog_product_super_attribute estavam corretas. Usando a ferramenta de banco de dados Navicat, fiz sequencialmente algumas coisas.

    Para teste, foi alterado o Attribute_Id, que foi alterado para outro campo usado em outros produtos. (Confirmado que era o registro em questão). Escreveu, apenas no caso, o conjunto completo de dados de registro (product_super_attribute_id, product_id, attribute_id, position)

    Finalmente, excluiu o registro todos juntos.

Isso fez o truque. Também anotei o que fiz, assumindo que precisaria fazer isso novamente.

Novamente: a exclusão do registro em "catalog_product_super_attribute" resolveu meu problema, que parecia relacionado aos outros acima.

Informações extras: para correlacionar "attribute_id" à lista nomeada correta, é importante olhar para: catalog_super_attribute_label -> e correlacionar via product_super_attribute_id.
Eu estava procurando por um campo "attribute_id" relacionado (ainda por encontrar).

"product_super_attribute_id" faz o truque para dizer o que realmente é o "attribute_id". (Gostaria de ainda encontrar o conjunto de dados "padrão" para "attribute_id" para ver como o atributo é definido pela primeira vez no banco de dados).

L Arnold
fonte