Magento - dodaj / usuń atrybuty istniejących produktów konfigurowalnych


18

Jaka jest poprawna procedura - zamiast usuwania produktu i rozpoczynania od nowa dodawania lub usuwania atrybutów do istniejących produktów konfigurowalnych.

Podczas tworzenia konfigurowalnego produktu użytkownik jest proszony o wybranie atrybutów używanych dla produktu.

Mam wiele produktów, teraz muszę usunąć niektóre atrybuty, które zostały wybrane początkowo, a niektóre wymagają dodania atrybutów, które nie zostały początkowo wybrane.

Doceniamy wszelką pomoc - usunięcie produktów nie wydaje się najlepszym rozwiązaniem. Zwłaszcza, że ​​z produktami wiąże się wiele innych rzeczy.


Prawidłowa odpowiedź tutaj: usuń produkt i utwórz nowy, ale istnieją rozwiązania tego problemu (i myślę, że moduły), ale myślę, że możesz google samodzielnie, nie mam na to rozwiązania
Fabian Blechschmidt

Czy znalazłeś na to rozwiązanie? Czy poniższe odpowiedzi stanowią rozwiązanie? Proszę o aktualizację.
philwinkle

Jeszcze tego nie próbowałem. Ale wkrótce to przetestuję. Bardzo dziękuję za odpowiedź
oznaczę

Jakbym miał atrybut koloru i był on połączony ze wszystkimi konfigurowalnymi produktami. W przypadku tego atrybutu został usunięty. Tak, aby nie znalazł tam połączonego atrybutu i wyświetlał błąd jako „Uwaga: Nieokreślone przesunięcie: 0 w /home/not1son/public_html/vendor/magento/module-configure-product/model/Product/Type/VariationMatrix.php w trybie online 43 ". Potrzebujesz pomocy, aby poradzić sobie z tą sytuacją. Z góry dzięki.
Bhagyashree

Odpowiedzi:


14

Oto, co dla mnie działają, aby usunąć atrybut z konfigurowalnego produktu.
To jest scenariusz.
Wszystkie konfigurowalne produkty zostały utworzone niepoprawnie z atrybutem brandjako konfigurowalnym atrybutem dla około 50 konfigurowalnych produktów posiadających około 200 prostych powiązanych produktów.
Wszystkie proste produkty powiązane z konfigurowalnym atrybutem mają tę samą markę. Chodzi o to, aby usunąć brandz konfigurowalnych atrybutów i przypisać je jako prosty atrybut do konfigurowalnego produktu o wartości jednego z prostych produktów.
Oto kod, który to robi. Kod jest uruchamiany tylko raz. Można go dodać w skrypcie aktualizacji lub prostym pliku 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;
            }
        }
    }
}

W przypadku liczb wymienionych powyżej uruchomienie na moim komputerze lokalnym (niezbyt mocnym) zajęło około 15 sekund. Jestem pewien, że można to zoptymalizować. Najprawdopodobniej nie ma potrzeby uzyskiwania wszystkich prostych produktów konfigurowalnego produktu, aby uzyskać brandwartość, ale nie zawracałem sobie tym głowy.


2
Nienawidzę, że trzeba to zrobić w ten sposób i nie ma metody, aby osiągnąć to samo, ale dzięki za informację.
webnoob

@Marius, czy to zadziała dla 1.9?
Magento Learner

@MagentoLearner. Nie wiem na pewno, ale mam przeczucie, że to działa.
Marius

@Marius, bardzo szybka odpowiedź !!! wielkie dzięki
Magento Learner

@Marius, Załóżmy, że chcę dodać jeden super atrybut. Dodanie do tabeli wiersza z identyfikatorem produktu i identyfikatorem atrybutu catalog_product_super_attributebędzie działać? A może muszę zmodyfikować inne tabele? Jak w stackoverflow.com/a/13381381/1749007
Magento Learner

5

Wymaga to bezpośredniej edycji bazy danych, a pierwszą zasadą Magento jest brak bezpośredniej edycji bazy danych .

Ale jeśli jesteś wystarczająco szalony, aby kontynuować, zostało to omówione na StackOverflow kilka miesięcy temu:

