Magento - Aggiungi / Rimuovi attributi ai prodotti configurabili esistenti


18

Qual è la procedura corretta - anziché eliminare il prodotto e ricominciare da capo per aggiungere o rimuovere attributi ai prodotti configurabili esistenti.

Quando si crea un prodotto configurabile, viene richiesto di scegliere quali attributi utilizzare per il prodotto.

Ho molti prodotti che ora devo rimuovere alcuni attributi per i quali sono stati inizialmente selezionati e alcuni che necessitano anche di un attributo che non sono stati inizialmente selezionati.

Qualsiasi aiuto in tal senso è apprezzato: l'eliminazione dei prodotti non sembra l'approccio migliore a questo. Soprattutto perché molte altre cose sono associate ai prodotti.


La risposta corretta qui è: elimina il prodotto e creane uno nuovo, ma ci sono soluzioni per questo problema (e penso ai moduli) ma penso che tu possa google te stesso, non ho in mente una soluzione per questo
Fabian Blechschmidt

Hai trovato una soluzione per questo? La risposta di seguito è la soluzione? Si prega di dare un aggiornamento.
Filwinkle

Non l'ho ancora provato. Ma lo proverò molto presto. Grazie mille per aver risposto
segnerò

Come se avessi un attributo di colore ed era collegato a tutti i prodotti configurabili. Nel caso in cui tale attributo sia stato eliminato. In modo che non trovi quell'attributo collegato lì e mostri un errore come "Avviso: offset indefinito: 0 in /home/not1son/public_html/vendor/magento/module-configure-product/model/Product/Type/VariationMatrix.php on line 43" . Hai bisogno di aiuto per gestire questa situazione. Grazie in anticipo.
Bhagyashree,

Risposte:


14

Ecco quali cuciture lavorare per me per rimuovere un attributo dal prodotto configurabile.
Questo è lo scenario.
Tutti i prodotti configurabili sono stati creati erroneamente con l'attributo brandcome attributo configurabile per circa 50 prodotti configurabili con circa 200 prodotti associati semplici.
Tutti i prodotti semplici associati a un attributo configurabile hanno lo stesso marchio. L'idea è quella di rimuovere branddagli attributi configurabili e assegnarlo come un semplice attributo al prodotto configurabile con il valore di uno dei prodotti semplici.
Ecco il codice che fa questo. Il codice viene eseguito una sola volta. Può essere aggiunto in uno script di aggiornamento o in un semplice file 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;
            }
        }
    }
}

Per i numeri sopra elencati, sono stati necessari circa 15 secondi per l'esecuzione sul mio computer locale (non potente). Sono sicuro che questo può essere ottimizzato. Molto probabilmente non è necessario ottenere tutti i prodotti semplici di un prodotto configurabile per ottenere il brandvalore, ma non mi sono preoccupato.


2
Odio che debba essere fatto in questo modo e non esiste un metodo per ottenere la stessa cosa, ma grazie per l'informazione.
webnoob,

@Marius, funzionerà per 1.9?
Magento Learner

@MagentoLearner. Non lo so per certo ma ho il sospetto che funzioni.
Marius

@ Mario, una risposta molto rapida !!! grazie mille
Magento Learner

@ Mario, Supponiamo che io voglia aggiungere un super attributo. Aggiungendo una riga con product_id e attributo_id alla tabella catalog_product_super_attributefunzionerà? Oppure devo modificare altre tabelle? Come in stackoverflow.com/a/13381381/1749007
Magento Learner

5

Ciò richiede la modifica diretta del database e la prima legge di Magento è di non modificare direttamente il database .

Ma se sei abbastanza pazzo da procedere, questo è stato coperto su StackOverflow qualche mese fa:

