Kurs tworzenia wtyczek w PrestaShop

PrestaShop pozwala na dodanie nowych funkcjonalności z wykorzystanie wtyczek przygotowanych przez społeczność. Jeżeli znasz PHP i masz dostęp do serwera to możesz samodzielnie przygotować dodatek szyty pod Ciebie. Do stworzenia własnej wtyczki w PrestaShop przyda się również znajomość JavaScript. HTML i szablonów Twig. Testowanie powinno się oczywiście odbywać w osobnym środowisku testowym, aby użytkownicy nie musieli oglądać Twoich prób.

Opis

Wtyczka będzie dodawała produkty z zewnętrznego źródła danych (pliku XML)

Struktura plików

Utwórz katalog w modules i nazwij go tak jak twoja wtyczka (pomijając spację). W moim przykładzie będzie to eskimplxmlproductsimporter. Wewnątrz katalogu umieść plik o takiej samej nazwie i rozszerzeniu .php. Tam umieścimy cały kod. Dodamy jeszcze kod z konfiguracją, index.php oraz logo (png 32x32px), które będzie wyświetlało się przy wtyczce w katalogu modułów.

config_pl.xml
eskimplxmlproductsimporter.php
index.php
logo.png

Zanim zaczniemy pisać kod skupmy się na omówieniu pozostałych plików

Plik index.php uzupełniam kodem, który uniemożliwi bezpośredni dostęp do wtyczki przez wścibskiego użytkownika.

<?php

header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');

header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');

header('Location: ../../');
exit;

W pliku config_pl.xml umieszczamy to co będzie widoczne w katalogu wtyczki

<?xml version="1.0" encoding="UTF-8" ?>
<module>
    <name>eskimplxmlproductsimporter</name>
    <displayName><![CDATA[Integracja produktów przez xml]]></displayName>
    <version><![CDATA[1.0.0]]></version>
    <description><![CDATA[Integracja produktów przez xml]]></description>
    <author><![CDATA[Maciej Wlodarczak]]></author>
    <tab><![CDATA[front_office_features]]></tab>
	  <confirmUninstall><![CDATA[Na pewno chcesz odinstalować?]]></confirmUninstall>
    <is_configurable>1</is_configurable>
    <need_instance>0</need_instance>
	  <limited_countries></limited_countries>
</module>
aliexpress

name – nazwa wtyczki
displayName – wyświetlana nazwa w katalogu
version – wersja wtyczki – przydatna w szczególności, jeżeli będziemy chcieli w przyszłości aktualizować ją zdalnie
description – opis wtyczki wyświetlany w katalogu
author – autor wtyczki
confirmUninstall – tekst jaki ma się wyświetlić kiedy chcemy odinstalować wtyczkę
is_configurable – czy wtyczka będzie miała możliwość konfiguracji
need_instance – czy moduł ma być tworzony w momencie wyświetlania go na liście modułów w katalogu (przydatne, jeżeli nasza wtyczka musi sprawdzić jakieś elementy związane np. z konfiguracją PrestaShop przed instalacją.
limited_countries – umożliwia ograniczenie wtyczkę do wybranych krajów (podajemy wtedy skróty krajów po przecinku np. pl,en)

Mając przygotowane podstawowe pliki, możemy skupić się na tworzeniu własnej wtyczki w PrestaShop. Na początek zabezpieczę plik przed dostępem z poza sklepu.

<?php

if (!defined('_PS_VERSION_')) {
    exit;
}

Kolejnym elementem będzie utworzenie klasy, która rozszerza klasę Module i konstruktora. Podajemy w nim te same dane co w xml. Dodajemy jeszcze 2 ważne metody – install i uninstall. Pozwolą one nam zainstalować i odinstalować moduł.

class EskimPLXMLProductImporter extends Module
{
    public function __construct()
    {		
        $this->name = 'eskimplxmlproductsimporter';
        $this->tab = 'front_office_features';
        $this->version = '1.0.0';
        $this->author = 'Maciej Włodarczak';
        $this->need_instance = 0;
        $this->ps_versions_compliancy = [
            'min' => '1.7',
            'max' => _PS_VERSION_
        ];
        $this->bootstrap = true;
 
        parent::__construct();

        $this->displayName = $this->l('Integracja produktów');
        $this->description = $this->l('Integracja produktów');

        $this->confirmUninstall = $this->l('Na pewno chcesz odinstalować?');
    }

	  public function install() {
        return parent::install();
	  }

	  public function uninstall() {
        return parent::uninstall();
	  }
}

Strona z konfiguracją wtyczki

Zanim zaczniemy pisać kod samej wtyczki utworzymy stronę z jej konfiguracją. Wykorzystamy do tego celu dedykowaną metodę getContent(). Kod zwracany przez metodę powinien być sformatowany w HTML-u i zostanie on wyświetlony w menu konfiguracji wtyczki dostępnym na liście zainstalowanych dodatków. PrestaShop udostępnia klasę, która ułatwia generowanie odpowiednio sformatowanego formularza oraz zapisze dane pod wskazaną nazwą.

public function getContent()
{
    $form = [
        'form' => [
            'legend' => [
                'title' => $this->l('Ustawienia'),
            ],
            'input' => [
                [
                    'type' => 'text',
                    'label' => $this->l('Adres do pliku XML'),
                    'name' => 'ESKIMPLXMLPRODUCTSIMPORETER_CONFIG',
                    'size' => 20,
                    'required' => true,
                ],
            ],
            'submit' => [
                'title' => $this->l('Zapisz'),
                'class' => 'btn btn-default pull-right',
            ],
        ],
    ];

    $helper = new HelperForm();
    $helper->table = $this->table;
    $helper->name_controller = $this->name;
    $helper->token = Tools::getAdminTokenLite('AdminModules');
    $helper->currentIndex = AdminController::$currentIndex . '&' . http_build_query(['configure' => $this->name]);
    $helper->submit_action = 'submit' . $this->name;
    $helper->default_form_language = (int) Configuration::get('PS_LANG_DEFAULT');
    $helper->fields_value['ESKIMPLXMLPRODUCTSIMPORETER_CONFIG'] = Tools::getValue('ESKIMPLXMLPRODUCTSIMPORETER_CONFIG', Configuration::get('MYMODULE_CONFIG'));

    return $helper->generateForm([$form]);
}

…ciąg dalszy nastąpi… dokumentacja modułów PrestaShop modules :: PrestaShop Developer Documentation