Diving into PrestaShop Core development
Table of contents
/*<![CDATA[*/ div.rbtoc1597308499636 {padding: 0px;} div.rbtoc1597308499636 ul {list-style: disc;margin-left: 0px;} div.rbtoc1597308499636 li {margin-left: 0px;padding-left: 0px;} /*]]>*/
Diving into PrestaShop Core development
Accessing the database
The database structure
PrestaShop's database tables start with the ps_
prefix. Note that this can be customized during installation
All table names are in lowercase, and words are separated with an underscore character ("_
").
When a table establishes the links between two entities, the names of both entities are mentioned in the table's name. For instance, ps_category_product
links products to their category.
A few details to note:
Use the
id_lang
field to store the language associated with a record.Use the
id_shop
field to store the store associated with a record.Tables which contain translations must end with the
_lang
suffix. For instance,ps_product_lang
contains all the translations for theps_product
table.Tables which contain the records linking to a specific shop must end with the
_shop
suffix. For instance,ps_category_shop
contains the position of each category depending on the store.
The ObjectModel class
This is the main object of PrestaShop's object model. It can be overridden with precaution.
It is an Active Record kind of class (see: http://en.wikipedia.org/wiki/Active_record_pattern). PrestaShop's database table attributes or view attributes are encapsulated in the class. Therefore, the class is tied to a database record. After the object has been instantiated, a new record is added to the database. Each object retrieves its data from the database; when an object is updated, the record to which it is tied is updated as well. The class implements accessors for each attribute.
Defining the model
You must use the $definition
static variable in order to define the model.
For instance:
A model for many stores and/or languages
In order to have an object in many languages:
In order to have an object depending on the current store
In order to have an object which depends on the current store, and in many languages:
The main methods
Any overriding of the ObjectModel methods is bound to influence how all the other classes and methods act. Use with care.
The DBQuery class
The DBQuery class is a query builder which helps you create SQL queries. For instance:
Here are some of the methods from this class:
The Dispatcher
The Dispatcher is one of the main technical features of v1.5. It handles URL redirections. Instead of using multiple files in the root folder like product.php
, order.php
or category.php
, only one file is used: index.php
. From now on, internal URL will look like index.php?controller=category
, index.php?controller=product
, etc.
Additionally, the Dispatcher is built to support URL rewriting. Therefore, when URL-rewriting is off, PrestaShop will use the following URL form:
...and when URL-rewriting is on (or "Friendly URLs"), PrestaShop's Dispatcher will correctly support this URL form:
There are several advantages for this system:
It is easier to add a controller.
You can use custom routes to change your friendly URLs (which is really better for SEO!)
There is only one single entry point into the software, which improves PrestaShop's reliability, and facilitates future developments.
The Dispatcher makes use of three new 1.5 abstract classes: Controller
, FrontController
and AdminController
(the last two inheriting from the first one).
New routes can be created by overriding the loadRoutes()
method.
The store administrator can change a controller's URL using the "SEO & URLs" page in the back-office's "Preferences" menu.
Controllers
In the MVC architecture, a Controller manages the synchronization events between the View and the Model, and keeps them up to date. It receives all the user events and triggers the actions to perform. If an action needs data to be changed, the Controller will "ask" the Model to change the data, and in turn the Model will notify the View that the data has been changed, so that the View can update itself.
All of PrestaShop's controllers actually override the Controller
class through another inheriting class, such as AdminController
, ModuleAdminController
, FrontController
, ModuleFrontController
, etc.
The FrontController class
Some of the class' properties:
Execution order of the controller's functions
__contruct()
: Sets all the controller's member variables.init()
: Initializes the controller.setMedia()
orsetMobileMedia()
: Adds all JavaScript and CSS specifics to the page so that they can be combined, compressed and cached (see PrestaShop's CCC tool, in the back-office "Performance" page, under the "Advanced preferences" menu).postProcess()
: HandlesajaxProcess
.initHeader()
: Called beforeinitContent()
.initContent()
: Initializes the content.initFooter()
: Called afterinitContent()
.display()
ordisplayAjax()
: Displays the content.
Existing controllers
Overriding a controller
Thanks to object inheritance, you can change a controller's behaviors, or add new ones.
PrestaShop's controllers are all stored in the /controllers
folder, and use the "Core" suffix.
For instance, when working with the Category controller:
File:
/controllers/CategoryController.php
Class:
CategoryControllerCore
In order to override a controller, you must first create a new class without the "Core" suffix, and place its file in the /override/controllers
folder.
For instance, when overriding the Category controller:
File:
/override/controllers/front/CategoryController.php
Class:
CategoryController
Views
PrestaShop uses the Smarty template engine to generate its views: http://www.smarty.net/
The views are stored in .tpl
files.
A view name is generally the same as the name for the code using it. For instance, 404.php
uses 404.tpl
.
View overriding
As there is no inheritance, there is no way to override a view.
In order to change a view, you must rewrite the template file, and place it in your theme's folder.
Cookies
PrestaShop uses encrypted cookies to store all the session information, for visitors/clients as well as for employees/administrators.
The Cookie class (/classes/Cookie.php
) is used to read and write cookies.
In order to access the cookies from within PrestaShop code, you can use this:
All the information stored within a cookie is available using this code:
If you need to access the PrestaShop cookie from non-PrestaShop code, you can use this code:
Data stored in a visitor/client's cookie
Data stored in an employee/administrator's cookie
Hooks
Hooks are a way to associate your code to some specific PrestaShop events.
Most of the time, they are used to insert content in a page.
For instance, the PrestaShop default theme's home page has the following hooks:
Hooks can also be used to perform specific actions under certain circumstances (i.e. sending an e-mail to the client).
You can get a full list of the hooks available in PrestaShop 1.5 in the "Hooks in PrestaShop 1.5" chapter of the Developer Guide.
Using hooks
...in a controller
It is easy to call a hook from within a controller: you simply have to use its name with the hookExec()
method: Module::hookExec('NameOfHook');
For instance:
...in a module
In order to attach your code to a hook, you must create a non-static public method, starting with the "hook
" keyword followed by either "display
" or "action
", and the name of the hook you want to use.
This method receives one (and only one) argument: an array of the contextual information sent to the hook.
In order for a module to respond to a hook call, the hook must be registered within PrestaShop. Hook registration is done using the registerHook()
method. Registration is usually done during the module's installation.
...in a theme
It is easy to call a hook from within a template file (.tpl
): you simply have to use its name with the hook
function. You can add the name of a module that you want the hook execute.
For instance:
Creating your own hook
You can create new PrestaShop hooks by adding a new record in the ps_hook
table in your MySQL database. You could do it the hard way:
...but PrestaShop enables you to do it the easy way:
If the hook "NameOfHook" doesn't exist, PrestaShop will create it for you. No need to do the SQL query anymore.
Last updated