Magento - Ajouter / supprimer des attributs aux produits configurables existants

18

Quelle est la procédure correcte - plutôt que de supprimer le produit et de recommencer pour ajouter ou supprimer des attributs aux produits configurables existants.

Lors de la création d'un produit configurable, vous êtes invité à choisir les attributs à utiliser pour le produit.

J'ai beaucoup de produits dont j'ai maintenant besoin de supprimer certains attributs qui ont été sélectionnés initialement, et certains qui ont également besoin d'un ajout d'attribut qui n'ont pas été initialement sélectionnés.

Toute aide à cet égard est appréciée - car la suppression des produits ne semble pas être la meilleure approche. D'autant plus que beaucoup d'autres choses sont associées aux produits.

onze11
la source
La bonne réponse ici est: supprimez le produit et créez-en un nouveau, mais il existe des solutions à ce problème (et je pense que les modules) mais je pense que vous pouvez google vous-même, je n'ai pas de solution pour cela
Fabian Blechschmidt
Avez-vous trouvé une solution pour cela? La réponse ci-dessous est-elle la solution? Veuillez donner une mise à jour.
philwinkle
Je ne l'ai pas encore essayé. Mais je vais tester cela très bientôt. Merci beaucoup d'avoir répondu - je marquerai comme ayant répondu si cela fonctionne
onze11
Comme si j'avais un attribut de couleur et qu'il était lié à tous les produits configurables.Dans le cas où cet attribut a été supprimé. Pour qu'il ne trouve pas cet attribut lié et affiche une erreur comme "Remarque: décalage indéfini: 0 dans /home/not1son/public_html/vendor/magento/module-configure-product/model/Product/Type/VariationMatrix.php on line 43 ". Besoin d'aide pour gérer cette situation, merci d'avance.
Bhagyashree

Réponses:

14

Voici ce qui semble fonctionner pour moi pour supprimer un attribut du produit configurable.
Voici le scénario.
Tous les produits configurables ont été créés incorrectement avec l'attribut brandcomme attribut configurable pour environ 50 produits configurables ayant environ 200 produits associés simples.
Tous les produits simples associés à un attribut configurable ont la même marque. L'idée est de supprimer branddes attributs configurables et de l'attribuer en tant qu'attribut simple au produit configurable avec la valeur de l'un des produits simples.
Voici le code qui fait cela. Le code est exécuté une seule fois. Il peut être ajouté dans un script de mise à niveau ou un simple fichier 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;
            }
        }
    }
}

Pour les nombres répertoriés ci-dessus, cela a pris environ 15 secondes pour s'exécuter sur ma machine locale (pas puissante). Je suis sûr que cela peut être optimisé. Très probablement, il n'est pas nécessaire d'obtenir tous les produits simples d'un produit configurable pour obtenir la brandvaleur, mais je n'ai pas pris la peine.

Marius
la source
2
Je déteste que cela doive être fait de cette façon et il n'y a pas de méthode pour réaliser la même chose mais merci pour l'information.
webnoob
@Marius, est-ce que cela fonctionnera pour 1.9?
Magento Learner
@MagentoLearner. Je ne sais pas avec certitude mais j'ai le pressentiment que cela fonctionne.
Marius
@Marius, une réponse très rapide !!! merci beaucoup
Magento Learner
@Marius, supposons que je veuille ajouter un super attribut. En ajoutant une ligne avec product_id et attribute_id à la table catalog_product_super_attributefonctionnera? Ou bien dois-je modifier d'autres tables? Comme dans stackoverflow.com/a/13381381/1749007
Magento Learner
5

Cela nécessite une modification directe de la base de données, et la première loi de Magento est ne pas modifier directement la base de données .

Mais si vous êtes assez fou pour continuer, cela a été couvert sur StackOverflow il y a quelques mois:

