Magento - Hinzufügen / Entfernen von Attributen zu vorhandenen konfigurierbaren Produkten

18

Was ist die richtige Vorgehensweise - anstatt das Produkt zu löschen und erneut zu beginnen, Attribute zu vorhandenen konfigurierbaren Produkten hinzuzufügen oder zu entfernen.

Beim Erstellen eines konfigurierbaren Produkts werden Sie aufgefordert, die für das Produkt zu verwendenden Attribute auszuwählen.

Ich habe viele Produkte, für die ich jetzt einige Attribute entfernen muss, die ursprünglich ausgewählt wurden, und einige, für die auch ein Attribut hinzugefügt werden muss, das ursprünglich nicht ausgewählt wurde.

Jede Hilfe dabei ist erwünscht - da das Löschen der Produkte nicht der beste Ansatz dafür ist. Zumal viele andere Dinge mit den Produkten verbunden sind.

eleven11
quelle
Die richtige Antwort lautet hier: Lösche das Produkt und erstelle ein neues, aber es gibt Lösungen für dieses Problem (und ich denke Module), aber ich denke, du kannst selbst googeln, ich habe keine Lösung dafür
Fabian Blechschmidt
Haben Sie eine Lösung dafür gefunden? Ist die unten stehende Antwort die Lösung? Bitte geben Sie ein Update.
Philwinkle
Ich habe es noch nicht versucht. Aber ich werde das sehr bald testen. Vielen Dank für die Beantwortung - ich werde als beantwortet markieren, wenn es funktioniert
elf11
Als ob ich ein Farbattribut hätte und es mit allen konfigurierbaren Produkten verknüpft wäre. Falls dieses Attribut gelöscht wurde. Damit das verknüpfte Attribut dort nicht gefunden wird und ein Fehler als "Hinweis: Undefinierter Offset: 0 in /home/not1son/public_html/vendor/magento/module-configure-product/model/Product/Type/VariationMatrix.php on line angezeigt wird 43 ". Benötigen Sie Hilfe, um mit dieser Situation umzugehen. Vielen Dank im Voraus.
Bhagyashree

Antworten:

14

Hier ist, wofür ich arbeiten muss, um ein Attribut aus dem konfigurierbaren Produkt zu entfernen.
Das ist das Szenario.
Alle konfigurierbaren Produkte wurden falsch mit dem Attribut brandals konfigurierbares Attribut für ungefähr 50 konfigurierbare Produkte mit ungefähr 200 einfachen zugeordneten Produkten erstellt.
Alle einfachen Produkte, die einem konfigurierbaren Attribut zugeordnet sind, haben dieselbe Marke. Die Idee ist, brandaus konfigurierbaren Attributen zu entfernen und sie als einfaches Attribut dem konfigurierbaren Produkt mit dem Wert eines der einfachen Produkte zuzuweisen.
Hier ist der Code, der dies tut. Der Code wird nur einmal ausgeführt. Es kann in einem Upgrade-Skript oder einer einfachen PHP-Datei hinzugefügt werden.

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

Bei den oben aufgeführten Nummern dauerte die Ausführung auf meinem lokalen Computer (kein leistungsstarker Computer) ungefähr 15 Sekunden. Ich bin sicher, dass dies optimiert werden kann. Höchstwahrscheinlich besteht keine Notwendigkeit, alle einfachen Produkte eines konfigurierbaren Produkts zu erhalten, um den brandWert zu erhalten, aber ich habe mich nicht darum gekümmert.

Marius
quelle
2
Ich hasse es, dass es so gemacht werden muss und es gibt keine Methode, um dasselbe zu erreichen, aber danke für die Information.
Webnoob
@Marius, wird das für 1.9 funktionieren?
Magento Learner
@MagentoLearner. Ich weiß es nicht genau, aber ich habe eine Ahnung, dass es funktioniert.
Marius
@Marius, eine sehr schnelle Antwort !!!
Magento Learner
@Marius, Angenommen, ich möchte ein Superattribut hinzufügen. Wenn Sie der Tabelle eine Zeile mit product_id und attribute_id hinzufügen, catalog_product_super_attributefunktioniert das? Oder muss ich andere Tabellen ändern? Wie in stackoverflow.com/a/13381381/1749007
Magento Learner
5

Dies erfordert eine direkte Bearbeitung der Datenbank, und das erste Gesetz von Magento lautet , die Datenbank nicht direkt zu bearbeiten .

Aber wenn Sie verrückt genug sind, um fortzufahren, wurde dies vor ein paar Monaten auf StackOverflow behandelt:

