Está en la página 1de 24

Proyecto: Creacin de un mdulo para prestashop

Modelo de clases reutilizable para futuros mdulos

Creadopor:
LaurentRaulier 30dejuliode2008
Corregidopor: LudovicBodin
14deagosto,2008
Traduccin:
NoelLpez
5deseptiembre2008
Objetivodelproyecto:
Proporcionar una forma sencilla de crear nuevos mdulos para la solucin de
comercioelectrnicoPrestashopmediantelacreacindeun"patrndediseo"para
laestructuradeunmdulo.

Medios:

Elusodelasactualesclasesymtodosdeprestashop.
**ParaseguirestemanualesnecesariotenernocionesdeProgramacinorientadaaobjetos.

ndice
A.CreacindemduloPrestashop
..................................................................................................................................................
4

A.1rbolPrestashop

........................................................................................................................................

4
A.2Tiposdemdulos

.......................................................................................................................................

5
A.3Patrndediseo

.........................................................................................................................................

5
A.4Lastraduccionesdemdulos

.....................................................................................................................

6
A.5Elcdigodenuestromdulo

.....................................................................................................................

B.ElBackoffice
................................................................................................................................................
11

B.1Terminologa

............................................................................................................................................

11
B.2Losmdulos

.............................................................................................................................................

12

C.ElFrontoffice
................................................................................................................................................
15

C.1Presentacin

.............................................................................................................................................

15
C.2LaadicindeunmtododeFrontoffice

.................................................................................................

16
C.3Modificarlaposicin

...............................................................................................................................

19

D.Losmtodosgenricos
21
.................................................................................................................................................

D.1Generalidades

............................................................................................................................................

21
D.2Elusodeestosmtodos

...........................................................................................................................

22
D.3Casodeestudio

.........................................................................................................................................

22

A.CreacindemduloPrestashop
Prestashoptienelacapacidaddeincorporaranuevosmdulosalosyaexistentes.
LaorganizacindePrestashoppermitemodificartantolapartevisible(Frontend)comola
partedeadministracin(Backoffice).
Paraentendermejorcmoseestructuranlosmdulossepuedeobservarelrboldearchivos
quesepresentaacontinuacin:

A.1rbolPrestashop

Lapartequenosinteresaaques,porsupuesto,eldirectorio"mdulos".Enlafigurapueden
verse un rbol que contiene los mdulos incluidos por defecto en la instalacin de
Prestashop.
Estosmdulossedividenenvariostiposdemdulos,haymdulos'block'querepresentan
ensmismosuntipodeobjetoutilizableytambinhaymdulosms"Genricos".

A.2Tiposdemdulos

Todoslosmdulosestnorganizadosdelamismamanera,haciendoasmssencillocrear
unnuevomdulo.
Sepodrahablardeun"patrn"delosmdulosPrestashop.Yesteesrelativamentesimple.

A.3Patrndediseo
Vamosatomarcomoejemploelmduloprestashop/modules/blockcategories.

Todo mdulo incluye como mnimo un archivo <nombreMdulo>.php y otro


<nombreMdulo>.tpl.
EnnuestorejemplodeBlockcategorieselrboldedirectoriossera:
+Blockcategories
Blockcategories.php
Blockcategories.tpl
Conyadije,conestosdosarchivosessuficienteparacrearunnuevomdulo.

Eneldirectoriodeejemplo,sepuedeobservartambinlapresenciadeunarchivologo.gif
quevaasereliconoquesemuestreenlatablademdulosdeadministracin(Backoffice).

Encontramostambinotrosarchivos(scriptphp)representadosconabreviaturasdecdigos
depases:
es:Espaol
en:Ingls
fr.:Francs
d:Alemn
nl:Holands
..

A.4Lastraduccionesdemdulos
Los script php cuyo nombre est formado por las abreviaturas de cdigos de pases
contienenlastraduccionesdelmduloaesalengua.Enlasiguienteimagenpodemosveruna
capturadelarchivofr.phpdelmduloblockcategories.

Estosarchivossongeneradosusandolaherramientadetraduccindel"Backoffice",no
tienesporlotantoquepreocuparte...graciasPrestashop!.
Slolapartedelaizquierdaeslaquenosinteresaaqu,sonlasfrasesyexpresionesque
Prestashopseencargadetraducirporti.

Estoestansencillocomo:Enlosmdulosenquelasexpresionesdebentenerseencuentase
pasanalmtodoldelaclaseabstractaModule.php:
$this->description = $this->l('Adds a block featuring product
categories');
Estemtodoesunodelos"motores"paralainternacionalizacindetusitio.

Nospermitetraducirtodaslasexpresionesquesequieran,deunidiomaaotro,ydeesta
forma podemos reutilizar para cualquier idioma tanto los script php como las plantillas
Smarty.
Estosarchivosdeidiomas,paraserutilizadosenlastraducciones,debenencontrarseenel
directoriorazdelmdulo.Prestashopnolosencontrarsiseencuentranporejemploenlos
subdirectorios.
Latraduccinsehardelamismamaneraparaexpresiones,siempreencapsulandoenel
"Mtododetraduccin,"paralosarchivospresentesenelfrontoffice(razprestashop)yen
lasplantillas(templates)detemasprestashop(prestashopDemo/themes/prestashop).
Anivelprctico,lomejoresconstruirsumduloconunidiomade"referencia"yatravs
delBackofficeutilizarlaherramientade"traduccin"paraeditarotrosidiomasyguardar
susexpresionestraducidas.
Dependiendodelaeleccindeidiomaenelmenaccedersalasexpresionesatraducir.
Enlasplantillas,lasintaxisdelallamadaesunpocodiferente:

{l s = 'la expresin' mod = 'el mdulo'}


Sinoseponeelatributomod,laexpresinnosetraducircorrectamente.
Otros comentarios: utilizar slo las comillas simples, escapar de apstrofes con barra
invertida:\ydespusdecopiarypegarcuidadoconduplicarespacios"White"(blancos).
Aniveldelrboldedirectorios,siesnecesarioagregarclasesyfunciones"enlazadas"al
mdulo, por convenio crearemos un directorio (llamado "Class" por ejemplo) para
almacenarlas.

Dehecho,enelscriptbsicodelmdulosedebenincluirsololasfuncionesyconstructores
necesarios (su interfaz) y las funcionalidades que se desee aadir mejor en archivos
separados.

Paracrearnuestronuevomdulo,hacefaltaunmnimodecdigo(todoloqueannoseha
automatizado)paraindicarlainformacinrelativaaestemdulo(nombre,elquepartedel
administrador),comounaclase,unconstructorylosmtodos.

A.5Elcdigodenuestromdulo
NuestraclasemdulovaaheredardelaclaseModule(prestashop/clases/Module.php)y,
portanto,yatendrunaspocaspropiedadesymtodosdesdeelprincipio.

class BlockCategories extends Module


{
function __construct()
{
$this->name = 'blockcategories';
$this->tab = 'Blocks';
$this->version = 1.0
}
}
Elnombredelaclaseesladeldirectorioconunamayscula.LosdesarrolladoresPrestashop
utilizanunanotacinUpperCamelCasecomounaextensindelaclasemadre.
function __construct :
Elconstructordenuestraclasetendrlossiguientesatributos:
$this->name = 'blockcategories' :
Elatributonamecontieneelnombredenuestraclase.
$this->tab = 'Blocks'
"Asignacindeunvaloralapestaa(tab)"Esteatributocontiene"elvalorutilizadoenla
tablademdulosdegestinenlaadministracin(Backoffice);nuestromdulosemostrar
enelgrupodemdulosBlock(siponemoselvalordelejemplo).
$this->version = 1.0
laversion!
Larazdelcdigo.
$this->page = basename(__FILE__, '.php');
$this->displayName = $this->l('Categories block');
$this->description = $this->l('Adds a block featuring product
categories');
$this->page = basename(__FILE__, '.php');
Laasignacindelarutadelscript.
Comentario:lafuncinbasenameseparaelnombredelficheroyelnombredelacarpeta,
__FILE__contienelarutacompletayelnombredearchivo(desdePHP4.0.2,__FILE__
contienelarutaabsoluta)
$this->displayName = $this->l('Categories block');
El nombre queseutilizar enPrestashop.Utiliza el mtodo"l"delquehemoshablado
anteriormente,asquesertraducidoporPrestashop.
Si comienzas a escribir la informacin en Ingls (que es una buena cosa para la
internacionalizacindelmdulo),secontinuarenestaidiomanoesbuenoquesemezcle
Inglsconfrancsporejemplo,otodoquedarmuymezclado.

$this->description = $this->l('Adds a block featuring product


categories');
Unabrevedescripcindelmodulo,tambintraducido.
Yfinalmente
parent::__construct ();
Llamaalconstructordelaclasepadre.
Unpequeoejemplo:
Estructura:
+Mdulo
+Unmodule
unmodule.php
unmodule.tpl
Cdigounmodule.php:
<?php
class UnModule extends Module
{
function __construct()
{
$this->name = 'unmodule';
$this->tab = 'Divers';
$this->version = 1.0;
parent::__construct();
$this->page = basename(__FILE__, '.php');
$this->displayName = $this->l('Module block');
$this->description = $this->l('Adds a block featuring nothing');
}
function install()
{
if(parent::install() == false)
return false;
return true;
}
}
?>

Resultadosenlapartedeadministracin:
ElresultadodenuestrocdigoestarpresenteenlosmdulosyaccesibledesdeelBack
officeatravsdelapestaaMdulos

Si lo instalas no har nada ms que llamar al mtodo de instalar de la clase padre


Module.php,queregistrarlosdatosenlatablamoduledelabasededatos.

Aadiruniconoenelbackoffice:
Paraaadiruniconoalmdulodesdeel"Backoffice"simplementehayqueinsertaruna
imagende16x16eneldirectoriodelmdulonombrndolocomologo.gif.
Puedesencontrarmsde700miniiconosenwww.famfamfam.com/lab/icons/silk/

B.ElBackoffice
B.1Terminologa
Conelfindecomprendernosyhablardelasmismascosas,yaqueaveceslaterminologa
BackofficeyFrontofficeseconfundeenunsitiodecomercioelectrnico,vamosarealizar
unpequeorepasodetrminosquenuncavienemal:

Backoffice:literalmente"trastienda"loqueelclientenove,loqueelusuariodelsitiono
sabenisiquieraqueexiste.
Frontoffice:eslapartevisible,lainterfazdeusuario,porlaquesepuedeinteractuarcon
laempresa,laweb.
Diseo MVC: (modelovistacontrolador), basado en que cada una de las partes est
separada.

Ahoraquetenemosclaroslostrminospodemosentrarenla"Trastienda".

B.2Losmdulos
Lapartequenospreocupaenestemomentoesladelosmdulos

Parallegarhastaaqu(Backoffice),tienesqueidentificarte.Estodemuestraquetodoel
mundonopuedetocarlo!
Lo interesante es que podemos actuar en un mdulo y, por tanto, modificar algunos
parmetrosdeinformacindesdeelBackoffice.
Por lo tanto, desde el Back office ms que crear el mdulo lo personalizamos, as los
mdulossondeusomsflexibleycubrimosmayornmerodesituaciones.
Noestoyhablandodelcolordeunbotndecomandos,hablomsbiendeoportunidadesy
opcionesdisponiblesparaadministrarelsistema.
Enelmomentodelaconcepcindelmdulo,sueltaeltecladoyorganizatumduloantesde
escribirelcdigo

Piensa en si el mdulo ser accesible para el usuario (mdulo de prestacin de nuevas


funcionesparaelusuario)osloparaeladministrador(mdulodecontrolyadministracin).

Culessonlasfuncionesquevaahacer(elmtodo)?Qudatosdebotener(accesoala
basededatos,recuperacindedatosdesdeformularios)?Culdeberaserelresultadoala
salida?Qusalida?Ysitengoquemostrar,cmo?
Aquestunalista(noesexhaustiva)depreguntas.
Paraaccederalaconfiguracindelmdulo,sedebeaadirelsiguientemtodoanuestro
mdulo:
public function getContent ()
{
// Instruciones .
}
Este poco cdigo, aade en el Back office un enlace hacia la pgina de configuracin
asociada.

Sisesigueelenlace,lapginadestinoestarvacademomento.
TengaencuentaqueesinteresantepasarlosparmetrosporelmtodoGET:
/index.php?
tab=AdminModules&configure=unmodule&token=604ae5....etc
Porotrolado,paraqueunmdulose"aada"aunapartede"Frontoffice"deberreferirsea
un "gancho" (Hook) que debe existir en la tabla Prestashop del mismo nombre.
LastablasdeHookpresentesenPrestashopson:
1. payment
2. newOrder
3. paymentConfirm
4. paymentReturn
5. updateQuantity
6. rightColumn
7. leftColumn
8. home
9. header
10. cart
11. authentication
12. addproduct

13. updateproduct
14. top
15. extra
16. deleteproduct
17. productfooter
18. invoice
19.
updateOrderStatus
20. adminOrder
21. footer
22. PDFInvoice
23. adminCustomers

24.
orderConfirmation
25. createAccount
26.
customerAccount
27. orderSlip
28. productTab
29.
productTabContent
30. shoppingCart

Elnuevocdigoquedaraas:
class BlockUnModule extends Module
{
function __construct()
{
$this->name = 'blockunmodule';
$this->tab = 'Divers';
$this->version = 1.0;
parent::__construct();
$this->page = basename(__FILE__, '.php');
$this->displayName = $this->l('Module block');
$this->description = $this->l('Adds a block featuring
nothing');
}
function install()
{
if(parent::install() == false OR !$this>registerHook('leftColumn'))
return false;
return true;
}
public function getContent()
{
}
function hookLeftColumn($params)
{
global $smarty;
return $this->display(__FILE__, 'blockunmodule.tpl');
}
function hookRightColumn($params)
{
return $this->hookLeftColumn($params);
}
}
Unodelospuntosmsimportanteeslallamada,denuestromduloaciertaspartesdel
Frontoffice(enelcasodesernecesarioobviamente).
LasintaxisutilizadaesaqulaquelosusuariosdeZendFrameworkseguramenteconocen:la
concatenacindelhookyelnom_del_hook:hookLeftColumnyhookRightColumn.
Enestecaso,sisequiere"enganchar"unmdulo(suinterfazopartevisible)aladerecha,es
redirigidohacialacolumnadeizquierda...Nohacemossiempreloquequeremosenlavida!

VolveremosmstardeaestanocindelBackofficeydelainteraccinentremdulos,pero
en esta primera aproximacin a la concepcin de un nuevo mdulo de Prestashop, nos
quedaremosenloesencialyacontinuacinpasamosainteresarnosporcomomostrarel
Frontofficeyenelcdigodelfichero'blockunmodule.tpl'(lavista).

C.ElFrontoffice
C.1Presentacin
ComohemossealadoanteriormenteelFrontofficeeslapartevisibleporelusuariode
nuestrositiodecomercioelectrnico.

Lapginaestorganizadaendistintaspartes,tantoparalaorganizacindemduloscomo
paraeldiseoCSS.

Para comprender mejor esta estructura basta con abrir su "demoPrestashop " con su
navegadorfavorito("FireFox")yhabilitarfirebug...
Ps:firebugesunaextensindeFireFoxindispensableparacualquierdesarrolloweb.

Cuando enganches el mdulo gracias al mtodo HookLeftColumn desde su clase vas a


aadirsteal"div"identificadoporsu"id"left_column(unaetiquetadivcssesuntipode
bloque,esdecir,quepuedecontenerotroselementos).

NocreoqueseasolamenteunacoincidenciaquelosdesarrolladoresdePrestashopasociaron
bienestas2partesenelmomentodelaconcepcindelproyecto.
Simirasunpocomscercalacapturadepantallaeste"block"contieneelblockdelaclase
myaccount.
Es importante entender la forma en que estos mdulos estn organizados y su
relacinconlavistadelashojasdeestilocss.
Deberaestarfamiliarizadoconlashojasdeestilosinoesasunadireccin:alsacrations
(enfrancs)
Es hora de interesarse un poco ms por nuestro archivo que va a aadir un
preciososuperbloqueenlacolumnaizquierda.

Blockmonmodule.tpl

Seacualseaelnombrequeledes,indcaloenelmtodohookLeftColumnreturn$this>
display(__FILE__,'blockmonmodule.tpl),estosignificaquenuestroarchivo.tmpest
eneldirectorioactual.Sinembargo,puedesponerlodondequierasheindicarlaruta.
Ps: fijate bien en el nombre del .tpl ya que si copias el ejemplo debes cambiar
blockunmodule.tpl por blockmonmodule.tpl o bien crear el .tpl con el nombre
blockunmodule.tpl.

DeberamosabordaraqupartedeSmartyydecssaunqueestenoeselpropsitodeeste
tutorial.Asquevamosapasardepuntillasestaparteytendremosencuentasolamentelo
relacionadodirectamenteconlacreacindelmdulo.

C.2LaadicindeunmtododeFrontoffice
Siseprevquenuestromduloaadirfuncionalidadesparalosusuarios,hayqueagregar,
naturalmente,losmtodosquetenganencuentalasaccionesrealizadasporesteusuario.
Porlotanto,desdeelbloquepreviamenteaadi,sealamosunlugar(unanuevapgina)
queseencargardetratarestasaccionesdelosusuarios.
Ennuestroarchivo'blockmonmodule.tpl',aadiremos unenlaceaestanuevapgina.En
cuanto al estilo reutilizamos el de Prestashop, mediante la aplicacin de clases css ya
definidasenelarchivoglobal.css(Demo\prestashop\temas\prestashop\css\global.css).
<!-- Block unmodule -->
<div id="categories_block_left" class="block">
<h4>{l s='Block' mod='blockunmodule'}</h4>
<div class="block_content">
<ul>
<li><a href="modules/blockunmodule/classes/unmodule.function.php"
title="nouvelles fonctions utilisateurs">

{l s='Nouvelles fonctions' mod='blockunmodule'}


</a></li>
</ul>
</div>
</div>
<!-- /Block unmodule -->
Sihasseguidocorrectamenteeltutorialdesdeelcomienzo,deberstenerentuFrontoffice
unbonitobloqueconunenlaceanuestroscriptunmodule.function.phpqueseencontraren
nuestrorepertoriodeclasesdelmdulo.
Podramos ponerestefichero descript directamente conlosotrosficheros descriptdel
"Front", pero es mejor tenerlo en nuestro mdulo, para ser coherentes con nuestra
maneradehacerproyectosypoderinstalarlofcilmente.
Ps:unpequeodetalle"purista"respectodelcdigodenuestromdulodelacolumna
izquierda:
Noesnecesarioeinclusopuedeconsiderarsecomo"divites"utilizarunaetiqueta"div"que
contenga unaetiqueta "ul", dehecho,lasetiquetas' ulyaestnetiquetadas comoType
bloqueyesintil,porlotanto,elencapsularenundivsuperfluo.Lamejorsolucinsera
aplicarelestilodirectamentealul:
<ul class=block_content>
// vos listes ...
</ul>

Como ya dijimos el link Nouvelles fonctions apunta al script que contendr nuestras
funciones.
Para hacer una prueba, puedes aadir un " hello mis nuevas funciones " en el fichero
blockunmodule\classes\unmodule.function.php.
Unpocodecepcionanteelresultado,peroeselesperado,ypodemosobservarquenuestro
ficherophpfunciona.
Con carcter excepcional, hablaremos un poco de Smarty para poder hacer esta pgina
"Prestashop".

Smarty es la biblioteca que maneja la vista de nuestra aplicacin. En pocas palabras


Smartyanalizadeformadinmicalaspartesentrecorchetes{}paratransformarlasen
cdigohtmllegibleporelnavegador.


Bastaconaadirlasplantillasheader.tplyfooter.tpl(definidasporPrestashop)anuestro
fichero.phpparaqueestesecargueenlapginadePrestashop.
<?php
global $smarty;
include('../../../config/config.inc.php');
include('../../../header.php');
$smarty->display(dirname(__FILE__).'/unmodulefunction.tpl');
include('../../../footer.php');
?>
Ps:Sisefijalasrutasdellamadaalosficherossonabsolutas(../../../).
Estanoeslamejormaneradesolucionarlarutadeldirectoriodenuestraclase,seramejor
tenerun"macro"define().Prestashopyapensenesto:_PS_ROOT_DIR_
Hayque"importar"losvaloresdeestas"macro".
<?php
global $smarty;
include('../../../config/config.inc.php');
include(_PS_ROOT_DIR_.'/header.php');
$smarty->display(dirname(__FILE__).'/unmodulefunction.tpl');
include(_PS_ROOT_DIR_.'/footer.php');
?>
Sin embargo, los archivos invocados son archivos php! Esto es porque este archivo
header.phpdefinelaspropiedadesylosdatostransmitidosaSmarty.
Lainvocacinquesehacedesdeheader.php:
/* CSS */
$css_files[_THEME_CSS_DIR_.'global.css'] = 'all';
... etc
$smarty->assign(array(
'HOOK_HEADER' => Module::hookExec('header'),
'HOOK_LEFT_COLUMN' => Module::hookExec('leftColumn'),
'HOOK_TOP' => Module::hookExec('top'),
'static_token' => Tools::getToken(false),
'token' => Tools::getToken()
));
.... etc
$smarty->display(_PS_THEME_DIR_.'header.tpl');
Estoestamsclaroahora...no?Volveremosalasclasesabstractasmstarde.
Fjateenlasintaxis:'HOOK_HEADER'=>Module::hookExec(header')

Entuarchivounmodulefunction.tpl,debesaadirtucdigo,aadeporejemplo:
<h2>"Lasnuevascaractersticas</h2>",yrecargalapgina...
Esoestodoloquequeda,escribirnuestrosmtodosparaaadirfuncionalidadessiguiendo
losmismosprincipios:
o recuperarlosdatosparaserprocesados
o tratamientodeestosdatosatravsdenuestrasfunciones
o mostrarelresultadodeestostratamientos
ApartirdeaquentraenjuegotutalentocomoprogramadorPHP!

C.3Modificarlaposicin
Como nuestras nuevas funciones de usuario son ms importantes que otras, y la parte
inferiorizquierdadelapginanoeselmejorsitioparanuestromdulo,podemoshacera
nuestromdulodeprimeraclaseatravsdenuestroBackoffice:
BackOffice>>Modules>>Positions

podemosllevarloalaprimeraposicinporejemplo!

Loqueparanuestroegoesmuchomejor.

Esyaelmomentodeirunpocomsalcdigoyverdeterminadosmtodosyfuncionesde
Prestashopyapresentes,paraaccederanuestrabasededatosocualquierotrainformacin
tilparanuestrotratamiento.
C.4Importatuspropiosestilos
Aadeatuarchivo.tpllasiguientelnea:
<style type="text/css">@import
url({$base_dir}modules/unmodule/css/module.css);</style>
Creaundirectoriocsseneldirectoriodetumduloyaadirunarchivo.cssdeestetipo:
/* unmodule block */
#unmodule{

}
#unmodule_xxx{

D.Losmtodosgenricos
D.1Generalidades
No se trata de una lista exhaustiva de mtodos Prestashop para que puedas generar la
documentacinconPHPDocumentoroyendodirectamenteadocprestashop,sinomsbien
unrecordatoriodelasoportunidadesqueofreceestaclasedeherramientas.

Convienerevisarlosantesdeescribirunafuncinparacomprobarquenoestyapresentaen
PrestaShop.

Algunosejemplos:

Siesttrabajandodelladodel Backofficesindudanecesitarenalgnmomentoun
identificador;estesepasacomounargumentoGETenlaURL,algocomoesto:
token=604ae5e405da9eb32fc414a.
Laherramientasiempreda2mtodos:getTokenygetAdminToken
Puedeasociarlaherramienta:::getValueamenudo.
SiseutilizaunformularioyenvasdatosconlosmtodosGEToPOST,paracomprobar
siunvalorestpresente,puedeutilizarelmtodoisSubmit.

SitienesqueenviarunaSQL,pararecuperarlaconexin"Persistente"alabasededatos
desdelaclaseDbpuedeshacerlofcilmenteconelmtodogetInstance.
YluegoutilizarEjecutarparaenviarloamysql.

En muchos casos, ser til poder recuperar un valor de configuracin de la tabla


"configuracin".

Enlugardereescribirunafuncin,puedesusarConfiguration::get(nom_configaration).

Tienesquebasarteentuexperienciaybuscarlasfuncionesqueseadaptenati.
Parahaceresto,bastaconhacerunasencillaprueba
echo Configuration ::get('BLOCK_CATEG_MAX_DEPTH' );
Configuration::updateValue('BLOCK_CATEG_MAX_DEPTH',
intval($valeur));
echo Configuration ::get('BLOCK_CATEG_MAX_DEPTH' );
Vealoscambiosenlatablaconfiguration,yelefectoproducidosobreelsitio.
Prueba a editar un script y ver el cdigo y las observaciones formuladas por los
desarrolladoresdePrestashop.

Escribe sentencias SQLypruebalosmtodos dB(vaselafichadeclaseresumenDb.


Clase)...ymodificaelcdigoquenodejardetenererrores!

D.2Elusodeestosmtodos
Hesentidoquetehedejadounpocofrustradoalfinaldelcaptuloanterior,cuandotedej
conunapginaenblancoyunttulo<h2>.
Pero despus de esta breve presentacin de mtodos "genricos" (que yo mismo llamo
"utilidades"),podemoscrearelcdigodeunaaplicacinsimplequepermitaalosusuarios
ver la informacin sobre sus ltimas rdenes y si el cliente ha echo ms de 2 pedidos
ofrecerleunfotodeuncoche

D.3Casodeestudio
Loprimero,necesitamoselnombredelcliente;recuperarsunmerodeidentificacinde
cliente(enid_customerprestashop),elnmerodepedidosasociadosconestecliente,siel
nmerodepedidosesestrictamentesuperiora1ganuncoche
Estassonlas"funciones"aprogramar:
o Sielclienteestconectadorecuperarsuidentificadorsino,nosehacenada.
o PreparalaconsultaSQL.
o HacerlaconexinalabasededatosconDb:getInstanceyejecutarlaconsulta.
o Tratarlarespuesta(laclasificacinydeltratamiento).
o PreparalosdatosparapasaraSmarty
o Mostrarlarespuesta
Yatenemosnuestros2archivos:unmodulefunction.phpyunmodulefunction.tpl.

Elusuario llegar alapginadetratamientoatravsdelenlaceennuestromdulo;en


nuestroscriptactuaremosenfuncindesuestado:conectadoono
global $smarty;
include('../../../config/config.inc.php');
include(_PS_ROOT_DIR_.'/header.php');
// Le client est il connect ou non
// Si pas connect
if (!$cookie->isLogged())
{
// Donnes transmettre
$message = "pour profiter de tout nos avantages et connaitre les
derniers infos, merci de vous identifiez";
$smarty->assign('message',$message);
}
else

{
// Donnes transmettre
$message = "bonjour";
$smarty->assign('message',$message);
}
$smarty->display(dirname(__FILE__).'/unmodulefunction.tpl');
include(_PS_ROOT_DIR_.'/footer.php');
Ponapruebatucdigo...
Sielclienteestregistrado,esmejordarlelabienvenidamostrandosunombre,onombrey
apellido,elcasoeshacerlesaberqueestclaramenteidentificadoyquehasidoreconocido.
Losdatos estnenlabasededatos,ypodemosusarelIDpararecuperardatos quese
necesitan:
$customer = new Customer(intval($cookie->id_customer));
Nohaynadaparticular...

VamosapasarlainformacinquenecesitamosmostraranuestrogestordeSmarty;perono
sernecesariopasartodalainformacin.
Enunprimerpaso,ponemoslosvaloresquequeremosexcluirdelatabla:
$exclusion
=
array('secure_key',
'date_add','date_upd');

'old_passwd',

'active',

Esto es slo un ejemplo, por supuesto, adapta la tabla como necesites.


Vamosaconstruirnuestro"usuario"comoparmetroaSmartyteniendoencuentanuestras
excepciones(camposexcluidos).
$fields = $customer->getFields();
foreach ($fields AS $key => $value)
if (!in_array($key, $exclusion))
$customer -> {$key};
Denuevonadaespecial,fijateenlasintaxis:$customer>($Key);
Vamosahacerunapequeoinciso"tcnico".Unnombredevariableseponedelasiguiente
manera:
$nom = 123 ;//noesunnombrevlido
Utilizando:
$key -> {123} ;//'123'ser"permitido"comonombredevariable

Unasimpleprueba:
$nom = 123 ;
$$nom = 456 ;
echo ${123} ;//muestra'456'
Paraterminar:
$smarty->assign('customer',$customer);
Yenelcdigo.tpl:
{$message}, {$customer->firstname}
PreparemosahoranuestroSQL;recordarquenecesitamosseleccionarelnmerodecompra
yapasadopornuestroclienteidentificadoen$cookie>id_customer
$sql = "SELECT count( `id_order` )
FROM `orders`
JOIN `customer` ON `customer`.`id_customer` =`orders`.`id_customer`
WHERE `customer`.`id_customer` = $cookie->id_customer";
UtilizaremoslosmtodosdelaclaseabstractaDbparaejecutarnuestraQuero.Ytambien
comoargumentoparaSmarty
$reponse = Db::getInstance() -> ExecuteS($sql);
$smarty -> assign('commande',$nombre_commande[0]);
Ennuestroarchivo.tpl:
{$commande}
Comoeslgicoprobamoselresultadoantesdecontinuar.Todofuncionacomoestaba
previsto?
Proseguimos:Consultaenlatabladenuestroproyectoadiccindefuncionesdeusuario.
Loquesemuestraacontinuacineselresultadodeltratamiento:
Dependiendodesielresultadoesestrictamentemenosde1:mensajeusuario
Ysiesporencimade1:vistadelcocheganado+mensaje
EltratamientosepuedehacerenelscriptphpoenSmarty.
Espreferibletratarlosdatosenelscriptyenviarsloloestrictamentenecesarioalavista
paranomezclartodo.

switch($nombre_commande[0])
{
case 0 : {
$msg = "Aucune commande enregistre votre nom";
$img = _PS_IMG_."logo.jpg";
}
break;
case 1 : {
$msg = "Encore une commande pour gagner !";
$img = _PS_IMG_."logo.jpg";
}
break;
case 2 : {
$msg = "Bravo ! vous avez gagnez une voiture";
$img = _PS_IMG_."voiture.jpg";
}
break;
default : $msg = "non renseign"}
Bueno,afuerzadetransmitirvaloresasmarty,repitelamismasintaxis.
Acontinuacinseutilizaunamatrizdevalores:
$smarty -> assign(array('customer'=>$customer,
'message'=>$message,
'commande'=>$msg,
'image' =>$img));
Ynoolvidesaadirlasimgenesquequieresmostrar,enelejemploseencuentranendemo/
prestashop/imgperonadaesobligatorioytufuncindeusuarioesfuncional.
Acreartuspropiosmdulos
Ahhhselcochequesegana:

También podría gustarte