Tworzenie modułu Prestashop odmieniającego imię w mailach
Poradniki

Tworzenie modułu Prestashop odmieniającego imię w mailach

Na początek utwórzmy folder naszego modułu, nazwijmy go namevariations i umieśćmy tam podstawową strukturę plików i folderów:

  • config.xml
  • namevariations.php
  • classes/NameVariation.php
  • controllers/admin/NameVariations.php

W pierwszej kolejności otwórzmy plik config.xml i przygotujmy konfigurację naszego modułu:

<?xml version="1.0" encoding="UTF-8" ?>
<module>
    <name>namevariations</name>
    <displayName><![CDATA[Warianty imion]]></displayName>
    <version><![CDATA[1.0.0]]></version>
    <description><![CDATA[Ustaw warianty dla imion do wykorzystania w szablonach maili.]]></description>
    <author><![CDATA[Akademia sklepów]]></author>
    <is_configurable>0</is_configurable>
    <need_instance>0</need_instance>
    <limited_countries></limited_countries>
</module>

Parametr is_configurable został ustawiony na „0” z uwagi na to, że nie będziemy korzystać ze strony konfiguracji a jedynie z kontrolera.

Przejdźmy teraz do pliku namevariations.php i uzupełnijmy go następującą treścią:

<?php

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

class nameVariations extends Module
{
    public function __construct()
    {
        $this->name = 'namevariations';
        $this->version = '1.0.0';
        $this->author = 'Akademia Sklepów';
        $this->need_instance = 0;
        $this->ps_versions_compliancy = array('min' => '1.7.1.0', 'max' => _PS_VERSION_);
        $this->bootstrap = true;
        $this->is_configurable = false;

        parent::__construct();

        $this->displayName = $this->l('Warianty imion', 'myfirstmodule');
        $this->description = $this->l('Ustaw warianty dla imion do wykorzystania w szablonach maili.', 'myfirstmodule');
    }

    public function install()
    {
        if (
            !parent::install()
            || !$this->installDB()
        ) {
            return false;
        }

        $tab = new Tab();
        $tab->active = 1;
        $tab->class_name = 'NameVariations';
        $tab->position = 3;
        $tab->name = array();
        foreach (Language::getLanguages(true) as $lang) {
            $tab->name[$lang['id_lang']] = 'Odmiany Imion';
        }
        $tab->id_parent = (int) Tab::getIdFromClassName('CONFIGURE');
        $tab->module = $this->name;
        $tab->add();
        $tab->save();

        return true;
    }

