Tworzenie modułu Prestashop 1.3.1
by intro on cze.02, 2011, under Moduły Prestashop
Mój pierwszy wpis postanowiłem poświecić dla jednej z bardziej podstawowych czynności wykonywanych podczas personalizacji sklepu. Dziś zajmiemy się tworzeniem nowego modułu dla sklepu Prestashop v 1.3.1. W nastepnych artykułach postaram się pamietać także o wersji 1.4 – bo różniece są spore.
Tworzenie modułu – Część pierwsza BACKEND
Jak wiemy szystkie moduły sklepu znajdują się w katalogu /modules. Dlatego też pierwszą czynnością jaką powinniśmy wykonać jest utworzenie katalogu modułu o nazwie „blocnewproducts” – tak nazwiemy nasz nowy moduł. Następnie w katalogu /modules/blocknewproducts tworzymy plik klasy nowego modułu o nazwie „blocknewproducts.php”. Następnie tworzymy szkielet klasy:
1 2 3 4 5 6 | <?php class BlockNewProducts extends Module { private $_html = ''; //Kontener kodu HTML modułu private $_postErrors = array(); //Kontener błędów przesyłanych żądań POST } ?> |
Zwróć uwagę na nazewnictwo klasy, używana notacja „Camel Case”.
Tworzymy konstruktor:
1 2 3 4 5 6 7 8 9 10 | public function __construct() { $this->name = 'blocknewproducts'; $this->tab = 'Blocks'; $this->version = 0.9; parent::__construct(); $this->displayName = $this->l('New products block'); $this->description = $this->l('Displays a block featuring newly added products'); } |
Konstruktor dodatkowo ustawia podstawowe informacje dotyczące nowego modułu:
- name – Nazwa modułu
- tab – Nazwa zakładki/kategorii do której modułĸ należy
- version – Informacja o wersji modułu
- displayName – Wyświetlana (np. na liście modułów) nazwa modułu
- description – Opis modułu (wyświetlany na liście modułów)
Oczywiście wywoływany jest również konstruktor klasy bazowej parent::__construct();.
Kolejną metodą, którą należy zdefiniować jest metoda install.
To dzięki niej dokonuje się „instalacja” modułu po kliknięciu na liście modułów odnośnika „instaluj”.
1 2 3 4 5 | public function install() { return (parent::install() AND $this->registerHook('leftColumn') AND Configuration::updateValue('NEW_PRODUCTS_NBR', 5)) } |
Metoda parent::install() pochodząca z klasy bazowej Module sprawdza poprawność nazwy modułu oraz jego istnienie, jeżeli nazwa jest poprawna a sam moduł nie istnieje (nie istnieje rekord w tabeli ps_module), zostaje on zainstalowany.
Metoda $this->registerHook(‘rightColumn’) służy do „zarejestrowania” tzw. Hook’a (Hook – informacje). Łopatologicznie rzecz biorąc jest to rodzaj powiązania modułu z miejscem na stronie, w którym ma się wyświetlić nasz boks z nowymi produktami.
Metoda Configuration::updateValue($key, $value) ustawia (tworzy nowy rekord lub go aktualizuje jeśli ten istnieje) wartość podanej zmiennej konfiguracyjnej w tabeli ps_configuration. Zmienna NEW_PRODUCTS_NBR definiuje w naszym przypadku liczbę nowych produktów które będą wyświetlane w boksie modułu na stronie sklepu.
Następny krok to zdefiniowanie metody umożliwiającej zarządzanie modułem z Panelu administracyjnego.
Tworzymy zatem metodę getContent która służy do wyświetlenia oraz obsługi formularza konfiguracyjnego modułu.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public function getContent() { //wyświetlamy nazwę modułu $this->_html = '<h2>' . $this->displayName . '</h2>'; //Jeżeli wysłano dane POST to przetwarzamy formularz if (Tools::isSubmit('submitBlockNewProducts')) { //Walidacja formularza $this->validateForm(); //Jeżeli brak błędów to przetwarzamy formularz if (!sizeof($this->_postErrors)) $this->processForm(); else //W przeciwnym wypadku wyświetlamy błędy $this->displayErrors(); } //Wyświetlamy formularz konfiguracyjny $this->displayForm(); return $this->_html; } |
Następnie definiujemy metody pomocnicze:
Metoda $this->validateForm() – każdy moduł, który posiada opcję konfiguracyjną w postaci formularza, powinien po jego przesłaniu sprawdzać dostarczone mu dane pod kątem ich obecności w przypadku pól wymaganych oraz ich prawidłowej formie w przypadku zastosowania specyficznych restrykcji (np. wartość przekazana w polu dla liczby postów powinna być liczbą dodatnią).
1 2 3 4 5 6 7 8 9 | //Metoda waliduje formularz private function validateForm(){ //Zabezpieczamy pole przed podaniem pustej wartości if (!$productNbr = Tools::getValue('productNbr') OR empty($productNbr)) $this->_postErrors[] = $this->l('You should fill the "products displayed" field'); //Zabezpieczamy pole przed podaniem nieprawidłowej wartości elseif (!Validate::isInt($productNbr) OR intval($productNbr) == 0) $this->_postErrors[] = $this->l('Invalid number.'); } |
Metoda $this->processForm() – metoda odbiera przesłane za pomocą formularza dane, przetwarza je i/lub zapisuje w bazie danych.
1 2 3 4 5 6 7 | //Metoda przetwarza formularz konfiguracyjny przesyłany metodą POST private function processForm(){ //Jeżeli dane wejściowe są poprawne aktualizujemy wartość zmiennej konfiguracyjnej $productNbr = Tools::getValue('productNbr'); Configuration::updateValue('NEW_PRODUCTS_NBR', intval($productNbr)); return '<div class="conf confirm"><img src="../img/admin/ok.gif" alt="' . $this->l('Confirmation') . '" />' . $this->l('Settings updated') . '</div>'; } |
Metoda $this->displayErrors() – metoda iteracyjnie przegląda tablicę _postErrors składając każdy jej element (komunikat o błędzie) dodając jego treść do zmiennej przechowującej finalnie wyświetlany kod HTML.
1 2 3 4 5 | //Metoda wyświetla błędy private function displayErrors(){ foreach ($this->_postErrors AS $err) $this->_html .= '<div class="alert error">'. $err .'</div>'; } |
Metoda $this->displayForm() – metoda wyświetla formularz konfiguracyjny ze wszystkimi jego polami oraz ich etykietami
1 2 3 4 5 6 7 8 9 10 11 12 | //Metoda wyświetla formularz konfiguracyjny private function displayForm() { $this->_html .= ' <form action="' . $_SERVER['REQUEST_URI'] . '" method="post"> <fieldset> <legend><img src="' . $this->_path . 'logo.gif" alt="" />' . $this->l('Settings') . '</legend> <label>' . $this->l('Products displayed') . '</label> <div class="margin-form"> <input name="productNbr" type="text" value="' . intval(Configuration::get('NEW_PRODUCTS_NBR')) . '" />' . $this->l('Set the number of products to be displayed in this block') . '</div> <input class="button" name="submitBlockNewProducts" type="submit" value="' . $this->l('Save') . '" /></fieldset> </form>'; } |
Strony: 1 2
:moduły prestashop, prestashop