Press "Enter" to skip to content

Jak w PrestaShop 1.7 dodać edytowalne pole tekstowe? PrestaShop – dodanie numeru SKU (AKTUALIZACJA)

Admin 10

Artykuł ten jest dedykowany dla nowszych wersji PrestaShop 1.7 (dokładnie dla 1.7.8.2). Wskazówki do modyfikacji kodu pokazane tutaj:

[STARSZE WERSJE 1.7] Jak w PrestaShop dodać dodatkowe pole tekstowe (na karcie produktu) z możliwością jego edycji?

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.

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:

Nowe pole do edycji produktu – możliwość zdeklarowania kodu 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

  1. Bartosz Bartosz

    Witam,
    mam problem z wyświetlniem value w polu nowym polu. Dane zapisują się do bazy prawdiłowo.
    Presta 1.7.6.8

  2. Bartosz Bartosz

    Witam, mam problem z wyświetlniem value w dodanym polu.
    Jak wyświetlić wartość, która została dodana już do bazy w polu?

    • Admin Admin

      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 ?

      • Bartosz Bartosz

        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 🙂

        • Admin Admin

          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ć

          • Bartosz Bartosz

            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!

          • Admin Admin

            To świetnie 😉 wzajemnie Wesołych!;)

  3. marcin marcin

    Na 1.7.7.3 ta instrukcja też działa prawidłowo.
    Przetestowane przed paroma chwilami.

    Dobra robota autorze, dzięki wielkie.

  4. Przemek Przemek

    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

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 !
Chcesz mieć czystą, pudełkową wersję PrestaShop 1.7 z danymi ze…