Creating a module with both front-end and back-end controllers
Table of contents
Creating a module with both front-end and back-end controllers
Creating a new data table
Add a new table to your PrestaShop database. Name this table ps_opinion
.
id_opinion | int(10) unsignedid_customer | int(10) unsignedopinion | enum('AVERAGE','GOOD','VERY_GOOD')active | tinyint(1) unsigned
Creating the model
Variables
/* models/opinion.php */class
Opinion extends
ObjectModel{ public
$id_opinion; public
$id_customer; public
$opinion; public
$active;
Model definition
public
static
$definition
= array( 'table'
=> 'opinion', 'primary'
=> 'id_opinion', 'multilang'
=> false, 'fields'
=> array( 'id_opinion'
=> array( 'type'
=> ObjectModel :: TYPE_INT ), 'id_customer'
=> array( 'type'
=> ObjectModel :: TYPE_INT, 'required'
=> true ), 'opinion'
=> array( 'type'
=> ObjectModel :: TYPE_STRING, 'required'
=> true ), 'active'
=> array( 'type'
=> ObjectModel :: TYPE_BOOL, required' => true ) ));
Functions
public
static
function
findAll() { $sql
= 'select * from '
. _DB_PREFIX_ . 'opinion where active = 1'; if
($rows
= Db :: getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql)) { return
ObjectModel :: hydrateCollection(__CLASS__, $rows); } return
array(); } public
function
getCustomerName() { $customer
= new
Customer($this->id_customer); return
$customer->firstname . ' '
. $customer->lastname; }}
Creating the module's bootstrap file
<?phprequire_once
dirname(__FILE__) . '/models/Opinion.php';class
CustomerOpinion extends
Module{ public
function
__construct() { $this->name = 'customeropinion'; $this->tab = 'front_office_features'; $this->version = 1.0; $this->author = 'Me'; $this->displayName = $this->l('Customer Opinion'); $this->description = $this->l('Customer Opinion'); parent::__construct(); } public
function
install() { return
parent::install() && $this->registerHook('leftColumn'); } public
function
hookDisplayLeftColumn($params) { return
$this->display(__FILE__, 'left-column.tpl'); }}
Creating the hook's view
The left-column.tpl
file is located in the /views/templates/hook
folder.
{* Filename: left-column.tpl *}<a href="{$link->getModuleLink('customeropinion')}">{l s='Give my opinion'
mod='customeropinion'}</a>
The getModuleLink()
function makes it possible to add a link to the module's controller.
Here is its signature: $link->getModuleLink($module, $controller = 'default', array $params = array(), $ssl = false, $id_lang = null)
Creating the front-office controller
The module's controller, default.php
, is located in the /controllers/front
folder.
class
helloWorldDefaultModuleFrontController extends
ModuleFrontController{ public
function
initContent() { parent::initContent(); if
($_SERVER['REQUEST_METHOD'] == 'POST') { if
($opinion
= Tools::getValue('opinion', false)) { $opinionObj
= new
Opinion(); $opinionObj->id_customer = $this->context->customer->id; $opinionObj->active = false; $opinionObj->opinion = $opinion; $opinionObj->add(); $link
= new
Link(); Tools::redirect($link->getModuleLink('customeropinion', 'default')); } } $opinions
= Opinion::findAll(); $this->context->smarty->assign('opinions', $opinions); $this->setTemplate('form.tpl'); }}
The template for the controller, form.tpl
, is located in the /views/templates/front
folder.
<h2>{l s='Give your opinion'
mod='customeropinion'}</h2><form method="post"
class="std"> <fieldset> <label for="opinion"
id="opinion">{l s='Our website is...'
mod='customeropinion'}</label> <select name="opinion"> <option>--</option> <option value="VERY_GOOD">{l s='Very Good'
mod='customeropinion'}</option> <option value="GOOD">{l s='Good'
mod='customeropinion'}</option> <option value="AVERAGE">{l s='Average'
mod='customeropinion'}</option> </select> <input type="submit"
class="button"
value="{l s='Give my opinion' mod='customeropinion'}"
/> </fieldset></form><hr /><h3>{l s='What people think'
mod='customeropinion'}</h3><table style="width: 100%;"> {foreach
from=$opinions
item=opinion} <tr> <td>{$opinion->getCustomerName()}</td> <td>{$opinion->opinion}</td> </tr> {/foreach}</table>
Creating the back-office controller
The module's controller, AdminOpinion.php
, is located in the /controllers/admin
folder.
By convention, all back-office controllers should be named with the "Admin" prefix.
class
AdminOpinionController extends
ModuleAdminController{ public
function
__construct() { $this->table = 'opinion'; $this->className = 'Opinion'; parent::__construct(); $this->fields_list = array( 'id_opinion'
=> array( 'title'
=> '#' ), 'id_customer'
=> array( 'title'
=> $this->module->l('Customer'), 'callback'
=> 'getCustomerName' ), 'opinion'
=> array( 'title'
=> $this->module->l('Opinion') ), 'active'
=> array( 'title'
=> $this->module->l('Valider'), 'active'
=> 'status' ) ); $this->actions = array('delete'); } public
function
getCustomerName($echo, $row) { $id_customer
= $row['id_customer']; $customer
= new
Customer($id_customer); return
$customer->firstname . ' '
. $customer->lastname; }}
Adding the controller to the back-office
In its current state, the module's controller will not appear automatically in the back-office interface: you have to add it yourself, manually.
This is done using the tool in the "Menus" pages, under the "Administration" menu. See the documentation for this page in the PrestaShop 1.5 User Guide.
Last updated