DEVart

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-&gt;name = 'blocknewproducts';
    $this-&gt;tab = 'Blocks';
    $this-&gt;version = 0.9;
 
    parent::__construct();
 
    $this-&gt;displayName = $this-&gt;l('New products block');
    $this-&gt;description = $this-&gt;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-&gt;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-&gt;_path . 'logo.gif" alt="" />' . $this-&gt;l('Settings') . '</legend>
         <label>' . $this-&gt;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

:,

Leave a Reply

Security Code:

Szukasz informacji?

Skorzystaj z formularza poniżej aby przeszukać stronę:

W dalszym ciągu nie jesteś w stanie znaleźć interesujących Cię informacji? Skontaktuj się ze mną!

Polecane strony

Kilka adresów stron które powinieneś odwiedzić:

Archiwum

Wszystkie wpisy, chronologicznie: