Tworzenie modułu Prestashop cz. 2 – własne tabele, rozbudowany moduł CRUD, własny widok w panelu
W tej części poradnika wykorzystamy pliki, które przygotowaliśmy w części pierwszej.
W pierwszej kolejności wprowadzimy modyfikacje w pliku myfirstmodule.php
w funkcji install()
wprowadźmy tam następującą treść:
if (!parent::install() || !$this->registerHook('displayHome') || !$this->installDB() ) { return false; } return true;
Dodaliśmy do instrukcji warunkowej if
kod: || !$this->installDB()
jest to funkcja, którą zaraz utworzymy, odpowiedzialna za utworzenie naszej tabeli w bazie danych.
Stwórzmy teraz funkcje installDB()
, która będzie zawierać po prostu zwrócone zapytanie SQL:
public function installDB(){ $correct = true; $correct = Db::getInstance()->execute(' CREATE TABLE IF NOT EXISTS `' . _DB_PREFIX_ . 'myfirstmodule` ( `id_myfirstmodule` INT UNSIGNED NOT NULL AUTO_INCREMENT , `id_shop` INT NOT NULL , `blank` INT NOT NULL , PRIMARY KEY (`id_myfirstmodule`) ) ENGINE = ' . _MYSQL_ENGINE_ . '; '); $correct = Db::getInstance()->execute(' CREATE TABLE IF NOT EXISTS `' . _DB_PREFIX_ . 'myfirstmodule_lang` ( `id_myfirstmodule_lang` INT UNSIGNED NOT NULL AUTO_INCREMENT , `id_myfirstmodule` INT NOT NULL , `id_lang` INT NOT NULL , `name` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL , `url` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL , PRIMARY KEY (`id_myfirstmodule_lang`) ) ENGINE = ' . _MYSQL_ENGINE_ . '; '); return $correct; }
Funkcja ta
utworzy nam tabelę ps_myfirstmodule
, do której będziemy zapisywać
ustawienia, oraz tabelę ps_myfirstmodule_lang
, do której będziemy
zapisywać treści pól, dla odpowiednich języków.
Zmieńmy
teraz strukturę naszych folderów, przy bardziej rozbudowanych modułach należy
to trochę uporządkować, utwórzmy więc folder views
a w nim dwa pod
foldery: front
i admin
Przenieśmy
do views/front
nasz plik myfirstmodule.tpl
Zmieńmy teraz w funkcji hookDisplayHome()
wartość return na:
return $this->display(__FILE__, 'views/front/myfirstmodule.tpl');
W folderze views/admin
utwórzmy plik o nazwie list.tpl
Następnie w pliku myfirstmodule.php
w funkcji getContent()
zmodyfikujmy zawartość linijki z return
na:
$this->context->smarty->assign(array( 'link' => $this->context->link, 'elements' => [] )); return $output.$this->displayForm().$this->display(__FILE__, 'views/admin/list.tpl');
Dodaliśmy do
zwracanego widoku zmienną link, która pozwoli generować odnośniki do panelu
administracyjnego, dodaliśmy również zmienną elements
która na ten
moment pozostaje pusta. Do zwracanego widoku dołączamy również plik szablonu list.tpl
W tym pliku będziemy wyświetlać listę elementów naszego modułu, przygotujmy więc ten widok:
Widok ten
będzie wyświetlał prosty panel z listą dodanych elementów. Możemy zauważyć, że
używana jest zmienna $link
do generowania odnośnika dla panelu
administracyjnego.
Wyświetlane będą wartości dla każdego języka.
Strona naszego modułu powinna wyglądać tak jak powyżej, przejdźmy teraz do dalszych modyfikacji pliku myfirstmodule.php
W funkcji displayForm()
dodaliśmy parametr $mode za pomocą, którego będziemy rozróżniać dla
jakiej strony chcemy zwrócić formularz.
Następnie tablicę, która przechowuje umieszczamy wewnątrz instrukcji warunkowej. A wewnątrz kolejnego warunku umieszczamy pola formularza dla dodawania i edycji naszego elementu.
Przy formularzu
dodawania/edycji można zauważyć nowy indeks buttons
, w którym dodajemy
przycisk pozwalający powrócić do listy w module.
Przygotowany od razu został wariant dla formularza edycji ($mode == 2
). Dodajemy tam dodatkowe pole id_myfirstmodule
, gdzie będziemy przechowywać informację o tym jaki element aktualnie edytujemy.
Również funkcję dotyczącą wartości pól formularza i nazwy metody zapisu umieszczamy wewnątrz instrukcji warunkowej.
Dodajemy również ustawienia przycisków dla dodawania nowego elementu.
Nad instrukcją warunkową możemy jeszcze zobaczyć linijkę ustawiającą domyślny język dla formularzy, dzięki czemu wielojęzyczne pola będą wyświetlać się poprawnie.
Wewnątrz funkcji getContent()
dopiszmy do instrukcji warunkowej następującą treść:
Teraz będzie poprawnie wyświetlać się formularz dodawania elementu do modułu.
Poniżej dodajmy kolejną instrukcję dotyczącą zapisu zmian.
Tłumacząc, ta
instrukcja uruchomi się w momencie, kiedy zapisujemy element. Na początku
dodajemy element do tabeli ps_myfirstmodule
, pobieramy ID dodanego
elementu, a następie pola na podstawie dostępnych języków do tabeli ps_myfirstmodule_lang
Po wszystkim wyświetlamy informację, że dodano element.
Elementy będą dodawać się do bazy danych, ale niestety nie będą wyświetlać się jeszcze na naszej liście.
Na samym dole funkcji getContent()
zmieniamy indeks dla tablicy w funkcji assign
na:
Następnie tworzymy funkcję getElements()
, w której będziemy pobierać elementy.
Funkcja przygotowuje tabele do wyświetlania elementów na liście, z rozdzieleniem wartości na języki.
Pobieramy tutaj najpierw podstawowe ustawienia a następie wartości dla każdego języka dostępnego w sklepie.
Lista powinna wyświetlać się w podobny sposób po dodaniu elementów do modułu.
Przygotujmy teraz formularz dla edycji elementu.
Wewnątrz funkcji displayForm()
, na samym dole dodajmy wariant dla instrukcji warunkowej.
Zmienia się tutaj nazwa akcji zapisanie, oraz pola formularza pobierane są z funkcji getValues()
, którą teraz przygotujemy.
Wartość ID elementu pobieramy z adresu a następie pobieramy element z bazy danych oraz tekst dla każdego wariantu językowego elementu.
Tablica dla pól wielojęzycznych musi być ułożona w następujący sposób:
W przypadku,
gdy pole nie jest wielojęzyczne piszemy po prostu ‘nazwa_pola’ => ‘wartosc’
Następnie w funkcji getContent()
dopisujemy wariant zwracania pola formularza do edycji:
Jeśli wszystko jest w porządku, formularz będzie wyświetlał się tak jak powyżej.
Pozostaje nam przygotować funkcję aktualizującą element w bazie danych. Dodajemy ją naszych instrukcji warunkowych w funkcji getContent()
, lecz należy dodać ten warunek pod pierwszym z warunków, a nie na samym dole.
Funkcja aktualizuje kolumnę blank w głównej tabeli na podstawie ID
Następnie
aktualizuje pola name
i url
dla tabeli myfirstmodule_lang
na podstawie języków dostępnych w sklepie. Używana jest funkcja pSQL
na wartościach,
ponieważ jest to funkcja zabezpieczająca przed wstrzykiwaniem SQL.
Jeśli wszystko w porządku zapisane wartości powinny się aktualizować a my zostaniemy przeniesieni na główną stronę modułu.
Pozostało nam przygotować funkcję usuwającą elementy z bazy danych.
W tym celu dodajemy następującą treść do funkcji getContent()
Pobieramy ID elementu z adresu, a następie usuwane są wartości z dwóch tabel naszego modułu.
Dodajmy kilka wartości do modułu i poprawmy na koniec szablon wyświetlania modułu na sklepie.
Zmieńmy na początek zawartość funkcji hookDisplayHome()
Funkcja ta
teraz pobiera z bazy danych nasze elementy do zmiennej elements
a
następie zwraca do szablonu.
Edytujmy więc plik views/front/myfirstmodule.tpl
na następującą treść:
Wyświetlimy nasze elementy na liście w powyższy sposób. Dostęp do każdego parametru mamy poprzez kropkę