dotti. Ho testato la soluzione alternativa di DB per risolvere il problema su CE 1.6.2 e sembra funzionare:

  • Crea attributo
  • Trascinalo sul set di attributi appropriato
  • Vai a db editor o phpmyadmin, tabella 'catalog_eav_attribute' e guarda l'ultimo, nota 'ID attributo', osserva anche l'id prodotto -> vai a catalog_product_entity e cerca il prodotto configurabile che desideri, e nota entity_id -> questo è il product_id
  • Vai a catalog_product_super_attribute e inserisci un nuovo record con product_id e attributo_id, nota del product_super_attribute_id
  • Vai a catalog_product_super_attribute_label e inserisci un nuovo record con product_super_attribute_id e il valore del tuo nuovo attributo, come "Colore" o "Dimensione" che hai usato quando hai aggiunto l'attributo nell'amministratore
  • Torna all'amministratore e fai clic sul prodotto configurabile, noterai che nessuno dei tuoi prodotti figlio è associato al tuo prodotto configurabile.
  • Fai clic su uno dei prodotti figlio e seleziona il valore dell'attributo appropriato, puoi anche modificare lo sku.
  • Esporta tutti i prodotti figlio e aggiungi il nuovo attributo e i valori sku ad esso, importalo di nuovo e hai finito o potresti dover cambiare manualmente tutto nell'amministratore senza usare il flusso di dati.

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

Non testato - YMMV.


2

Per rimuovere un attributo super prodotto (come vengono chiamati) da tutti i prodotti configurabili, è possibile eseguire questa query SQL nel database:

DELETE FROM catalog_product_super_attribute
WHERE attribute_id = <id>;

Qui è l'id dell'attributo memorizzato nella tabella eav_attribute per quanto riguarda attributo_codice. La tabella catalog_product_super_attribute collega i prodotti agli attributi del super prodotto. È possibile aggiungere e rimuovere attributi per creare lì prodotti configurabili.


1
Per rimuovere l'attributo super prodotto da un singolo prodotto specifico è possibile estendere la query SQL sopra indicata per filtrare anche sull'ID prodotto DELETE FROM catalog_product_super_attribute WHERE attribute_id = <attribute_id> AND product_id = <product_id>;
Judder

0

C'è un trucco sporco per aprire il prodotto configurabile, quindi scegliere il duplicato, selezionare l'attributo vecchio e nuovo, il duplicato viene effettuato senza SKU, quindi eliminare il prodotto configurabile originale e i prodotti semplici. Dopodiché puoi dare lo stesso SKU da duplicare. Quindi devi solo creare nuovi prodotti semplici.

È una soluzione rapida se non ci sono molti prodotti semplici.


Non è una risposta corretta
Deepak Rai,

0

Sono appena riuscito a farlo in modo più pulito utilizzando lo strumento di importazione / esportazione Free Magmi in modalità di aggiornamento. (versione comprensiva)

Esporta i campi chiave, modifica le impostazioni della colonna configurable_attributes per specificare gli attributi configurabili su SKUS semplice e configurabile, quindi reimportare utilizzando Magmi

Come ex consulente Oracle, concordo sul fatto di non scherzare con il database, in particolare con una struttura complessa come la struttura di dati Magento: meglio usare uno strumento che è stato ben testato per farlo.


0

Avevo bisogno di rimuovere un attributo dall'essere uno degli attributi "configurabili" per un prodotto configurabile.

  • I riferimenti sopra su catalog_product_super_attribute erano corretti. Utilizzando lo strumento di database Navicat ho fatto in sequenza alcune cose.

    Per il test è stato modificato Attribute_Id, che lo ha modificato in un altro campo utilizzato in altri prodotti. (Confermato che era il record in questione). Annotato, per ogni evenienza, l'intero set di dati record (product_super_attribute_id, product_id, attributo_id, posizione)

    Finalmente cancellato il disco tutti insieme.

Questo ha funzionato. Ho anche preso nota di ciò che ho fatto supponendo che avrei dovuto farlo di nuovo.

Ancora: l'eliminazione del Record in "catalog_product_super_attribute" ha risolto il mio problema che sembrava correlato ad altri sopra.

Informazioni aggiuntive: per correlare "attributo_ID" all'elenco corretto dei nomi è importante guardare: catalog_super_attribute_label -> e correlare tramite product_super_attribute_id.
Stavo cercando un campo "attributo_id" correlato (ancora da trovare).

"product_super_attribute_id" fa il trucco per dirti che cosa è in realtà "attributo_id". (Vorrei ancora trovare il set di dati "predefinito" per "attributo_id" per vedere come un attributo viene definito per la prima volta nel database).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.