...
Classes and controllers are usually built following a certain norm. Here is the the Product class and controller:
...
In order to override the Product
class, your file needs to be called Product.php
and must feature a Product
class that the then extends ProductCore
class.
The file can be placed in either of these locations:
/override/classes/Product.php
/modules/my_module/override/classes/Product.php
Overriding a controller
In order to override the ProductController
class, your file needs to be called ProductController.php
and must feature a ProductController
class that the then extends ProductControllerCore
class.
The file can be placed in either of these locations:
/override/controllers/front/ProductController.php
/modules/my_module/override/controllers/front/ProductController.php
Overriding other behaviors
PrestaShop has certain files you can use to override elements such as displaying redirections (Tools.php
) and measuring hook execution time (_Module.php
), etc. you can enable them by removing the "_
" prefix. For sintanceinstance, rename _Tools.php
into Tools.php
. If there already exists a Tools.php
override, you will have to merge it with yours.
...
/themes/my_theme/modules/my_module/my_module.tpl
/themes/my_theme/css/modules/my_modulesmodule/my_module.css
/themes/my_theme/js/modules/my_modulesmodule/my_module.js
Since PrestaShop 1.5, the path is slightly longer
/themes/my_theme/modules/my_module/views/templates/front/my_module.tpl
/themes/my_theme/css/modules/my_modulesmodule/views/templates/front/my_module.css
/themes/my_theme/js/modules/my_modulesmodule/views/templates/front/my_module.js
...
Note |
---|
Contrary to the override code that is to be placed manually in the |
Manipulating the override code manually
Modules and themes may add an override to a default behavior, and PrestaShop takes care of reseting the /cache/class_index.php
file.
But sometimes you need to add that overriding code yourself, manually uploading the file to your server. In that case, you need to trigger the regeneration of the /cache/class_index.php file yourself. This is done simply by deleting the file: if PrestaShop cannot find the file, it will regenerate it, taking all the overrides into account.
It is the same when manually removing an override: in order to reinstate the default behavior, you must delete the /cache/class_index.php
file.
Sample code
Example 1
Using the MySQL.php
data class is simply impossible while trying to enter data into a different database from PrestaShop's on the same MySQL Server. (Really!)
...
Code Block |
---|
/*
* Create a cron task to make periodical database backup
*/
class AdminTab extends AdminTabCore{
public function ajaxProcess()
{
// Here we call the same thing as if we did the old way
// + with "if": maybe we want to limit its use to only adding backup
// note: find yourself a way to get the file link if you want to send it by mail!
if (isset($_REQUEST['addbackup']))
return $this->postProcess();
}
public function displayAjax()
{
if (sizeof($this->_errors) > 0)
{
// handle errors
// for example, send mail with all error msg
$content = '';
foreach($this->_errors as $errorMsg)
$content .= $errorMsg;
$lang = 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'=>)), $to);
}
else
{
// no error, but maybe we want a mail ?
if(Configuration::get('PS_NOTICE_SUCCEED_BACKUP'))
{
// fileAttachment available, see 9th param of Send() method in classes/Mail.php
// + we can add a condition "if (Configuration::get('PS_AUTOBACKUP_SEND_FILE'))"
Mail::Send($lang, 'backuptaskerror', '[autobackup] report backup error', array('vars to use in tpl'), $to);
}
}
return true;
}
}
|
...
Code Block |
---|
/* * With this override, you have a new Smarty variable called "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 displayHeaderinitHeader() { self::$smarty->assign('currentController', get_class($this)); return parent::displayHeaderinitHeader(); } } |