Produkte. Ich habe den folgenden DB-Workaround-Hack auf CE 1.6.2 getestet und er scheint zu funktionieren:

  • Attribut erstellen
  • Ziehen Sie es auf den entsprechenden Attributsatz
  • Gehen Sie zu db editor oder phpmyadmin, sehen Sie sich die Tabelle 'catalog_eav_attribute' an, notieren Sie sich die 'attribute id', notieren Sie sich auch die Produkt-ID -> gehen Sie zu catalog_product_entity und suchen Sie nach dem konfigurierbaren Produkt, das Sie möchten, und notieren Sie entity_id -> this ist die product_id
  • Gehen Sie zu catalog_product_super_attribute und fügen Sie einen neuen Datensatz mit product_id und attribute_id ein, notieren Sie sich die product_super_attribute_id
  • Gehen Sie zu catalog_product_super_attribute_label und fügen Sie einen neuen Datensatz mit product_super_attribute_id und dem Wert Ihres neuen Attributs ein, z. B. 'Color' oder 'Size', den Sie beim Hinzufügen des Attributs im Admin verwendet haben
  • Kehren Sie zu admin zurück und klicken Sie auf das konfigurierbare Produkt. Sie werden feststellen, dass keines Ihrer untergeordneten Produkte mit Ihrem konfigurierbaren Produkt verknüpft ist.
  • Klicken Sie auf eines der untergeordneten Produkte und wählen Sie den entsprechenden Attributwert aus. Sie können auch die SKU ändern.
  • Exportieren Sie alle untergeordneten Produkte und fügen Sie die neuen Attribut- und SKU-Werte hinzu, importieren Sie sie zurück, und Sie sind fertig. Andernfalls müssen Sie möglicherweise alle Änderungen im Administrator manuell vornehmen, ohne den Datenfluss zu verwenden.

Credit: /programming/5658197/add-new-attribute-to-existing-configurable-product-magento

Ungetestet - YMMV.

Philwinkle
quelle
2

Um ein Superproduktattribut (wie sie genannt werden) aus allen konfigurierbaren Produkten zu entfernen, können Sie diese SQL-Abfrage in der Datenbank ausführen:

DELETE FROM catalog_product_super_attribute
WHERE attribute_id = <id>;

Hier ist die ID des Attributs in der Tabelle eav_attribute in Bezug auf attribute_code gespeichert. Die Tabelle catalog_product_super_attribute verknüpft Produkte mit Super-Produktattributen. Sie können Attribute hinzufügen und entfernen, um dort konfigurierbare Produkte zu erstellen.

Abhinav Singh
quelle
1
Um das Superproduktattribut nur von einem bestimmten Einzelprodukt zu entfernen, können Sie die obige SQL-Abfrage so erweitern, dass sie auch nach der Produkt-ID DELETE FROM catalog_product_super_attribute WHERE attribute_id = <attribute_id> AND product_id = <product_id>;
filtert
0

Es gibt einen fehlerhaften Hack, um ein konfigurierbares Produkt zu öffnen und dann ein Duplikat auszuwählen. Wählen Sie das alte und das neue Attribut aus. Das Duplizieren erfolgt ohne SKU. Löschen Sie dann das ursprüngliche konfigurierbare Produkt und die einfachen Produkte. Danach können Sie dieselbe SKU zum Duplizieren geben. Dann müssen Sie nur noch neue einfache Produkte herstellen.

Es ist eine schnelle Umgehung, wenn es nicht so viele einfache Produkte gibt.

Dinko
quelle
Keine richtige Antwort
Deepak Rai
0

Ich habe es gerade geschafft, dies mit dem kostenlosen Magmi-Import-Export-Tool im Aktualisierungsmodus sauberer zu machen. (verständliche Version)

Exportieren Sie Schlüsselfelder, ändern Sie die Spalteneinstellungen von configure_attributes, um konfigurierbare Attribute in einfachem und konfigurierbarem SKUS anzugeben, und importieren Sie sie dann erneut mit Magmi

Als ehemaliger Oracle Consultant würde ich zustimmen, dass Sie sich nicht mit der Datenbank herumschlagen sollten, insbesondere nicht mit einer so komplexen wie der Magento-Datenstruktur. Verwenden Sie dazu besser ein Tool, das bereits ausführlich getestet wurde.

Dave B
quelle
0

Ich musste ein Attribut als eines der "konfigurierbaren" Attribute für ein konfigurierbares Produkt entfernen.

  • Die obigen Verweise auf catalog_product_super_attribute waren korrekt. Mit dem Navicat-Datenbank-Tool habe ich nacheinander einige Dinge erledigt.

    Zu Testzwecken Geändert die Attribute_Id, die es in ein anderes Feld geändert hat, das in anderen Produkten verwendet wird. (Bestätigt, dass es sich um den fraglichen Datensatz handelt). Notieren Sie sich für alle Fälle den vollständigen Datensatz (product_super_attribute_id, product_id, attribute_id, position).

    Schließlich löschte der Datensatz alle zusammen.

Das hat den Trick gemacht. Ich habe auch notiert, was ich getan habe, vorausgesetzt, ich müsste das noch einmal tun.

Nochmals: Das Löschen des Datensatzes in "catalog_product_super_attribute" löste mein Problem, das mit anderen oben in Verbindung zu stehen schien.

Zusätzliche Informationen: Um "attribute_id" mit der richtigen benannten Liste zu korrelieren, ist es wichtig, Folgendes zu beachten: catalog_super_attribute_label -> und über product_super_attribute_id zu korrelieren.
Ich habe nach einem verwandten "attribute_id" -Feld gesucht (noch nicht gefunden).

"product_super_attribute_id" macht den Trick, um Ihnen zu sagen, was die "attribute_id" eigentlich ist. (Ich möchte immer noch den "Standard" -Datensatz für "attribute_id" finden, um zu sehen, wie ein Attribut zuerst in der Datenbank definiert wird.)

L Arnold
quelle