ucts. Przetestowałem poniższy hack obejścia DB na CE 1.6.2 i wydaje się, że działa:

  • Utwórz atrybut
  • Przeciągnij go do odpowiedniego zestawu atrybutów
  • Idź do edytora db lub phpmyadmin, tabela „katalog_kolumna_dokumentu” i spójrz na ostatni, zwróć uwagę na „identyfikator atrybutu”, zwróć również uwagę na identyfikator produktu -> przejdź do katalogu katalog_produktu i wyszukaj szukany konfigurowalny produkt, i zanotuj identyfikator jednostki -> to jest id_produktu
  • Przejdź do katalogu katalog_produkt_super_produktu i wstaw nowy rekord za pomocą id_produktu i id_atrybutu, uwaga id_dodatku_produktu
  • Przejdź do catalog_product_super_attribute_label i wstaw nowy rekord za pomocą id_produktu_produktu i wartości nowego atrybutu, takiego jak „Kolor” lub „Rozmiar”, którego użyłeś podczas dodawania atrybutu do administratora
  • Wróć do administratora i kliknij konfigurowalny produkt, zauważysz, że żaden z Twoich produktów potomnych nie jest powiązany z konfigurowalnym produktem.
  • Kliknij jeden z produktów potomnych i wybierz odpowiednią wartość atrybutu, możesz również zmienić SKU.
  • Wyeksportuj wszystkie produkty potomne i dodaj do niego nowe wartości atrybutów i SKU, zaimportuj je z powrotem i gotowe. Być może będziesz musiał ręcznie zmienić wszystko w adminie bez korzystania z przepływu danych.

Źródło: /programming/5658197/add-new-attribute-to-existing-configurable-product-magento

Nie przetestowane - YMMV.


2

Aby usunąć jeden atrybut super produktu (jak się je nazywa) ze wszystkich konfigurowalnych produktów, możesz wykonać zapytanie SQL w bazie danych:

DELETE FROM catalog_product_super_attribute
WHERE attribute_id = <id>;

Tutaj znajduje się identyfikator atrybutu przechowywany w tabeli eav_attribute dotyczący kodu atrybutu. Tabela catalog_product_super_attribute łączy produkty z atrybutami super produktu. Możesz dodawać i usuwać atrybuty, aby tworzyć konfigurowalne produkty.


1
Aby usunąć tylko atrybut super produktu z konkretnego pojedynczego produktu, możesz rozszerzyć powyższe zapytanie SQL, aby filtrować również według identyfikatora produktu DELETE FROM catalog_product_super_attribute WHERE attribute_id = <attribute_id> AND product_id = <product_id>;
Judder,

0

Jest brudny hack, aby otworzyć konfigurowalny produkt, a następnie wybrać duplikat, wybrać stary i nowy atrybut, duplikat jest wykonywany bez SKU, a następnie usunąć oryginalny konfigurowalny produkt i proste produkty. Następnie możesz podać tę samą SKU do duplikowania. Musisz tylko stworzyć nowe proste produkty.

Jest to szybkie obejście, jeśli nie ma tylu prostych produktów.


Niewłaściwa odpowiedź
Deepak Rai

0

Właśnie udało mi się to zrobić bardziej czysto za pomocą narzędzia do eksportu importu Free Magmi w trybie aktualizacji. (wersja zrozumienia)

Eksportuj pola kluczy, zmień ustawienia kolumny configurable_attributes, aby określić konfigurowalne atrybuty na prostym i konfigurowalnym SKUS, a następnie ponownie zaimportuj za pomocą Magmi

Jako były konsultant Oracle zgadzam się, aby nie zadzierać z bazą danych, szczególnie taką złożoną jak struktura danych Magento - lepiej użyć do tego celu dobrze przetestowanego narzędzia.


0

Musiałem usunąć atrybut, który jest jednym z atrybutów „konfigurowalnych” dla produktu konfigurowalnego.

  • Odniesienia powyżej dotyczące atrybutu katalog_produktu_supera były poprawne. Korzystając z narzędzia bazy danych Navicat, zrobiłem po kolei kilka rzeczy.

    Do testowania zmieniono identyfikator atrybutu, który zmienił go na inne pole używane w innych produktach. (Potwierdził, że był to sporny zapis). Napisano w dół, na wszelki wypadek, pełny zestaw danych rekordu (id_produktu_supera, id_produktu, id_atrybutu, pozycja)

    W końcu usunąłem rekord razem.

To załatwiło sprawę. Zanotowałem też to, co zrobiłem, zakładając, że będę musiał to zrobić ponownie.

Znowu: Usunięcie rekordu w „catalog_product_super_attribute” rozwiązało mój problem, który wydawał się związany z innymi powyżej.

Dodatkowe informacje: aby skorelować „identyfikator_atrybutu” z poprawną nazwaną listą, ważne jest, aby spojrzeć na: katalog_super_nazwa_atrybutów -> i skorelować poprzez identyfikator_supera_atrybutów.
Szukałem powiązanego pola „identyfikator_atrybutu” (jeszcze nie znalazłem).

„product_super_attribute_id” rozwiązuje problem, mówiąc ci, czym tak naprawdę jest „identyfikator_atrybutu”. (Chciałbym nadal znaleźć „domyślny” zestaw danych dla „id_atrybutu”, aby zobaczyć, jak atrybut jest najpierw zdefiniowany w bazie danych).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.