Czyli wykonanie po prostu importu. Można oczywiście zrobić plik CSV na podstawie dokumentacji. Jednak może być to karkołomne zadanie, jeśli ktoś widział jak wygląda taki plik (pobierz spakowany plik przykładowy CSV: combinations_import.csv)… Dodatkowo ze świeczką szukać modułu (nawet płatnego) do Presta Shop 1.4 który automatycznie wygeneruje taki arkusz.

Nasz sposób będzie wykonywany na poziomie bazy danych MySQL. Zupełnie poza zapleczem sklepu (no chyba żeby na końcu sprawdzić czy działa). Więc posiadanie dostępu do narzędzia PhpMyAdmin będzie bardzo wskazane. Dla obu baz – starej i nowej.

Idea jest taka, że tak przebudowujemy zawartość starej bazy z wersji sklepu 1.4 aby tabele uzyskały wygląd identyczny jak w 1.6.1.2 do której następnie je po prostu zaimportujemy.

Metoda powinna działać także dla przyszłych wersji Presta Shop (na pewno w milestone 1.6) o ile twórcy tego oprogramowania nie zmienią zupełnie idei atrybutów na tej platformie.

Założenia

  1. Produkty w nowym (1.6.1.2) sklepie już zostały zaimportowane ze starego sklepu (1.4) przy pomocy np. tego darmowego narzędzia: pobierz darmowy moduł csvexport dla Presta Shop 1.4. Nie mają one na razie żadnych atrybutów a obecne w sklepie grupy atrybutów i ich wartości są domyślne i możemy je w całości usunąć.
  2. Produkty podczas importu mają narzucone poprzednie numery ID – poprzez zaznaczenie tych opcji  Tego nie przeskoczymy. No chyba, że wykonamy jakieś mapowanie tych ID-ków. Jednak może być to dość trudne w wykonaniu i wymagało by przebudowania naszej metody.
  3. Ponadto na nowym sklepie wszystkie zastane kombinacje zostaną (tak jak wspomniano wyżej) usunięte. Czyli zaleca się stosować tą metodę dla nowych sklepów gdzie jeszcze nie ma atrybutów lub te które są mogą być w całości usunięte.
  4. Potrzebujemy 2 osobne bazy danych. “starą” i “nową“. Czyli odpowiednio w wersji 1.4 i 1.6.1.2. Będziemy używać tej konwencji w dalszej części artykułu.
  5. Wszędzie w zapytaniach używamy domyślnego prefixu w nazwach tabel “ps_“. Jeśli Twoje tabele mają inny musisz to uwzględnić inaczej (co logiczne) zapytania SQL nic Ci nie dadzą.
  6. Jeśli chodzi o Multi Store na sklepie w wersji 1.6.1.2 uwzględniamy tylko 1 sklep i ma on ID = 1. Jeśli import ma być wykonany dla innego sklepu – może wiązać się to z dodatkowymi pracami programistycznymi – prosimy wtedy o kontakt.
  7. Jeśli chodzi o języki w sklepach:
    1. Stary sklep ma 6 języków. Gdzie język angielski ma identyfikator o ID=1 a polski ID=6. Inne nas nie interesują i nie będą one brane pod uwagę. Zostaną wręcz usunięte.
    2. Nowy sklep ma 2 języki: polski ID=1, angielski ID=2

 

Tyle założeń, pasuje jeszcze to napisać:

Przed przystąpieniem do prac wykonaj koniecznie kopię bezpieczeństwa obu baz danych. To nic nie kosztuje a prędzej czy później mogą Ci się przydać…

Do dzieła!

Wprowadzenie różnic w strukturze tabel

Nowa wersja Presta Shop posiada w zasadzie te same tabele na których nam zależy, jednak różnią się one ilością kolumn i ich typami. Należy je ujednolicić. Wykonujemy to w starej bazie danych:

Tabela ps_attribute:


ALTER TABLE `ps_attribute` ADD `position` INT( 10 ) NOT NULL ;

Tutaj mały komentarz:

Jak widzimy – doszło tutaj nowe pole “position“. Domyślnie wszystkie wartości w tej tabeli będą ustawione na: 0. Prawdopodobnie Presta Shop odpowiednio je wypełni lub nie będzie to wpływało na pracę systemu. Jednak gdy się tak nie stanie należy w sposób ręczny lub przy pomocy pomocniczego pliku CSV wypełnić te pola aby narastały w porządku wartości kolumny id_attribute_groupzobacz obrazek