ucts. J'ai testé le hack de solution de contournement DB ci-dessous sur CE 1.6.2 et il semble fonctionner:

  • Créer un attribut
  • Faites-le glisser vers le jeu d'attributs approprié
  • Allez dans db editor ou phpmyadmin, table 'catalog_eav_attribute' et regardez le dernier, notez 'id d'attribut', notez également l'id de produit -> allez dans catalog_product_entity et recherchez le produit configurable que vous voulez, et notez entity_id -> ceci est le product_id
  • Accédez à catalog_product_super_attribute et insérez un nouvel enregistrement avec product_id et attribute_id, note de product_super_attribute_id
  • Accédez à catalog_product_super_attribute_label et insérez un nouvel enregistrement avec product_super_attribute_id et la valeur de votre nouvel attribut, comme «Couleur» ou «Taille» que vous avez utilisé lors de l'ajout de l'attribut dans l'admin
  • Revenez à l'administrateur et cliquez sur le produit configurable, vous remarquerez qu'aucun de vos produits enfants n'est associé à votre produit configurable.
  • Cliquez sur l'un des produits enfants et sélectionnez la valeur d'attribut appropriée, vous pouvez également modifier le sku.
  • Exportez tous les produits enfants et ajoutez-y le nouvel attribut et les valeurs sku, réimportez-le et vous avez terminé ou vous devrez peut-être tout modifier manuellement dans l'administrateur sans utiliser le flux de données.

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

Non testé - YMMV.

philwinkle
la source
2

Pour supprimer un attribut de super produit (comme on les appelle) de tous les produits configurables, vous pouvez exécuter cette requête SQL dans la base de données:

DELETE FROM catalog_product_super_attribute
WHERE attribute_id = <id>;

Ici, est l'id de l'attribut stocké dans la table eav_attribute concernant l'attribut_code. La table catalog_product_super_attribute relie les produits aux attributs de super produit. Vous pouvez ajouter et supprimer des attributs pour y créer des produits configurables.

Abhinav Singh
la source
1
Pour supprimer uniquement l'attribut super produit d'un seul produit spécifique, vous pouvez étendre la requête SQL ci-dessus pour filtrer également sur l'ID produit DELETE FROM catalog_product_super_attribute WHERE attribute_id = <attribute_id> AND product_id = <product_id>;
Judder
0

Il y a un hack sale pour ouvrir le produit configurable, puis choisissez dupliquer, sélectionnez l'ancien et le nouvel attribut, le duplicata est fait sans SKU, puis supprimez le produit configurable d'origine et les produits simples. Après cela, vous pouvez donner le même SKU à dupliquer. Il vous suffit ensuite de créer de nouveaux produits simples.

C'est une solution rapide s'il n'y a pas beaucoup de produits simples.

Dinko
la source
Pas une bonne réponse
Deepak Rai
0

Je viens de réussir à le faire plus proprement en utilisant l'outil d'importation d'importation Free Magmi en mode mise à jour. (version compréhensible)

Exportez les champs clés, modifiez les paramètres de colonne configurable_attributes pour spécifier des attributs configurables sur des SKUS simples et configurables puis réimportez à l'aide de Magmi

En tant qu'ancien consultant Oracle, je suis d'accord pour ne pas jouer avec la base de données, en particulier une aussi complexe que la structure de données Magento - mieux vaut utiliser un outil qui a été bien testé pour le faire.

Dave B
la source
0

J'ai dû retirer un attribut de l'un des attributs "configurables" d'un produit configurable.

  • Les références ci-dessus à propos de catalog_product_super_attribute étaient correctes. En utilisant l'outil de base de données Navicat, j'ai fait plusieurs choses séquentiellement.

    Pour tester Changed the Attribute_Id, cela l'a changé en un autre champ utilisé dans d'autres produits. (Confirmé que c'était le dossier en cause). A écrit, juste au cas où, l'ensemble complet des données d'enregistrement (product_super_attribute_id, product_id, attribute_id, position)

    Enfin supprimé le dossier tous ensemble.

Cela a fait l'affaire. J'ai également pris note de ce que j'ai fait en supposant que je devrais recommencer.

Encore une fois: la suppression de l'enregistrement dans "catalog_product_super_attribute" a résolu mon problème qui semblait lié aux autres ci-dessus.

Informations supplémentaires: pour corréler "attribut_id" à la liste nommée correcte, il est important de regarder: catalog_super_attribute_label -> et de corréler via product_super_attribute_id.
Je cherchais un champ "attribut_id" connexe (pas encore trouvé).

"product_super_attribute_id" fait l'affaire pour vous dire ce qu'est réellement "attribute_id". (Je voudrais toujours trouver l'ensemble de données "par défaut" pour "attribut_id" pour voir comment un attribut est d'abord défini dans la base de données).

L Arnold
la source