    public function installDB(){
        $correct = true;

        $correct = Db::getInstance()->execute('
            CREATE TABLE IF NOT EXISTS `' . _DB_PREFIX_ . 'namevariations` ( 
                `id_namevariation` INT UNSIGNED NOT NULL AUTO_INCREMENT , 
                `name` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL , 
                `dopelniacz` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL , 
                `celownik` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL , 
                `biernik` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL , 
                `narzednik` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL , 
                `miejscownik` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL , 
                PRIMARY KEY (`id_namevariation`)
            ) ENGINE = ' . _MYSQL_ENGINE_ . ';
        ');

        return $correct;
    }

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

Wewnątrz funkcji __construct ustalamy konfigurację, parametr is_configurable ustawiamy w tym miejscu na false

Wewnątrz funkcji install wywołujemy funkcję instalującą bazę danych a następnie tworzymy nową zakładkę w menu bocznym panelu administracyjnego, wewnątrz zakładki Ustawienia

Kolejno przygotowujemy funkcję installDB w której tworzymy tabelę dla naszego modułu przechowującą podstawowe imię oraz jego odmiany.

Ostatnia funkcja to uninstall za pomocą, której odinstalowujemy nasz moduł.

Przejdźmy do pliku classes/NameVariaton.php uzupełnijmy plik następującą treścią:

<?php

class NameVariation extends ObjectModel {
    public $id;
    public $id_namevariation;
    public $name;
    public $dopelniacz;
    public $celownik;
    public $biernik;
    public $narzednik;
    public $miejscownik;

    public static $definition = array(
        'table' => 'namevariations',
        'primary' => 'id_namevariation',
        'multilang' => false,
        'multilang_shop' => false,
        'fields' => array(
            'name' => array('type' => self::TYPE_STRING, 'lang' => false, 'validate' => 'isGenericName', 'size' => 512),
            'dopelniacz' => array('type' => self::TYPE_STRING, 'lang' => false, 'validate' => 'isGenericName', 'size' => 512),
            'celownik' => array('type' => self::TYPE_STRING, 'lang' => false, 'validate' => 'isGenericName', 'size' => 512),
            'biernik' => array('type' => self::TYPE_STRING, 'lang' => false, 'validate' => 'isGenericName', 'size' => 512),
            'narzednik' => array('type' => self::TYPE_STRING, 'lang' => false, 'validate' => 'isGenericName', 'size' => 512),
            'miejscownik' => array('type' => self::TYPE_STRING, 'lang' => false, 'validate' => 'isGenericName', 'size' => 512),
        ),
    );

    
    public static function getByName($name){
        $result = Db::getInstance()->getRow("
            SELECT * FROM `" . _DB_PREFIX_ . "namevariations` WHERE `name` = '" . $name . "'"
        );

        return $result;
    }
}

W tym miejscu przygotowujemy klasę, na podstawie której będą umieszczane wartości w bazie danych. Wewnątrz zmiennej $definition ustalamy również rodzaje pól w bazie danych.

Przygotowana została również funkcja getByName za pomocą, której pobierana jest wartość z bazy danych dla danego imienia, jeśli brak zwracana jest wartość false

Przygotujmy następnie plik controllers/admin/NameVariations.php i umieśćmy tam treść:

<?php

include_once(_PS_MODULE_DIR_.'namevariations/classes/NameVariation.php');

class NameVariationsController extends AdminController
{
    protected $position_identifier = 'id_namevariation';

    public function __construct()
    {
        $this->bootstrap = true;
        $this->table = 'namevariations';
        $this->list_id = 'namevariations';
        $this->identifier = 'id_namevariation';
        $this->className = 'NameVariation';
        $this->lang = false;
        $this->_defaultOrderBy = 'id_namevariation';

        parent::__construct();

        $this->fields_list = array(
            'id_namevariation' => array(
                'title' => $this->trans('ID', array(), 'Admin.Global'),
                'align' => 'center',
                'class' => 'fixed-width-xs',
            ),
            'name' => array(
                'title' => $this->trans('Name', array(), 'Admin.Global'),
                'align' => 'left',
            ),
            'dopelniacz' => array(
                'title' => $this->trans('Dopełniacz', array(), 'Admin.Global'),
                'align' => 'left',
            ),
            'celownik' => array(
                'title' => $this->trans('Celownik', array(), 'Admin.Global'),
                'align' => 'left',
            ),
            'biernik' => array(
                'title' => $this->trans('Biernik', array(), 'Admin.Global'),
                'align' => 'left',
            ),
            'narzednik' => array(
                'title' => $this->trans('Narzędnik', array(), 'Admin.Global'),
                'align' => 'left',
            ),
            'miejscownik' => array(
                'title' => $this->trans('Miejscownik', array(), 'Admin.Global'),
                'align' => 'left',
            ),
        );

        $this->addRowAction('edit');
        $this->addRowAction('delete');

        $this->bulk_actions = array(
            'delete' => array(
                'text' => $this->trans('Delete selected', array(), 'Admin.Notifications.Info'),
                'icon' => 'icon-trash',
                'confirm' => $this->trans('Delete selected items?', array(), 'Admin.Notifications.Info'),
            ),
        );
    }

Importujemy w tym miejscu plik naszej klasy i przygotowujemy funkcję __construct w której umieszczamy całą konfigurację tabeli wyświetlanej na stronie modułu, oraz podajemy informację z jakiej tabeli bazy danych mają być pobierane informacje.

Niżej przygotujmy kolejną funkcję:

    {
        if (empty($this->display)) {
            $this->page_header_toolbar_btn['new_name_variation'] = array(
                'href' => $this->context->link->getAdminLink('namevariations', true, array(), array(' addnamevariations' => 1)),
                'desc' => 'Dodaj nowe imię',
                'icon' => 'process-icon-new',
            );
        }

        parent::initPageHeaderToolbar();
    }

Za pomocą tej funkcji dodajemy do górnego paska menu przycisk przenoszący do formularza dodawania nowej wartości do bazy danych.

Do przygotowania została jeszcze jedna funkcja:

public function renderForm(){
        $this->fields_form = array(
            'tinymce' => true,
            'legend' => array(
                'title' => $this->l('Dodawanie imienia'),
                'icon' => 'icon-folder-close',
            ),
            'input' => array(
                array(
                    'type' => 'text',
                    'label' => $this->trans('Imię - Mianownik', array(), 'Admin.Global'),
                    'name' => 'name',
                    'id' => 'name',
                    'lang' => false,
                    'required' => true,
                ),
                array(
                    'type' => 'text',
                    'label' => $this->trans('Dopełniacz (kogo? nie ma)', array(), 'Admin.Global'),
                    'name' => 'dopelniacz',
                    'id' => 'dopelniacz',
                    'lang' => false,
                    'required' => false,
                ),
                array(
                    'type' => 'text',
                    'label' => $this->trans('Celownik (komu?)', array(), 'Admin.Global'),
                    'name' => 'celownik',
                    'id' => 'celownik',
                    'lang' => false,
                    'required' => false,
                ),
                array(
                    'type' => 'text',
                    'label' => $this->trans('Biernik (kogo? widzę)', array(), 'Admin.Global'),
                    'name' => 'biernik',
                    'id' => 'biernik',
                    'lang' => false,
                    'required' => false,
                ),
                array(
                    'type' => 'text',
                    'label' => $this->trans('Narzędnik (z kim?)', array(), 'Admin.Global'),
                    'name' => 'narzednik',
                    'id' => 'narzednik',
                    'lang' => false,
                    'required' => false,
                ),
                array(
                    'type' => 'text',
                    'label' => $this->trans('Miejscownik (o kim?)', array(), 'Admin.Global'),
                    'name' => 'miejscownik',
                    'id' => 'miejscownik',
                    'lang' => false,
                    'required' => false,
                ),
            ),
            'submit' => array(
                'title' => $this->trans('Save', array(), 'Admin.Actions'),
            ),
        );

        return parent::renderForm();
    }

Za pomocą tej funkcji przygotowujemy pola formularza, działa identycznie jak funkcja renderForm z podstawowego pliku dla modułu.

Po zainstalowaniu modułu będziemy widzieć po lewej stronie dodatkową pozycję w menu przenoszącą na stronę naszego modułu, gdzie możemy konfigurować pola.

Możemy dodawać warianty imion do bazy danych, ale nie będą one wyświetlane w mailach. Należy przygotować w tym celu klasy i kontrolery, które nadpiszą domyślne pliki Prestashop.

W tym celu tworzymy wewnątrz folderu naszego modułu folder override.

Wiele plików posiada funkcję wysyłające maile, dla każdego z nich musimy dodać pobieranie wariantów i przypisanie zmiennych.

Dla przykładu jest to plik override/classes/Customer.php jego wygląd powinien być następujący:

Na górze załączamy plik klasy naszego modułu, następnie klasa jest tworzona na zasadzie class Klasa extends KlasaCore {}

W przypadku klasy Customer wysyłka maila pojawia się wewnątrz funkcji transformToCustomer, przed zmienną $vars dodajemy następującą treść:

Następnie do tablicy $vars dodajemy treść:

W przypadku różnych plików imię jest przekazywane w inny sposób, w tym przypadku jest to $this->firstname

Wszystkie pliki i ich funkcje jakie należy podmienić to:

  • classes/Customer.php
    • transformToCustomer()
  • classes/PaymentModule.php
    • validateOrder()
    • createOrderCartRules()
  • classes/form/CustomerPersister.php
    • sendConfirmationMail()
  • classes/order/OrderCarrier.php
    • sendInTransitEmail()
  • classes/order/OrderHistory.php
    • sendEmail()
    • changeIdOrderState()
  • controllers/admin/AdminCustomerThreadsController.php
    • postProcess()
  • controllers/admin/AdminImportController.php
    • ajaxProcessImport()
  • controllers/admin/AdminLoginController.php
    • processForgot()
    • processReset()
  • controllers/admin/AdminOrdersController.php
    • postProcess()
    • ajaxProcessSendMailValidateOrder()
  • controllers/admin/AdminReturnController.php
    • postProcess()
  • controllers/front/ OrderDetailController.php
    • postProcess()
  • controllers/front/PasswordController.php
    • sendRenewPasswordLink()
    • changePassword()

Aby skonfigurować szablon maila należy z menu bocznego wybrać zakładkę Międzynarodowy->Tłumaczenia

W tym miejscu wybieramy następujące wartości:

  1. Tłumaczenie e-maila
  2. Treść
  3. Nazwa naszego szablonu
  4. Język, dla którego chcemy tłumaczyć

Następnie klikamy przycisk „Modyfikuj” (5)

Rozwińmy listę szablonów, które chcemy zmodyfikować a następnie wybierzmy jakiś konkretny.

W tym miejscu możemy użyć naszych zmiennych, a zostanie to wykorzystane w naszych mailach.

Dla powyższego szablonu przy dodaniu imion do bazy zostaną wysłane np. następujące treści:

  • Krystianie
  • Kamilu
  • Marku
  • Michale

Itd.

Jeżeli w mailu w wiadomości będzie po prostu wysyłać się treść „{mianownik}”, „{celownik}” itd. to należy zmodyfikować główne pliki klas i kontrolerów Prestashop, ponieważ niestety czasem klasy override nie działają poprawnie, można też próbować zainstalować moduł ponownie.

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ę