Tabela ps_attribute_group:


ALTER TABLE `ps_attribute_group` ADD `group_type` ENUM( 'select', 'radio', 'color', '' ) NOT NULL ,
ADD `position` INT( 10 ) NOT NULL ;

 

Z kolei to pole “position” powinno narastać od 0 do wartości takiej jak ilość wierszy w tej tabeli. Należy albo wypełnić tą kolumnę ręcznie albo liczyć na to, że Presta Shop to skoryguje (jest szansa że tak się stanie, niestety tego nie sprawdzaliśmy).

Tabela ps_attribute_impact:


ALTER TABLE `ps_attribute_impact` CHANGE `weight` `weight` DECIMAL( 20, 6 ) NOT NULL ;

Tabela ps_product_attribute:

(radzimy każde zapytanie – są one oddzielone średnikami – realizować osobno)


ALTER TABLE `ps_product_attribute` CHANGE `weight` `weight` DECIMAL( 20, 6 ) NOT NULL DEFAULT '0';
ALTER TABLE `ps_product_attribute` CHANGE `unit_price_impact` `unit_price_impact` DECIMAL( 20, 6 ) NOT NULL DEFAULT '0.00',
CHANGE `default_on` `default_on` TINYINT( 1 ) UNSIGNED NULL DEFAULT NULL ;
ALTER TABLE `ps_product_attribute` ADD `available_date` DATE NOT NULL ;

Dodanie nowych tabel

Wersja 1.4 nie obsługiwała funkcji Multi Store. W związku z tym pojawiają się nowe tabele, które musimy dodać. Tworzymy je z tej przyczyny, że w dalszych pracach będziemy do nich kopiować wymagane dane. Operujemy w dalszym ciągu na starej bazie danych:

Tabela ps_attribute_group_shop:


