Press "Enter" to skip to content

Skrypt PHP to akutalizacji i przebudowy tabeli ps_stock_available [PrestaShop 1.7] [PrestaShop 1.6]

Admin 0

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:

Widok kombinacji produktów danego produktu

W bazie danych wygląda to nieco inaczej:

Widok tabeli ps_stock_available dla danego produktu z wierszem sumującym

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.

 

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

Zobacz także !
Interesuje Cię przesiadka z muzealnego PS14 do najnowszej wersji PS17…