Tworzenie modułu Prestashop cz. 2 – własne tabele, rozbudowany moduł CRUD, własny widok w panelu
Poradniki

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ę

Nasza Strona internetowa wykorzystuje pliki cookies oraz podobne technologie w celi świadczenia Państwu usług z zachowaniem najwyższych standardów, w tym w sposób dostosowany do indywidualnych potrzeb. Korzystanie ze Strony bez zmiany ustawień dotyczących cookies. Więcej szczegółów w naszej „Polityce Prywatności”
Więcej Akceptuję