Czasem zachodzi potrzeba osadzenia dodatkowych informacji na karcie produktu jak np. czas przesyłki danego produktu albo inna krótka informacja na potrzeby SEO – inna dla każdego produktu.
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/
Co za tym idzie – musi być ona edytowalna w każdym produkcie z osobna.
Efekt na którym nam zależy:
Potem taka informację możemy np. zaprezentować na karcie produktu w wybranym miejscu w szablonie.
Już poruszaliśmy podobne zagadnienia w tych artykułach: https://pskrk.com/dodanie-dodatkowego-pola-opisu-w-kategorii-presta-shop-1-6/ https://pskrk.com/pozycjonowanie-dodanie-alternatywnego-tytulu-w-kategorii-presta-shop-1-6/
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.
Zawartość artykułu
Modyfikacja plików PHP
W pliku:
/classes/Product.php
W okolicach linii 140 dodaj kod analogiczny do innych zmiennych:
/** @var string Shipping_time */ public $shipping_time;
Podobnie w linii ok 300:
'shipping_time' => array('type' => self::TYPE_STRING, 'validate' => 'isString', 'size' => 32),
Jeśli dodawane pole ma mieć inną długość albo być np. polem tekstowym należy to tutaj uwględnić. Podobnie w zapytaniu SQL na dole artykułu. Tam dodajemy pole o typie varchar(32) jeśli Twoje potrzeby są inne – dodaj np. pole o typie text
Po czym w pliku:
src/PrestaShopBundle/Form/Admin/Product/ProductOptions.php
Nad linią z kodem:
->add('isbn', 'Symfony\Component\Form\Extension\Core\Type\TextType', array(
Wklej:
->add('shipping_time', 'Symfony\Component\Form\Extension\Core\Type\TextType', array( 'required' => false, 'label' => $this->translator->trans('Czas przesyłki', [], 'Admin.Catalog.Feature'), ))
Oczywiście możesz odp. przemianować Czas przesyłki na tytuł jaki potrzebujesz
W pliku:
src/PrestaShopBundle/Model/Product/AdminModelAdapter.php
Pod linią z kodem:
'isbn' => $this->product->isbn,
Wklej:
'shipping_time' => $this->product->shipping_time,
Zmiana w szablonach
1) zmiana w szablonie w adminie sklepu
W pliku:
src/PrestaShopBundle/Resources/views/Admin/Product/form.html.twig
Pod kodem:
<div class="row"> <fieldset class="col-md-4 form-group"> <label class="form-control-label"> {{ form.step6.upc.vars.label }} <span class="help-box" data-toggle="popover" data-content="{{ "This type of product code is widely used in the United States, Canada, the United Kingdom, Australia, New Zealand and in other countries."|trans({}, 'Admin.Catalog.Help') }}" ></span> </label> {{ form_errors(form.step6.upc) }} {{ form_widget(form.step6.upc) }} </fieldset>
Wklej:
<fieldset class="col-md-4 form-group"> <label class="form-control-label"> {{ form.step6.shipping_time.vars.label }} </label> {{ form_errors(form.step6.shipping_time) }} {{ form_widget(form.step6.shipping_time) }} </fieldset>
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 wklej:
{block name='product_shipping_time'} <div itemprop="shipping_time">{$product.shipping_time nofilter}</div> {/block}
Tutaj też trzeba mieć na uwadze potrzebę odświeżenia cache albo wymuszenia kompilacji szablonu w dziale Zaawansowane -> Wydajność
Zmiana w SQL.
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 `shipping_time` VARCHAR(32) NULL DEFAULT NULL AFTER `state`;
Gotowe!
grafika: pexels.com
Super 🙂 A co jeśli produkt ma kombinacje? Wówczas pole to będzie się tyczyło wszystkich kombinacji. Jeszcze lepiej by było, gdyby dało się dla każdej kombinacji z osobna ustawić dane pole.
Pozdrawiam
@Krzysiek, ale to już wyższa szkoła jazdy by była:)
Pewnie tak 🙂 Nie mogę się doczekać v2!
A czy istnieje możliwość żeby na tym samym screenie miejsce Dostosowanie np. Tekst lub dodanie pliku uzależnić od dodatkowego kosztu czyli ustawiamy dostosowanie No. Dedykacja klient wpisuje dedykacje i akceptuje dedykacje a do kosztu produktu dolicza się np. 10zl
I to samo jak dodamy pole dodawania pliku klient dodaje plik a cena rośnie o x zł
@Dariusz niestety nie wiem jak to zrobić bez jakiegoś ekstra przeprogramowania. Np wypełnienie tych pól automatycznie zaznaczało by odp. atrybut przy produkcie.
Inne rozwiązanie to produkt z polami do dostosowania – inna cena.
a co się stanie gdy zrobimy aktualizacje presty do najnowszej wersji?
Wtedy trzeba nanieść jeszcze raz zmiany w kontrolerach PHP. Po akutalizacji zostaną one zastąpione domyślnymi/nowymi plikami PHP.
dzieki za info w klasy i kontrolery mozna nadpisać,
a te te pliki src/PrestaShopBundle/Resources/views/Admin/Product/form.html.twig?
z lokalizacji /src
W wersji 1.7.7.2 nie mam tego pliku
src/PrestaShopBundle/Resources/views/Admin/Product/form.html.twig
gdzie w takim razie wrowadzic dalsze zmiany ?
[…] [STARSZE WERSJE 1.7] Jak w PrestaShop dodać dodatkowe pole tekstowe (na karcie produktu) z możliwo… […]