CREATE TABLE IF NOT EXISTS `ps_attribute_group_shop` (
`id_attribute_group` int(11) unsigned NOT NULL,
`id_shop` int(11) unsigned NOT NULL,
PRIMARY KEY (`id_attribute_group`,`id_shop`),
KEY `id_shop` (`id_shop`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Tabela ps_attribute_shop:


CREATE TABLE IF NOT EXISTS `ps_attribute_shop` (
`id_attribute` int(11) unsigned NOT NULL,
`id_shop` int(11) unsigned NOT NULL,
PRIMARY KEY (`id_attribute`,`id_shop`),
KEY `id_shop` (`id_shop`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Tabela ps_product_attribute_shop:


CREATE TABLE IF NOT EXISTS `ps_product_attribute_shop` (
`id_product` int(10) unsigned NOT NULL,
`id_product_attribute` int(10) unsigned NOT NULL,
`id_shop` int(10) unsigned NOT NULL,
`wholesale_price` decimal(20,6) NOT NULL DEFAULT '0.000000',
`price` decimal(20,6) NOT NULL DEFAULT '0.000000',
`ecotax` decimal(17,6) NOT NULL DEFAULT '0.000000',
`weight` decimal(20,6) NOT NULL DEFAULT '0.000000',
`unit_price_impact` decimal(20,6) NOT NULL DEFAULT '0.000000',
`default_on` tinyint(1) unsigned DEFAULT NULL,
`minimal_quantity` int(10) unsigned NOT NULL DEFAULT '1',
`available_date` date NOT NULL DEFAULT '0000-00-00',
PRIMARY KEY (`id_product_attribute`,`id_shop`),
UNIQUE KEY `id_product` (`id_product`,`id_shop`,`default_on`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Zapełnie treścią dodatkowych tabel

Nowe tabele w starej bazie danych musimy zapełnić treścią wg. wymagań dokumentacji Presta Shop 1.6. Dla pewności że “autoincremetnowane” pola (których wartości liczbowe są tworzone automatycznie poprzez zwiększanie wartości o +1) będą mieć takie wartości na jakich nam zależy przed wypełnieniem – czyścimy tabele poleceniem truncate:

Wypełnienie tabeli ps_attribute_group_shop:


TRUNCATE ps_attribute_group_shop;
INSERT INTO `ps_attribute_group_shop`(`id_attribute_group`) SELECT id_attribute_group FROM ps_attribute_group;
UPDATE `ps_attribute_group_shop` SET `id_shop` = 1;

Wypełnienie ps_attribute_shop:


TRUNCATE ps_attribute_shop;
INSERT INTO `ps_attribute_shop`(`id_attribute`) SELECT id_attribute FROM ps_attribute;
UPDATE `ps_attribute_shop` SET `id_shop` = 1;

Wypełnienie ps_product_attribute_shop:

(radzimy każde zapytanie – są one oddzielone średnikami – realizować osobno)


TRUNCATE ps_product_attribute_shop.

ALTER TABLE ps_product_attribute_shop DROP INDEX id_product;

INSERT INTO `ps_product_attribute_shop`(`id_product`,`id_product_attribute`,`wholesale_price`,`price`,`ecotax`,`weight`,`unit_price_impact`,`default_on`,`minimal_quantity`,`available_date`) SELECT `id_product`,`id_product_attribute`,`wholesale_price`,`price`,`ecotax`,`weight`,`unit_price_impact`,`default_on`,`minimal_quantity`,`available_date` FROM ps_product_attribute;

UPDATE `ps_product_attribute_shop` SET `id_shop` = 1;

UPDATE `ps_product_attribute_shop` SET `default_on` = NULL WHERE `default_on` = 0;

ALTER TABLE `ps_product_attribute_shop` ADD UNIQUE `id_product` (`id_product`, `id_shop`, `default_on`);

Usunięcie niepotrzebnych wpisów językowych

W wersji 1.4 język polski miał ID = 6. Natomiast angielski ID = 1. Należy ustawić tak wpisy w tabelach odpowiedzialnych za atrybutu (w starej bazie) aby odpowiednio ustawić te indeksy.

Tabela ps_attribute_group_lang:


DELETE FROM `ps_attribute_group_lang` WHERE `id_lang` IN (2,3,4,5);
UPDATE `ps_attribute_group_lang` SET `id_lang` = 2 WHERE `id_lang`= 1;
UPDATE `ps_attribute_group_lang` SET `id_lang` = 1 WHERE `id_lang`= 6;

Tabela ps_attribute_lang:


DELETE FROM `ps_attribute_lang` WHERE `id_lang` IN (2,3,4,5);
UPDATE `ps_attribute_lang` SET `id_lang` = 2 WHERE `id_lang`= 1;
UPDATE `ps_attribute_lang` SET `id_lang` = 1 WHERE `id_lang`= 6;

Export i import

Gotowe! Teraz należy wyexportować (w PhpMyAdmin należy kliknąć zakładkę Export i na liście tabel w opcji rozszerzonej zaznaczyć wybrane z wciśniętym klawiszem CTRL) ze starej bazy tabele wraz z zawartością:


ps_attribute;
ps_attribute_group;
ps_attribute_group_lang;
ps_attribute_impact;
ps_attribute_lang;
ps_product_attribute:
ps_product_attribute_combination;
ps_product_attribute_image;

Czyli tak naprawdę należy wyeksportować wszystkie tabele z ‘attribute‘ w nazwie. Następnie taki zrzut tabel musimy zaimportować do nowej bazy danych nadpisując tamte lub uprzednio usuwając.

Akutalizacja ilości

Na nowej bazie danych wywołujemy to zapytanie:

(radzimy każde zapytanie – są one oddzielone średnikami – realizować osobno)


DELETE FROM `ps_stock_available` WHERE `id_product_attribute` != 0;
INSERT INTO `ps_stock_available`( `id_product`, `id_product_attribute`) SELECT `id_product` , `id_product_attribute` FROM ps_product_attribute;
UPDATE `ps_stock_available` SET `id_shop` = 1, `quantity` = 100 WHERE `id_product_attribute` > 0 ;

Ustawi ono domyślnie 100 sztuk dla każdej z zaimportowanej kombinacji. W innym wypadku na nowym sklepie nie będzie można dodać żadnej kombinacji do koszyka.

Asekuracyjnie na sklepie należy jeszcze wyczyścić cache i przebudować indeks produktów.

I to by było na tyle!

Share This:

Zostaw komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *