Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Manual Modulos Caste Llano PDF
Manual Modulos Caste Llano PDF
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.
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:
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.
Resultadosenlapartedeadministracin:
ElresultadodenuestrocdigoestarpresenteenlosmdulosyaccesibledesdeelBack
officeatravsdelapestaaMdulos
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
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.
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">
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".
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.
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.
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.
{
// 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',
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: