Message-ID: <1213085511.379366.1711725347429.JavaMail.root@confluence-doc2-production> Subject: Exported From Confluence MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_Part_379365_1551462309.1711725347424" ------=_Part_379365_1551462309.1711725347424 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Content-Location: file:///C:/exported.html
Cet article a =C3=A9t=C3=A9 =C3=A9crit par Julien Breux, et publi=C3=A9 sur le blog de Pr= estaShop le 9 ao=C3=BBt 2011.
=20PrestaShop vous permet de surcharger diff=C3=A9rents =C3=A9l=C3=A9ments = et comportements. Il existe en r=C3=A9alit=C3=A9 deux grands principes dans= la version 1.4 de PrestaShop :
=20Les modules sont g=C3=A9n=C3=A9ralement constitu=C3=A9s de cette fa=C3= =A7on :
=20PrestaShop vous permet de =C2=AB surcharger =C2=BB, autrement dit de rem= placer certains fichiers de vue des modules par de nouveaux situ=C3=A9s dan= s le th=C3=A8me. Pour cela, rien de plus simple, il vous suffit de proc=C3= =A9der de la mani=C3=A8re suivante :
=20Ainsi, lorsque vous allez afficher votre site, ces nouveaux fichiers ser= ont utilis=C3=A9s.
=20L'override est un concept qui permet de "surcharger" les fichiers classe=
s et les fichiers contr=C3=B4leurs.
L'utilisation ing=C3=A9nieuse de l'=
auto-chargement des classes de PrestaShop permet donc un "switch" assez fac=
ile de ces diff=C3=A9rents fichiers.
Il vous est donc possible gr=C3=A2=
ce =C3=A0 l'h=C3=A9ritage de modifier ou ajouter de nouveaux comportements =
via les propri=C3=A9t=C3=A9s et les m=C3=A9thodes de ces diff=C3=A9rentes c=
lasses.
En temps normal, ceux-ci sont architectur=C3=A9s de cette fa=C3=A7on (ex= emple pour la partie produit) :
=20Afin de "surcharger" la classe mod=C3=A8le produit, vous devez cr=C3=A9e= r un fichier situ=C3=A9 dans le dossier "override/classes/" comme ceci :
=20Cette classe se nommera "Product" et =C3=A9tendra la classe "ProductCore=
".
Ainsi, la magie de PrestaShop peut op=C3=A9rer !
De la m=C3=AAme fa=C3=A7on, vous pouvez utiliser ce principe avec les co= ntr=C3=B4leurs et donc "surcharger" de cette fa=C3=A7on :
=20Cette classe se nommera "ProductController" et =C3=A9tendra la classe "P= roductControllerCore".
=20PrestaShop met =C3=A0 votre disposition certains fichiers vous permettan= t de mettre en =C5=93uvre quelques overrides comme l'affichage des redirect= ions (_Tools.php), le calcul du temps d'ex=C3=A9cution des "hooks" (_Module= .php), etc...
=20Lorsque l'on essaye de taper dans une base de donn=C3=A9es diff=C3=A9ren= te de celle de Presta, sur le m=C3=AAme serveur MySQL, c'est simplement imp= ossible avec la classe MySQL.php de base (et oui !).
=20La solution : utiliser cette surcharge de la classe MySQLCore :
=20<?php class MySQL extends MySQLCore { =09public function __construct($server, $user, $password, $database, $newli= nk =3D false) =09{ =09=09$this->_server =3D $server; =09=09$this->_user =3D $user; =09=09$this->_password =3D $password; =09=09$this->_type =3D _DB_TYPE_; =09=09$this->_database =3D $database; =09=09$this->connect($newlink); =09} =09 =09public function connect($newlink =3D false) =09{ =09=09if (!defined('_PS_DEBUG_SQL_')) =09=09=09define('_PS_DEBUG_SQL_', false); =09=09if ($this->_link =3D mysql_connect($this->_server, $this->_u= ser, $this->_password, $newlink)) =09=09{ =09=09=09if(!$this->set_db($this->_database)) =09=09=09=09die(Tools::displayError('The database selection cannot be made.= ')); =09=09} =09=09else =09=09=09die(Tools::displayError('Link to database cannot be established.')= ); =09=09/* UTF-8 support */ =09=09if (!mysql_query('SET NAMES \'utf8\'', $this->_link)) =09=09=09die(Tools::displayError('PrestaShop Fatal error: no utf-8 support.= Please check your server configuration.')); =09=09// removed SET GLOBAL SQL_MODE : we can't do that (see PSCFI-1548) =09=09return $this->_link; =09} } ?>=20
Pour l'utiliser, il suffit juste d'instancier la classe de la mani=C3=A8= re suivante :
=20Le dernier param=C3=A8tre force la cr=C3=A9ation d'une nouvelle connexio= n MySQL.
=20Cette surcharge vous permet d=E2=80=99utiliser ajax-tab.php pour toute a= ction d=E2=80=99administration.
=20A utiliser pour les taches cron par exemple.
=20/* * This override allows you to use ajax-tab.php to make any admin action. * Use it for crontask for example */ class AdminTab extends AdminTabCore{ public function ajaxProcess() { return $this->postProcess(); } }=20
Cr=C3=A9er une tache cron pour faire une sauvegarde p=C3=A9riodique de l=
a base de donn=C3=A9es.
Merci de faire un test avant utilisation !
/* * Create a cron task to make periodical database backup * (please test before use, I didn't tested it yet) */ class AdminTab extends AdminTabCore{ public function ajaxProcess() { =20 // here we call the same thing as if we do the old way // + with "if" : maybe we want to limit its use to only adding back= up : // note : find yourself a way to get the file link if you want to s= end it by mail ! if (isset($_REQUEST['addbackup'])) return $this->postProcess(); }=20 public function displayAjax() { if(sizeof($this->_errors)>0) { // handle errors=20 // for example, send mail with all error msg $content =3D ''; foreach($this->_errors as $errorMsg) $content .=3D $errorMsg; =20 $lang =3D Configuration::get('PS_LANG_DEFAULT'); // here we send a mail to give the result of the process // notice : you have to create template mails files Mail::Send($lang, 'backuptaskdone', '[autobackup] report backup = error', array('backup_link'=3D>)), $to);=20 } else { // no error, but maybe we want a mail ? if(Configuration::get('PS_NOTICE_SUCCEED_BACKUP'))=20 { // fileAttachment available, see 9th param of Send() method in c= lasses/Mail.php // + we can add a condition "if(Configuration::get('PS_AUTOB= ACKUP_SEND_FILE'))" Mail::Send($lang, 'backuptaskerror', '[autobackup] report backup= error', array('vars to use in tpl'), $to);=20 } } return true; } }=20
Avec cette surcharge, vous avez une nouvelle variable Smarty =C2=AB curr=
entController =C2=BB disponible dans header.tpl
Ceci vous permet d=E2=
=80=99utiliser un header diff=C3=A9rent selon que vous soyez sur une page p=
roduit, une page cat=C3=A9gorie ou sur la home.
/* * with this override, you have a new smarty variable "currentController" * available in header.tpl * This allows you to use a different header if you are * on a product page, category page or home. */ class FrontController extends FrontControllerCore { public function displayHeader() { self::$smarty->assign('currentController',get_class($this)); return parent::displayHeader(); } }=20
Avec la surcharge, les fichiers =C2=AB core =C2=BB ne sont pas modifi=C3= =A9s. Cette technique vous permet donc de personnaliser votre boutique Pres= taShop tout en ayant la possibilit=C3=A9 de suivre l'=C3=A9volution du logi= ciel. Les mises =C3=A0 jour en sont facilit=C3=A9es