Zawartość artykułu
Do czego służy tabela ps_stock_available?
W poprzednim artykule:
Migracja danych ze sklepu PrestaShop 1.4 do PrestaShop 1.7. Czy to możliwe? TAK!
Była mowa o specyficznej tabeli ps_stock_available (jest też o niej mowa w tym artykule: https://pskrk.com/przeniesienie-kombinacji-produktow-ze-sklepu-w-wersji-1-4-do-najnowszej-1-6-1-2/). Odpowiada ona za określenie ilości danego produktu. Szczególnie jeśli bazuje on na atrybutach produktów.
O ile w przypadku normalnego wypełnania sklepu danymi – tabela ta budowana jest w sposób naturalny i spójny. To w przypadku importu danych z innego sklepu albo aktualizacji z historcznych wersji PrestaShop – wypełnienie jej nie jest sprawą łatwą.
Przykład.
Weżmy pod uwagę taki produkt z 4 kombinacjami. Każda z nich ma po 100 ilości:
W bazie danych wygląda to nieco inaczej:
Istotnie są 4 wiersze z ilościami po 100. Każdy z nich ma inną wartość id_product_attribute jednak dla id_product_attribute = 0 (tutaj podświetlony na żółto) znajduje się tam suma reszty wierszy.
Tylko dzięki temu ilości produktów będą prawidłowo prezentowane w adminie i baza będzie spójna.
Co ciekawe jeśli zapiszemy produkt bez tego „sumującego” wiersza – to zostanie on magicznie dodany w bazie danych.
Natomiast jeśli chcemy ujednolicić zawartość tej tabeli aby było tam „po bożemu” – zapytanie SQL nie wystarczy. Posłużymy się tutaj odpowiednim skryptem PHP.
Przygotowania
1) Ustaw jak największą wartość parametru
max_execution_time
2) Zrób kopię bezpieczeństwa bazy:
Zaawansowane -> Baza danych -> Kopia zapasowa DB
Plik PHP.
W tym celu utwórz tymczasowy plik. Np.
/modules/gsitemap/test.php
Lokalizacja jest czysto przypadkowa. Możesz wybrać inny moduł 🙂
O zawartości:
include(dirname(__FILE__) . '/../../config/config.inc.php'); include(dirname(__FILE__) . '/../../init.php'); $ilosc_jednej_kombinacji = 100; $sql_init = "TRUNCATE " . _DB_PREFIX_ . "stock_available; INSERT INTO `" . _DB_PREFIX_ . "stock_available` ( `id_product`, `id_product_attribute` ) SELECT `id_product` , `id_product_attribute` FROM " . _DB_PREFIX_ . "product_attribute; UPDATE `" . _DB_PREFIX_ . "stock_available` SET `id_shop` = 1, `quantity` = $ilosc_jednej_kombinacji"; Db::getInstance()->execute($sql_init); $shops = Db::getInstance()->ExecuteS("SELECT id_product FROM `" . _DB_PREFIX_ . "product`"); foreach ($shops as $value) { $product = $value['id_product']; $sql = "INSERT INTO `" . _DB_PREFIX_ . "stock_available` (`id_product`, `id_product_attribute`) VALUES ($product,0)"; Db::getInstance()->execute($sql); $sum = Db::getInstance()->ExecuteS("SELECT sum(quantity) as suma FROM " . _DB_PREFIX_ . "stock_available WHERE `id_product_attribute` != 0 AND id_product = ".$product); $suma = $sum[0]['suma']; $sql = "UPDATE `" . _DB_PREFIX_ . "stock_available` SET `quantity` = '$suma' WHERE `" . _DB_PREFIX_ . "stock_available`.`id_product` = $product AND `id_product_attribute` = 0;"; Db::getInstance()->execute($sql); echo "aktualizacja produktu $product<br>"; }
Jak widać w w/w skrypcie domyślna ilość dla każdej kombinacji to 100. Jak chcesz ustawić inną – odpowiednio zmodyfukuj skrypt.
Następnie go uruchom i uzbroj się w cierpliwość 🙂
http://[domena-sklepu]/modules/gsitemap/test.php
Uwaga, jeśli jest on blokowany przez plik .htaccess w folderze:
/modules
Tymczasowo zmień nazwę pliku:
/modules/.htaccess
na inną np.
/modules/.htaccess_tmp
Następnie spróbuj ponownie.
Uwaga! po skończonej przebudowie tabeli usuń plik PHP i przywróć starą nazwę pliku blokującego.