Artykuł ten jest dedykowany dla nowszych wersji PrestaShop 1.7 (dokładnie dla 1.7.8.2). Wskazówki do modyfikacji kodu pokazane tutaj:
są już nieaktualne w nowszym oprogramowaniu. Też modyfikuje się nieco inne pliki. Jednak idea i sposób działania jest identyczny.
Na przykładzie dodania kodu SKU do produktów w PrestaShop pokażemy jak to zrobić w nowszych wersjach tego oprogramowania.
Zawartość artykułu
Co to jest kod SKU?
Zgodnie z definicją znalezioną w Internecie:
Kod SKU (ang. Stock Keeping Unit) to unikalna sekwencja znaków alfanumerycznych, który firmy stosują do identyfikacji i śledzenia jednostek magazynowych (produktów). Ułatwia to ich lokalizację oraz jest pomocne przy organizacji strategii składowania asortymentu.21 maj 2020
W naszym przypadku najlepiej będzie bazować na ID produktu w bazie danych. Jest ona unikalna i każdy nowy produkt ma nowy numer, więc kody SKU dla różnych produktów – nie będą się pokrywać.
Jak to będzie działać?
Naszym celem jest dodanie zwykłego pola do edycji w produkcie gdzie zdeklarujemy taki kod SKU:

