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:
- Tłumaczenie e-maila
- Treść
- Nazwa naszego szablonu
- 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.