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 Surcharge et override

Surcharge et override

Surcharge et ove= rride

=20

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.

=20

Introduction

=20

PrestaShop 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 :

=20 =20

Surcharge des modules=20

Les modules sont g=C3=A9n=C3=A9ralement constitu=C3=A9s de cette fa=C3= =A7on :

=20 =20

PrestaShop 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 :

=20 =20

Ainsi, lorsque vous allez afficher votre site, ces nouveaux fichiers ser= ont utilis=C3=A9s.

=20

Surcharge des classes=20

L'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.

=20

En temps normal, ceux-ci sont architectur=C3=A9s de cette fa=C3=A7on (ex= emple pour la partie produit) :

=20 =20

Afin 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 :=20

=20

Cette classe se nommera "Product" et =C3=A9tendra la classe "ProductCore= ".
Ainsi, la magie de PrestaShop peut op=C3=A9rer !

=20

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 :

=20 =20

Cette classe se nommera "ProductController" et =C3=A9tendra la classe "P= roductControllerCore".

=20

PrestaShop 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...

=20

Exemple 1

=20

Lorsque 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 !).

=20

La solution : utiliser cette surcharge de la classe MySQLCore :

=20
=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
=20

Pour l'utiliser, il suffit juste d'instancier la classe de la mani=C3=A8= re suivante :

=20 =20

Le dernier param=C3=A8tre force la cr=C3=A9ation d'une nouvelle connexio= n MySQL.

=20

Exemple 2

=20

Cette surcharge vous permet d=E2=80=99utiliser ajax-tab.php pour toute a= ction d=E2=80=99administration.

=20

A utiliser pour les taches cron par exemple.

=20
=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
=20

Exemple 3

=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 !

= =20
=20
/*
 * 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
=20

Exemple 4

=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.

=20
=20
/*
 * 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
=20

Conclusions

=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

------=_Part_379365_1551462309.1711725347424--