Taki kod następnie zaprezentujemy na karcie produktu + hurtowo zmienimy SKU wszystkich produktów w sklepie na wartość:
sku{ID-PRODUKTU}
Oczywiście taki kod będzie można potem zmodyfikować wg uznania w edytorze każdego produktu.
Przyjęliśmy, że długość kodu SKU to max. 100 znaków. Możesz go maksymalnie zwiększyć do 255 znaków. Zamieniając w przykładach kodu wartość 100 na 255
Ruszamy!
Modyfikacja plików PHP
UWAGA! Modyfikacja ma charakter zmiany wprost w plikach PHP aplikacji. Po wykonaniu np. aktualizacji systemu należy wykonać ponownie te modyfikacje aby ta funkcjonalność nadal działała. Pamiętaj też o wykonaniu kopii bezpieczeństwa bazy danych i zmienianych plików przed rozpoczęciem modyfikacji.
W pliku:
/classes/Product.php
W okolicach linii 140 dodaj kod analogiczny do innych zmiennych:
/** @var string Numer SKU */ public $sku_nr;
Podobnie w okolicacj linii 500 poszukaj zmiennej „$definitions” i tam wklej w jej wnętrzu dodatkowy element. Np. zamieniając:
'weight' => ['type' => self::TYPE_FLOAT, 'validate' => 'isUnsignedFloat'],
Na:
'weight' => ['type' => self::TYPE_FLOAT, 'validate' => 'isUnsignedFloat'], 'sku_nr' => ['type' => self::TYPE_STRING, 'shop' => true, 'validate' => 'isString', 'size' => 100],
Po czym w pliku:
src/PrestaShopBundle/Form/Admin/Product/ProductOptions.php
Pod kodem:
->add('mpn', FormType\TextType::class, [ 'required' => false, 'label' => $this->translator->trans('MPN', [], 'Admin.Catalog.Feature'), 'constraints' => [ new Assert\Length(['max' => 40]), ], 'empty_data' => '', ])
Wklej:
->add('sku_nr', FormType\TextType::class, [ 'required' => false, 'label' => $this->translator->trans('SKU', [], 'Admin.Catalog.Feature'), 'constraints' => [ new Assert\Length(['max' => 100]), ], 'empty_data' => '', ])
W pliku:
src/PrestaShopBundle/Model/Product/AdminModelAdapter.php
Pod linią z kodem:
'isbn' => $product->isbn,
Wklej:
'sku_nr' => $product->sku_nr,
Zmiana w szablonach
1) zmiana w szablonie w adminie sklepu
W pliku:
src/PrestaShopBundle/Resources/views/Admin/Product/ProductPage/Panels/options.html.twig
Zamień kod:
<fieldset class="col-md-4 form-group"> <label class="form-control-label"> {{ optionsForm.mpn.vars.label }} <span class="help-box" data-toggle="popover" data-content="{{ "MPN is used internationally to identify the Manufacturer Part Number."|trans({}, 'Admin.Catalog.Help') }}" ></span> </label> {{ form_errors(optionsForm.mpn) }} {{ form_widget(optionsForm.mpn) }} </fieldset> </div>
Na:
<fieldset class="col-md-4 form-group"> <label class="form-control-label"> {{ optionsForm.mpn.vars.label }} <span class="help-box" data-toggle="popover" data-content="{{ "MPN is used internationally to identify the Manufacturer Part Number."|trans({}, 'Admin.Catalog.Help') }}" ></span> </label> {{ form_errors(optionsForm.mpn) }} {{ form_widget(optionsForm.mpn) }} </fieldset> </div> <div class="row"> <fieldset class="col-md-4 form-group"> <label class="form-control-label"> {{ optionsForm.sku_nr.vars.label }} <span class="help-box" data-toggle="popover" data-content="{{ "Numer SKU."|trans({}, 'Admin.Catalog.Help') }}" ></span> </label> {{ form_errors(optionsForm.sku_nr) }} {{ form_widget(optionsForm.sku_nr) }} </fieldset> </div>
(czyli pod znacznikiem zamykającym < / div> doklej nowy DIV-row z tym nowym polem do edycji)
UWAGA! Aby pole pojawiło się w edycji produktu należy przeczyścić zawartość folderu cache na serwerze: app/cache/ dodatkowo najlepiej odświeżyć pamięć podręczną w dziale Zaawansowane -> Wydajność
2) Osadzenie treści z nowego pola na karcie produktu
W pliku
themes/{SZABLON}/templates/catalog/product.tpl
W miejscu gdzie chcesz aby pojawiła sie ta informacja (masz tutaj dowolność) wklej:
{block name='sku_nr'} <div itemprop="sku_nr">Numer SKU: {$product.sku_nr nofilter}</div> {/block}
Może to być np. nad kodem:
<div class="product-actions">
Tutaj też odśwież cache PrestaShop albo wymuś kompilację szablonu w dziale Zaawansowane -> Wydajność
Dodanie pola w SQL (AKTUALIZACJA)
Finalnie wykonaj to zapytanie w bazie danych (np. przez PhpMyAdmin na Twoim serwerze), doda to dodatkowe pole w bazie danych sklepu:
ALTER TABLE `ps_product` ADD `sku_nr` VARCHAR(100) NULL DEFAULT NULL; ALTER TABLE `ps_product_shop` ADD `sku_nr` VARCHAR(100) NULL DEFAULT NULL;
Hurtowe nadanie kodów SKU wszystkim produktom.
Aby to zrobić wywołaj to zapytanie:
UPDATE `ps_product` SET `sku_nr`= CONCAT("sku",`id_product`); UPDATE `ps_product_shop` SET `sku_nr`= CONCAT("sku",`id_product`);
Wtedy finalnie kod SKU będzie miał np. postać:
sku456 (dla produktu o ID 456)
Jeśli chcesz to przedzielić np. myślnikiem wywołaj:
UPDATE `ps_product` SET `sku_nr`= CONCAT("sku-",`id_product`); UPDATE `ps_product_shop` SET `sku_nr`= CONCAT("sku-",`id_product`);
itd.
Gotowe!
grafika: pexels.com
[…] UWAGA! Jest to artykuł dotyczący starszych wersji PrestaShop 1.7. W wersjach 1.7.8 (i nowszych) ten patent niestety nie zadziała. Tu masz poradnik jak wykonać to w nowszych wersjach: https://pskrk.com/jak-w-prestashop-1-7-dodac-edytowalne-pole-tekstowe-prestashop-dodanie-numeru-sku/ […]
Witam,
mam problem z wyświetlniem value w polu nowym polu. Dane zapisują się do bazy prawdiłowo.
Presta 1.7.6.8
Witam, mam problem z wyświetlniem value w dodanym polu.
Jak wyświetlić wartość, która została dodana już do bazy w polu?
Czyli pole jest w edycji produktu i można wpisać do niego nazwę i ona zapisuje się w bazie ale masz problem @Bartosz z wyświetleniem jej na stronie prodktu?
A zmieniałeś szablon produktu wg instrukcji z artykułu?
themes/{SZABLON}/templates/catalog/product.tpl
Może w value podajesz jakieś znaki specjalne ?
Nowe pole pojawia się w eycji produktu, można do niego wpisać wartość oraz zapisać ( zapisuje się w bazie).
Problem polega na tym, że po odświeżeniu strony, nowe pole nie pokazuje zapisanej wartości z bazy – w inpucie brak atrybutu value=”wartosc zaciągnieta z bazy”.
Chodzi mi o analogiczne działanie do innych pól.
np. po wpisaniu w pole EAN symbolu, zapisaniu oraz odświeżeniu strony widzimy kod ean zaciągnięty z bazy do tego produktu – value=”ean z bazy”
themes/{SZABLON}/templates/catalog/product.tpl – na razię nie wyświetlałem wartości na froncie, ponieważ ma być to wartość niewidoczna dla klienta 🙂
Hmm a zmieniłeś wszystkie pliki PHP wskazane w artykule i odświeżyłes cache? A pliki szablonu admina może zła zmienna wyświetlają? Modyfikacje robiliśmy praktycznie w tej samej wersji co Ty i powinno to działać
Sprawdzałem pliki po kilka razy i dopiero teraz dostrzegłem bląd w pliku AdminModelAdapter.php
Zamiast tak jak u Ciebie
'sku_nr’ => $product->sku_nr,
miałem
'sku_nr’ =>$this->product->sku_nr,
Dzięki za odpowiedź i Wesołych Świąt!
To świetnie 😉 wzajemnie Wesołych!;)
Na 1.7.7.3 ta instrukcja też działa prawidłowo.
Przetestowane przed paroma chwilami.
Dobra robota autorze, dzięki wielkie.
Witam, u mnie po tej operacji zniknęło pole Stan: Nowe/ Używane. Prestashop 1.7.8.5
Mam obawę, ponieważ options.html.twig edytowałem w notatniku czy może być tego wina?
Proszę o pomoc