20.08.2015 Views

Ez publish 3.* Tutorial Introducción en el desarrollo de ... - eZ Projects

Ez publish 3.* Tutorial Introducción en el desarrollo de ... - eZ Projects

Ez publish 3.* Tutorial Introducción en el desarrollo de ... - eZ Projects

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Ez</strong> <strong>publish</strong> <strong>3.*</strong> <strong>Tutorial</strong>Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong>ext<strong>en</strong>siones <strong>en</strong> <strong>Ez</strong> PublishDipl.-Ing. F<strong>el</strong>ix Woldt (FH)f<strong>el</strong>ix_[at]_jac-systeme.<strong>de</strong>www.jac-systeme.<strong>de</strong>Estado Abril 2007


Cont<strong>en</strong>ido1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>eZ</strong> <strong>publish</strong> 31.1 Introducción.................................................................................................................................31.1.1 Lo que <strong>de</strong>bería conocer/saber hacer...........................................................................31.1.2 Qué se <strong>en</strong>seña.............................................................................................................31.2 Que son ext<strong>en</strong>siones........................................................................................................41.3 Nueva ext<strong>en</strong>sion mediante ejemplo <strong>de</strong> jacext<strong>en</strong>sion..................................51.3.1 Requisitos..................................................................................................................................5Implem<strong>en</strong>tar Ext<strong>en</strong>sion.......................................................................................................................61.3.2 Lista View..................................................................................................................................61.3.3 Activación Ext<strong>en</strong>sion.................................................................................................................81.3.4 Sistema <strong>de</strong> <strong>de</strong>rechos.................................................................................................................81.3.5 Sistema <strong>de</strong> plantillas................................................................................................................111.3.6 Creación view..........................................................................................................................151.3.7 GET / POST.............................................................................................................................171.3.8 Debug.......................................................................................................................................171.3.9 Acceso a base <strong>de</strong> datos...........................................................................................................201.3.10 Función Template Fetch.........................................................................................................271.3.11 Operador <strong>de</strong> plantillas.............................................................................................................291.3.12 Archivo INI..............................................................................................................................341.3.13 Crear ext<strong>en</strong>sion <strong>de</strong> ejemplo 'jacext<strong>en</strong>sion' & Sourceco<strong>de</strong> .....................................................351.4 Conclusión............................................................................................................................361.4.1 Enlaces <strong>en</strong> Internet...................................................................................................................361.4.2 Sobre <strong>el</strong> Autor...........................................................................................................................36


31 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong><strong>publish</strong>1.1 IntroducciónMuchos requisitos <strong>de</strong> un sistema <strong>de</strong> redacción se pued<strong>en</strong> cumplir con <strong>eZ</strong> Publish sinprogramación PHP.Pero tar<strong>de</strong> o temprano cualquier autor llega a un punto, <strong>en</strong> <strong>el</strong> que un proyecto requiererequisitos específicos y hay que implem<strong>en</strong>tar ext<strong>en</strong>siones (Ext<strong>en</strong>sions).Este artículo <strong>de</strong>berá ayudar <strong>en</strong> los principios <strong>de</strong> esta materia mediante un simple ejemplo.1.1.1 Que <strong>de</strong>bería conocer/saber hacer..._ Instalación <strong>de</strong> <strong>eZ</strong> <strong>publish</strong> y compr<strong>en</strong>sión g<strong>en</strong>eral <strong>de</strong> la estructura <strong>de</strong> <strong>eZ</strong> <strong>publish</strong>_ Conocimi<strong>en</strong>tos g<strong>en</strong>erales <strong>en</strong> PHP, SQL, MYSQL, HTML son <strong>de</strong> utilidad.1.1.2 Que se <strong>en</strong>señaEn éste articulo apr<strong>en</strong><strong>de</strong>rá como se crea una simple ext<strong>en</strong>sión y como se configura.A la vez se muestra como pue<strong>de</strong> ser utilizado <strong>el</strong> <strong>eZ</strong> Publish Framework <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong>.


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 41.2 Que son ext<strong>en</strong>sionesAntes <strong>de</strong> com<strong>en</strong>zar con <strong>el</strong> ejemplo, quería com<strong>en</strong>tar <strong>el</strong> concepto <strong>de</strong> ext<strong>en</strong>sion y <strong>en</strong>trar <strong>en</strong> <strong>el</strong><strong>de</strong>talle <strong>de</strong> la estructuración <strong>de</strong> ext<strong>en</strong>siones.Una ext<strong>en</strong>sion amplía la funcionalidad exist<strong>en</strong>te <strong>en</strong> <strong>eZ</strong> Publish, sin cambiar los datosoriginales. La separación <strong>de</strong> nuevas funcionalida<strong>de</strong>s <strong>en</strong> ext<strong>en</strong>siones ti<strong>en</strong>e la v<strong>en</strong>taja, queserán posibles actualizaciones posteriores a una nueva version <strong>de</strong> <strong>eZ</strong> Publish.Con ext<strong>en</strong>siones es posible por ejemplo:_ guardar <strong>el</strong> diseño <strong>de</strong> una pagina web / 'siteaccess' <strong>en</strong> una ext<strong>en</strong>sion,_ crear modulos propios con nuevos 'views' y plantillas 'fetch',_ ampliar <strong>el</strong> sistema <strong>de</strong> plantillas con propios operadores <strong>de</strong> plantillas,_ programar nuevos ev<strong>en</strong>tos Workflow, tipos <strong>de</strong> datos o Login Handler.Esto solo es una pequeña s<strong>el</strong>eccion <strong>de</strong> posibilida<strong>de</strong>s.Ext<strong>en</strong>sions <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> a m<strong>en</strong>udo ti<strong>en</strong><strong>en</strong> la misma estructura (ver Tabla 1).Ext<strong>en</strong>sion Subdirectorioactionsautoloadsdatatypes<strong>de</strong>signev<strong>en</strong>ttypesmodulessettingstranslationsDescripciónNueva acción para formulariosDefiniciones <strong>de</strong> nuevos operadores <strong>de</strong> plantillasDefinicion para nuevos tipos <strong>de</strong> dataArchivos (*.tpl, *.css, *.jpg, *.js ...) que ti<strong>en</strong><strong>en</strong>r<strong>el</strong>ación con <strong>el</strong> diseñoPropio <strong>de</strong>finidos ev<strong>en</strong>tos WorkflowUno o mas modulos con funciones Views, PlantillaFetch...Archivos <strong>de</strong> configuración (*.ini, *.ini.app<strong>en</strong>d.php)<strong>de</strong> la ext<strong>en</strong>sionArchivos <strong>de</strong> traducción (*.ts)Tabla 1: Posible estructura <strong>de</strong> directorio <strong>de</strong> una ext<strong>en</strong>sion <strong>eZ</strong> <strong>publish</strong> 3.x


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 5La estructura mostrada <strong>en</strong> la tabla 1 es solo un ejemplo y <strong>de</strong>p<strong>en</strong><strong>de</strong> d<strong>el</strong> tipo <strong>de</strong> la ext<strong>en</strong>sion.No siempre son necesarios todas las carpetas, por ejemplo <strong>en</strong> una ext<strong>en</strong>sion <strong>de</strong> operador<strong>de</strong> plantillas solo se necesita la carpeta autoloads y settings, <strong>en</strong> una ext<strong>en</strong>sion <strong>de</strong> modulosse necesitan las carpetas modules y settings y quizas <strong>de</strong>sign.1.3 Nueva ext<strong>en</strong>sion mediante ejemplo <strong>de</strong> jacext<strong>en</strong>sionEl ejemplo <strong>de</strong> la ext<strong>en</strong>sion jacext<strong>en</strong>sion <strong>de</strong>berá servir como <strong>en</strong>trada <strong>en</strong> los principios d<strong>el</strong><strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>eZ</strong> PublishSe mostrarán todos los pasos necesarios para la creación <strong>de</strong> una ext<strong>en</strong>sion y sepres<strong>en</strong>tarán las principales clases <strong>de</strong> PHP <strong>en</strong> <strong>eZ</strong> Publish Framework.Se tratarán los sigui<strong>en</strong>tes casos:_ Acceso a la base <strong>de</strong> datos (clase <strong>eZ</strong> Framework- <strong>eZ</strong>Persist<strong>en</strong>tObject)_ Acceso a archivos <strong>de</strong> configuración .ini (<strong>eZ</strong> Framwork – clase <strong>eZ</strong>INI)_ Acceso a variables GET, POST SESSION (clase <strong>eZ</strong> Framework - <strong>eZ</strong>HTTPTOOL)_ Creación <strong>de</strong> propios m<strong>en</strong>sajes Debug / Archivos Log (clase <strong>eZ</strong> Framework - <strong>eZ</strong>Debug)_ Uso d<strong>el</strong> sistema <strong>de</strong> <strong>de</strong>rechos para nuevos Views <strong>de</strong> un modulo_ Ampliación d<strong>el</strong> sistema <strong>de</strong> plantillas por propios funciones plantillas Fetch, es <strong>de</strong>ciroperadores1.3.1 RequisitosPara empezar con <strong>el</strong> ejemplo, <strong>eZ</strong> Publish <strong>de</strong>berá ser instalado correctam<strong>en</strong>te.Para <strong>el</strong>lo establecemos una Plain Site mediante <strong>el</strong> asist<strong>en</strong>te <strong>de</strong> <strong>eZ</strong> Publish,<strong>en</strong> modo Access URL, <strong>en</strong> la base <strong>de</strong> datos MySql ez39_plain (juego <strong>de</strong> caraceres utf-8).Asi se crean dos Siteaccess plain_site y plain_site_admin.Las sigui<strong>en</strong>tes URL´s <strong>de</strong>berán funcionar posteriorm<strong>en</strong>te:http://localhost/ez/in<strong>de</strong>x.php/plain_site (Vista <strong>de</strong> usuario)http://localhost/ez/in<strong>de</strong>x.php/plain_site_admin (Vista <strong>de</strong> administrador)asi localhost/ez/ remite directam<strong>en</strong>te al directorio <strong>de</strong> instalacion <strong>de</strong> <strong>eZ</strong> Publish.


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 6Implem<strong>en</strong>tar Ext<strong>en</strong>sionQueremos ahora crear una nueva ext<strong>en</strong>sion con <strong>el</strong> nombre jacext<strong>en</strong>sion y activar ésta.Ésta <strong>de</strong>be cont<strong>en</strong>er por <strong>el</strong> principio un modulo con <strong>el</strong> nombre modul1 con un View list queejecuta <strong>el</strong> script PHP list.php.Para <strong>el</strong>lo <strong>en</strong>tramos <strong>en</strong> la carpeta ext<strong>en</strong>sion <strong>de</strong> la carpeta root <strong>en</strong> <strong>eZ</strong> Publish y creamos unanueva carpeta jacext<strong>en</strong>sion con los sigui<strong>en</strong>tes subdirectorios y archivos PHP:<strong>Ez</strong>root/ ext<strong>en</strong>sion /+--jacext<strong>en</strong>sion+-- modules+-- modul1+-- list.php+-- module.php+--settings+--module.ini.app<strong>en</strong>d.phpCon <strong>el</strong> archivo <strong>de</strong> configuración module.ini.app<strong>en</strong>d.php (Listing 1) comunicamos al sistema<strong>eZ</strong> Publish, que <strong>de</strong>berá buscar por modulos <strong>en</strong> la ext<strong>en</strong>sion jacext<strong>en</strong>sion.Por consigui<strong>en</strong>te <strong>eZ</strong> Publish int<strong>en</strong>ta cargar todos los modulos como por ejemplo modul1, quese <strong>en</strong>cu<strong>en</strong>tran <strong>en</strong> <strong>el</strong> directorio ext<strong>en</strong>sion/jacext<strong>en</strong>sion/modules/Consejo: En <strong>en</strong>tradas INI t<strong>en</strong>er <strong>en</strong> cu<strong>en</strong>ta que no se <strong>en</strong>cu<strong>en</strong>tr<strong>en</strong> espacios libres al final <strong>de</strong>cada linea, ya que las variables no se interpretan correctam<strong>en</strong>te.1.3.2 View listEn module.php se <strong>de</strong>fin<strong>en</strong> todos los Views <strong>de</strong> un modulo ( ver listing 2).Mediante un view se pue<strong>de</strong> acce<strong>de</strong>r a un archivo PHP. En nuestro ejemplo <strong>de</strong>finimoscon $ViewList['list'] <strong>el</strong> nombre <strong>de</strong> la lista View y remitimos al archivo PHP list.php.


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 7Queremos transmitir al View tambi<strong>en</strong> unos parametros. Como ejemplar <strong>de</strong>finimos <strong>en</strong><strong>el</strong> archivo module.php dos parametros ParamOne y ParamTwo con 'params' =>array('ParamOne', 'ParamTwo') .La URL por consigui<strong>en</strong>te es:http://localhost/ez/in<strong>de</strong>x.php/plain_site/list/ValueParamOne/ValueParamTwo/.Posteriorm<strong>en</strong>te se pue<strong>de</strong> acce<strong>de</strong>r a las variables <strong>de</strong> list.php mediante <strong>el</strong> sigui<strong>en</strong>tecomando:$valueParamOne = $Params['ParamOne']; und $valueParamTwo =$Params['ParamTwo'].Esta pres<strong>en</strong>tacion <strong>de</strong> acceso <strong>de</strong> parametros se d<strong>en</strong>omina or<strong>de</strong>red parameters.A<strong>de</strong>mas exist<strong>en</strong> unor<strong>de</strong>red parameters. Éstos se ajustan a los or<strong>de</strong>red parameters yse compon<strong>en</strong> siempre <strong>de</strong> un Nombre-Valor-Pareja por ejemplo .....modul1/list/ValueParamOne/ValueParamTwo/ NombreParam3/ValueParam3/NombreParam4/ValueParam4 .La <strong>de</strong>finición es parecida a la <strong>de</strong> los or<strong>de</strong>red parameters <strong>en</strong> module.php con'unor<strong>de</strong>red_params' => array('param3' => '3Param', 'param4' =>'4Param').Si <strong>el</strong> comando View por ejemplo ti<strong>en</strong>e <strong>el</strong> valor .../parm4/141 <strong>en</strong> la URL <strong>en</strong>tonces <strong>eZ</strong>Publish reconoce que <strong>el</strong> parametro param4 ha sido fijado y po<strong>de</strong>mos leer <strong>el</strong> valor141 d<strong>el</strong> parametro Array d<strong>el</strong> Modulo mediante $Params['4Param']Los unor<strong>de</strong>red parameters se pued<strong>en</strong> cambiar <strong>de</strong> ord<strong>en</strong>. Si no se especifica ununor<strong>de</strong>red parameter , <strong>en</strong>tonces <strong>eZ</strong> Publish pone <strong>el</strong> valor a false.En comparacion a esto, los or<strong>de</strong>red parameters <strong>de</strong>berán especificarse, <strong>en</strong> casocontrario recib<strong>en</strong> <strong>el</strong> valor NULL (cero).Sigui<strong>en</strong>te comando URLhttp://localhost/ez/in<strong>de</strong>x.php/plain_site/modul1/list/table/5/param4/141/param3/131especificaría los parametros view <strong>de</strong> la sigui<strong>en</strong>te manera:$Params['ParamOne'] = 'table';$Params['ParamTwo'] = '5';$Params['3Param'] = '131';$Params['4Param'] = '141';


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 8Ver tambi<strong>en</strong> la docum<strong>en</strong>tación <strong>de</strong> <strong>eZ</strong> <strong>en</strong>http://ez.no/doc/ez_<strong>publish</strong>/technical_manual/3_8/concepts_and_basics/modules_and_views .Es usual crear un archivo PHP con <strong>el</strong> mismo nombre para cada View.Asi se pue<strong>de</strong> reconocer mediante un comando <strong>en</strong> la URL que archivo PHP se carga,por ejemplo:http://localhost/ez/in<strong>de</strong>x.php/plain_site/cont<strong>en</strong>t/view/full/2remite al archivo view.php <strong>en</strong> <strong>el</strong> modulo Kern<strong>el</strong> cont<strong>en</strong>t(ezroot/kern<strong>el</strong>/cont<strong>en</strong>t/view.php) .Consejo: Se pue<strong>de</strong> apr<strong>en</strong><strong>de</strong>r mucho <strong>de</strong> los modulos Kern<strong>el</strong> <strong>de</strong> <strong>eZ</strong>, asi esconv<strong>en</strong>i<strong>en</strong>te mirar <strong>el</strong> codigo fu<strong>en</strong>te <strong>de</strong> estos.La estructura es id<strong>en</strong>tica a un modulo <strong>de</strong> una ext<strong>en</strong>sion, como por ejemplo <strong>en</strong>nuestro ejemplo modul1.Para po<strong>de</strong>r visualizar la interpretación <strong>de</strong> la lista View <strong>en</strong> la pantalla, añadimos <strong>el</strong>comando echo <strong>en</strong> la list.php, la que interpreta los parametros <strong>en</strong> la pantalla (verlisting3).1.3.3 Activación <strong>de</strong> la ext<strong>en</strong>sionPara comprobar la nueva lista View d<strong>el</strong> modulo modul1 <strong>en</strong> la jacext<strong>en</strong>sion, <strong>de</strong>bemosactivar la ext<strong>en</strong>sion.Esto se realiza <strong>en</strong> la site.ini.app<strong>en</strong>d.php global (ver listing 4) o <strong>en</strong> lasite.ini.app<strong>en</strong>d.php d<strong>el</strong> Siteaccess correspondi<strong>en</strong>te (ver listing 4).A la vez la escritura se difer<strong>en</strong>cia por ActiveExt<strong>en</strong>sions[]y ActiveAccessExt<strong>en</strong>sions[].La activación global es consi<strong>de</strong>rado para todos los Siteaccess <strong>de</strong> la instalación <strong>de</strong><strong>eZ</strong> Publish. En nuestro ejemplo plain_site y plain_site_admin.1.3.4 Sistema <strong>de</strong> <strong>de</strong>rechosSi int<strong>en</strong>tamos ahora abrir la lista View d<strong>el</strong> modulo modul1 con la URLhttp://localhost/ez/in<strong>de</strong>x.php/plain_site/modul1/list/table/5/param4/141Recibimos <strong>el</strong> m<strong>en</strong>saje <strong>de</strong> <strong>eZ</strong> Pulish “acceso d<strong>en</strong>egado”. Porque? El usuario Anonymous noti<strong>en</strong>e los <strong>de</strong>rechos necesarios para abrir la lista View d<strong>el</strong> modulo modul1.


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 9Para establecer los <strong>de</strong>rechos necesarios hay dos posibilida<strong>de</strong>s.Primero po<strong>de</strong>mos establecer un acceso para todos los usuarios mediante la <strong>en</strong>tradaPolicyOmitList[]=modul1/list <strong>en</strong> <strong>el</strong> nuevo archivo <strong>de</strong> configuraciónext<strong>en</strong>sion/jacext<strong>en</strong>sion/settings/site.ini.app<strong>en</strong>d.php, (ver listing 6). O tambi<strong>en</strong> po<strong>de</strong>mosmanejar <strong>el</strong> acceso mediante <strong>el</strong> sistema <strong>de</strong> Usuarios <strong>en</strong> <strong>eZ</strong> Publish. Para <strong>el</strong>lo <strong>de</strong>bemoscambiar <strong>el</strong> pap<strong>el</strong> Anonymous para po<strong>de</strong>r permitir <strong>el</strong> acceso a las funciones d<strong>el</strong> modulomodul1. Esto se realiza mediante la URL:http://localhost/ez/in<strong>de</strong>x.php/plain_site_admin/role/view/1.Las funciones que pue<strong>de</strong> t<strong>en</strong>er un modulo <strong>de</strong> ext<strong>en</strong>sion esta <strong>de</strong>finido <strong>en</strong> module.phpmediante <strong>el</strong> Array $FunctionList.El vinculo se realiza mediante la <strong>de</strong>finición <strong>en</strong> la View con las funciones Arraykey.Asi vinculamos <strong>en</strong> nuestro ejemplo la lista View con la funcion <strong>de</strong> usuario read($FunctionList['read'] = array()) con 'functions' => array('read').Mediante $FunctionList es posible vincular Views individuales <strong>de</strong> un modulo con<strong>de</strong>terminados funciones <strong>de</strong> usuario.A la vez hay la función <strong>de</strong> usuario create, que está clasificado para todos los Views quecrean cont<strong>en</strong>idos.Acceso a éstos solo podremos dar por ejemplo a redactores.La funcion read vinculamos con todos los usuarios que <strong>de</strong>berán obt<strong>en</strong>er <strong>de</strong>rechos d<strong>el</strong>ectura, asi por ejemplo tambi<strong>en</strong> con <strong>el</strong> usuario Anonymous.Listing 1. Archivo <strong>de</strong> configuración Modulo:ext<strong>en</strong>sion/jacext<strong>en</strong>sion/settings/module.ini.app<strong>en</strong>d.phpListing 2. Archivo <strong>de</strong> configuración View:ext<strong>en</strong>sion/jacext<strong>en</strong>sion/modul1/module.php


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 10$ViewList['list'] = array( 'script' => 'list.php','functions' => array( 'read' ),'params' => array('ParamOne', 'ParamTwo'),'unor<strong>de</strong>red_params' =>array('param3' => '3Param', 'param4' => '4Param') );// Las <strong>en</strong>tradas <strong>en</strong> <strong>el</strong> pap<strong>el</strong> <strong>de</strong> usuario// se usan <strong>en</strong> la <strong>de</strong>finición View, para que <strong>en</strong> <strong>el</strong> pap<strong>el</strong> <strong>de</strong> usuario// se puedan repartir <strong>de</strong>rechos a propias funciones View$FunctionList = array();$FunctionList['read'] = array();?>Listing 3. Archivo <strong>de</strong> funcion <strong>de</strong> la lista View: ext<strong>en</strong>sion/jacext<strong>en</strong>sion/modul1/list.php


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 11Listing 4. Posibilidad 1 – Activación <strong>de</strong> ext<strong>en</strong>siones para todos los Siteaccessdisponibles <strong>en</strong> <strong>el</strong> archivo <strong>de</strong> configruación global:settings/overri<strong>de</strong>/site.ini.app<strong>en</strong>d.phpListing 5. Posibilidad 2 – Activación <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>el</strong> archivo <strong>de</strong> configuración <strong>de</strong> unSiteaccessPor ejemplo: settings/ siteacces/ plain_site/ site.ini.app<strong>en</strong>d.phpListing 6. Poner los <strong>de</strong>rechos <strong>de</strong> acceso a la lista View d<strong>el</strong> modulo modul1 paratodos los usuarios, <strong>en</strong> <strong>el</strong> archivo <strong>de</strong> configuración:ext<strong>en</strong>sion/jacext<strong>en</strong>sion/settings/site.ini.app<strong>en</strong>d.php1.3.5 Sistema <strong>de</strong> plantillasYa que <strong>el</strong> resultado d<strong>el</strong> comando echo d<strong>el</strong> script PHP list.php no nos satisface, queremosusar una plantilla propia. Para eso ponemos <strong>el</strong> archivo list.tpl <strong>en</strong> la carpetajacext<strong>en</strong>sion/<strong>de</strong>sign/standard/templates/modul1/list.tpl.Para que <strong>eZ</strong> Publish pueda <strong>en</strong>contrar <strong>de</strong>spues la plantilla, t<strong>en</strong>emos que <strong>de</strong>clarar laext<strong>en</strong>sion jacext<strong>en</strong>sion como ext<strong>en</strong>sion <strong>de</strong> diseño.Para eso creamos <strong>el</strong> archivo <strong>de</strong> configuración <strong>de</strong>sign.ini.app<strong>en</strong>d.php <strong>en</strong> la carpeta.../jacext<strong>en</strong>sion/settings/ (ver Listing 7).


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 12En list.php creamos una instancia <strong>de</strong> plantilla TemplateInstance $tpl =& templateInit();Luego ponemos <strong>el</strong> parametro View Array $viewParameters y <strong>el</strong> Array con los archivos <strong>de</strong>ejemplo $dataArray como variable <strong>de</strong> plantillas {$view_parameters}, es <strong>de</strong>cir {$data_array}con la instrucción $tpl->setVariable( 'view_parameters', $viewParameters ); y$tpl->setVariable( 'data_array', $dataArray );Despues utilizamos <strong>en</strong>contrar/reemplazar para la plantilla list.tpl con las variables <strong>de</strong>finidas.En nuestro caso solam<strong>en</strong>te $view_parameters y $dataArray y guardamos <strong>el</strong>resultado <strong>en</strong> $Result['cont<strong>en</strong>t'].En la plantilla principal <strong>de</strong> <strong>eZ</strong> Publish pag<strong>el</strong>ayout.tpl se pue<strong>de</strong> mostrar <strong>el</strong> resultadomediante la variable {$module_result.cont<strong>en</strong>t}, lo que se hace por estandar.Al final ponemos la ruta Modul1/list que ha <strong>de</strong> aparecer <strong>en</strong> <strong>el</strong> explorador (browser).En nuestro ejemplo se pue<strong>de</strong> hacer clic <strong>en</strong> la primera parte <strong>de</strong> la ruta, que <strong>en</strong>laza amodul1/list (ver listing 8).Ahora podremos acce<strong>de</strong>r a las variables <strong>de</strong>finidas <strong>en</strong> la plantilla list.tpl con{$view_parameters} y {$data_array}.Los parametros View transmitidos mostramos mediante{$view_parameters|attribute(show)}Despues comprobamos con <strong>el</strong> operador <strong>de</strong> plantillas (template operator)is_set($data_array) si la variable $data_array existe y emitimos una lista con losdatos o un m<strong>en</strong>saje estándar (ver listing 9).Si ahora abrimos nuestro View mediantehttp://localhost/ez/in<strong>de</strong>x.php/plain_site/modul1/list/table/5, no va a pasar mucho.Solo aparece la ruta Modul1/list. Porque? No lo sabemos.Para <strong>de</strong>scubrir <strong>el</strong> fallo, activamos <strong>eZ</strong> Debug incluido las plantillas usadas <strong>en</strong> estemom<strong>en</strong>to. El compilar y cachear <strong>de</strong> las plantillas lo <strong>de</strong>sactivamos para estar seguros<strong>de</strong> que se muestr<strong>en</strong> todos los cambios <strong>de</strong> las plantillas.Para eso expandimos la global ezroot/settings/overri<strong>de</strong>/site.ini.app<strong>en</strong>d.php con lassigui<strong>en</strong>tes <strong>en</strong>tradas (ver listing 10).Abrimos ahora.../modul1/list/table/5 <strong>de</strong> nuevo, <strong>de</strong>beria aparecer <strong>el</strong> m<strong>en</strong>saje <strong>de</strong> errorEn la vista Debug:'No template could be loa<strong>de</strong>d for "modul1/list.tpl" using resource"<strong>de</strong>sign"' .Supuestam<strong>en</strong>te no se <strong>en</strong>cu<strong>en</strong>tra <strong>el</strong> archivo list.tpl.


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 13En éste caso ayuda borrar <strong>el</strong> Cache <strong>de</strong> <strong>eZ</strong> Publish, ya que <strong>eZ</strong> ha cacheado la lista<strong>de</strong> las plantillas exist<strong>en</strong>tes.Para eso abrimos la URLhttp://localhost/ez/in<strong>de</strong>x.php/plain_site_admin/setup/cachey le damos al boton “borrar todo <strong>el</strong> cache”. Ahora se <strong>de</strong>bería mostrar la plantillalist.tpl con la vista <strong>de</strong> tablas, nuestros parametros view y nuestro ejemplo <strong>de</strong> lista <strong>de</strong>datos . A<strong>de</strong>mas <strong>de</strong>berá aparecer una <strong>en</strong>trada modul/list.tpl <strong>en</strong> la vista Debug'Templates used to r<strong>en</strong><strong>de</strong>r the page:'En nuestro ejemplo los parametros view ti<strong>en</strong><strong>en</strong> los sigui<strong>en</strong>tes valores$view_parameters. param_one = 'table ' y $view_parameters.param_one = '5' .Éstos se pued<strong>en</strong> usar <strong>en</strong> <strong>el</strong> script PHP list.php o <strong>en</strong> la plantilla list.tpl, para controlarestados por ejemplo como <strong>de</strong>be aparecer lo emitido o que ID se usa.Consejo: la variable <strong>de</strong> plantillas $view_parameters tambi<strong>en</strong> está disponible <strong>en</strong> <strong>el</strong>Modul Kern<strong>el</strong> cont<strong>en</strong>t <strong>de</strong> <strong>eZ</strong>, es <strong>de</strong>cir <strong>en</strong> la mayoría <strong>de</strong> plantillas como por ejemplono<strong>de</strong>/view/full.tpl.Listing 7. Declarar ext<strong>en</strong>sion jacext<strong>en</strong>sion como ext<strong>en</strong>sion <strong>de</strong> diseñoListing 8. modul1/list.php – Ampliación <strong>de</strong> Listing 3


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 14$viewParameters = array( 'param_one' => $valueParamOne,'param_two' => $valueParamTwo,'unor<strong>de</strong>red_param3' => $valueParam3,'unor<strong>de</strong>red_param4' => $valueParam4);// traspasar <strong>el</strong> parametro d<strong>el</strong> View como Array a la plantilla$tpl->setVariable( 'view_parameters', $viewParameters );// crear Array <strong>de</strong> ejemplo <strong>en</strong> la plantilla => {$data_array}$tpl->setVariable( 'data_array', $dataArray );...// usar buscar/reemplazar (pars<strong>en</strong>) <strong>en</strong> la plantilla y guardar <strong>el</strong> resultado para $module_result.cont<strong>en</strong>t$Result['cont<strong>en</strong>t'] =& $tpl->fetch( '<strong>de</strong>sign:modul1/list.tpl' );...?>Listing 9. <strong>eZ</strong> Plantilla <strong>de</strong>sign:modul/list.tpl{* list.tpl – Plantilla para Modulview .../modul1/list / ParamOne /ParamTwoComprobar si existe la variable $data_array- si: mostrar datos como lista- no: mostrar m<strong>en</strong>saje*}Mostrar Array $view_parameters:{$view_parameters|attribute(show)}Template: modul1/list.tpl{if is_set($data_array)}{foreach $data_array as $in<strong>de</strong>x => $item}{$in<strong>de</strong>x}: {$item}{/foreach}{<strong>el</strong>se}At<strong>en</strong>ción: no exist<strong>en</strong> datos!!{/if}


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 15Listing 10. Activar vista Debug con lista <strong>de</strong> plantillas mediante archivo <strong>de</strong>configuración global:ezroot/ settings/overri<strong>de</strong>/site.ini.app<strong>en</strong>d.php1.3.6 View createAhora ampliamos nuestro ejemplo con un nuevo View create.Queremos ahora guardar <strong>el</strong> Array con los datos <strong>de</strong> ejemplo <strong>en</strong> nuestra tabla <strong>de</strong> base <strong>de</strong>datos. Para eso creamos una nueva tabla <strong>de</strong> base <strong>de</strong> datos con <strong>el</strong> nombrejacext<strong>en</strong>sion_data <strong>en</strong> nuestra base <strong>de</strong> datos <strong>eZ</strong> ez39_plain con las columnasId | user_id | created | value, por ejemplo con PhpMyAdmin ( ver listing 11).Listing 11. Ejecutar <strong>el</strong> sigui<strong>en</strong>te comando SQL <strong>en</strong> nuestra base <strong>de</strong> datos <strong>eZ</strong>ez39_plain, para crear una nueva tabla jacext<strong>en</strong>sion_data.CREATE TABLE `jacext<strong>en</strong>sion_data` (`id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,`user_id` INT( 11 ) NOT NULL ,`created` INT( 11 ) NOT NULL ,`value` VARCHAR( 50 ) NOT NULL) ENGINE = MYISAM ;


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 16Después copiamos list.php hacía create.php, list.tpl hacia create.tpl y ampliamosmodule.php con un nuevo View y funcion <strong>de</strong> usuario create que <strong>en</strong>laza hacía <strong>el</strong> archivo PHPcreate.php.Luego cambiamos <strong>el</strong> llamami<strong>en</strong>to <strong>de</strong> plantillas <strong>en</strong> create.php a <strong>de</strong>sign:modul1/create.tply adaptamos los <strong>de</strong>rechos para la View modul1/create. Borrar <strong>el</strong> cache posteriorm<strong>en</strong>te.Ahora la llamada URL http://localhost/ez/in<strong>de</strong>x.php/plain_site/modul1/create <strong>de</strong>beríafuncionar (la misma vista que modul1/list solo sin parametros view).Para po<strong>de</strong>r guardar los nuevos datos <strong>en</strong> la base da datos MySql, necesitamos un formularioHTML que <strong>en</strong>vía los datos a nuestra nueva View create (mediante variables POST o GET)Para eso creamos un nuevo formulario <strong>en</strong> la plantilla create.tpl con una linea <strong>de</strong> texto name.En nuestro ejemplo queremos <strong>en</strong>viar los datos mediante GET.Asimismo insertamos una variable <strong>de</strong> plantillas {$status_message}Para que podamos mostrar al usuario un m<strong>en</strong>saje ( ver listing 12).Listing 12. Plantilla jacext<strong>en</strong>sion/<strong>de</strong>sign/standard/templates/modul1/create.tpl con unformulario para guar<strong>de</strong>r los nuevos datos{* create.tpl – plantilla para la Modulview .../modul1/createFormulario Html para guardar los nuevos datos *}Name:Status: {$status_message}


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 171.3.7 GET / POSTLuego cambiamos la list.php para que muestre la variable GET name, la que <strong>el</strong>formulario HTML transmite al script.Despues mostramos ésta <strong>en</strong> <strong>el</strong> campo <strong>de</strong> estado <strong>de</strong> la plantilla. Para mostrar lavariable GET / POST usamos <strong>el</strong> <strong>eZ</strong> Publish Framework con la clase <strong>eZ</strong>HTTPTool.Primero cojemos la instancia d<strong>el</strong> objeto <strong>de</strong> <strong>eZ</strong>HTTPTool con $http =&<strong>eZ</strong>HTTPTool::instance();Mediante $http->hasVariable('name'); po<strong>de</strong>mos <strong>de</strong>scubrir si la variable$_GET['name'] o $_POST['name'] exist<strong>en</strong> y mediante $http->variable('name'); lopo<strong>de</strong>mos mostrar.Si solo se quier<strong>en</strong> admitir variables GET o POST, se pue<strong>de</strong> hacer mediante $http->hasGETVariable('name'); o $http->hasPOSTVariable('name');Informacion acerca <strong>de</strong> funciones adicionales como por ejemplo acce<strong>de</strong>r a Sessions,se pue<strong>de</strong> leer <strong>en</strong> la docum<strong>en</strong>tación API <strong>de</strong> <strong>eZ</strong> Publish.Para la clase <strong>eZ</strong>HTTPTool se pue<strong>de</strong> <strong>en</strong>contrar <strong>en</strong> la URLhttp://pubsvn.ez.no/doxyg<strong>en</strong>/class<strong>eZ</strong>HTTPTool.html .1.3.8 DebugDespués ponemos nuestra variable <strong>de</strong> plantillas {$status_message} con los valoresd<strong>el</strong> formulario o con un texto estándar. Mediante <strong>eZ</strong>Debug::writeDebug()se pue<strong>de</strong> escribir <strong>el</strong> resultado o otro m<strong>en</strong>saje <strong>en</strong> la vista <strong>eZ</strong> Publish Debug y <strong>en</strong> <strong>el</strong>Archivo Log correspondi<strong>en</strong>te por ejemplo ezroot/var/log/<strong>de</strong>bug.logMás instrucciones acerca la muestra <strong>de</strong> información son por ejemplo writeError() owriteNotice().Se <strong>en</strong>cu<strong>en</strong>tra mas información <strong>en</strong> la docum<strong>en</strong>tación API <strong>en</strong>:http://pubsvn.ez.no/doxyg<strong>en</strong>/class<strong>eZ</strong>Debug.html .Si queremos escribir un archivo Log propio, lo po<strong>de</strong>mos hacer mediante<strong>eZ</strong>Log::write().Ésto a veces es útil, ya que los archivos Log por <strong>de</strong>fecto conti<strong>en</strong><strong>en</strong> informaciónvariada y pue<strong>de</strong> ser poco claro <strong>de</strong> leer (ver Listing 13).


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 18Listing 13. jacext<strong>en</strong>sion/module/modul1/create.php con ejemplos para mostrarvariables GET/POST y g<strong>en</strong>erar m<strong>en</strong>sajes Debug y archivos Log propios


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 19inclu<strong>de</strong>_once('lib/ezfile/classes/ezlog.php');<strong>eZ</strong>Log::write( $statusMessage, 'jacext<strong>en</strong>sion_modul1.log', 'var/log');$Result = array();// buscar/reemplazar plantilla y guardar resultado para $module_result.cont<strong>en</strong>t$Result['cont<strong>en</strong>t'] =& $tpl->fetch( '<strong>de</strong>sign:modul1/create.tpl' );// g<strong>en</strong>erar ruta Modul1/create$Result['path'] = array( array( 'url' => 'modul1/list','text' =>'Modul1' ),array( 'url' => false,'text' => 'create' ) );?>


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 201.3.9 Acceso a base <strong>de</strong> datosQueremos ahora volver a m<strong>en</strong>cionar la base <strong>de</strong> datos. Queremos guardar <strong>el</strong> valord<strong>el</strong> formulario <strong>en</strong> nuestra nueva tabla jacext<strong>en</strong>sion_data.Para esto <strong>en</strong> <strong>eZ</strong> Publish existe la clase <strong>eZ</strong>Persist<strong>en</strong>tObject. Ésta ya conti<strong>en</strong>e lasfunciones para crear, cambiar, <strong>el</strong>iminar o extraer datos.Para po<strong>de</strong>r usar esta funcionalidad creamos una nueva claseJACExt<strong>en</strong>stionDataÉsta la guardamos <strong>en</strong> la carpeta ezroot/ext<strong>en</strong>sion/jacext<strong>en</strong>sion/classes con <strong>el</strong>nombre jacext<strong>en</strong>siondata.php (ver Listing 14).La función mas importante es JACExt<strong>en</strong>stionData::<strong>de</strong>finition(). Aqui se <strong>de</strong>fine laestructura d<strong>el</strong> objeto <strong>de</strong>s JACExt<strong>en</strong>sionData y se <strong>de</strong>fine <strong>en</strong> que tabla y con quecolumnas <strong>de</strong> tablas se guardarán los datos.Despues creamos las funciones create(), fetchByID(),fetchList(), getListCount(). Se muestran tres difer<strong>en</strong>tes maneras <strong>en</strong> que los datos semostrarán ( <strong>eZ</strong>Persist<strong>en</strong>tObject::fetchObject(),<strong>eZ</strong>Persist<strong>en</strong>tObject::fetchObjectList(), comando SQL directo).Si es possible se <strong>de</strong>berían usar las funciones <strong>eZ</strong>Persist<strong>en</strong>tObject fetch. No se<strong>de</strong>berían usar <strong>en</strong>tradas SQL específicos para base <strong>de</strong> datos, para que los comandosSQL puedan funcionar con <strong>el</strong> sistema <strong>de</strong> base <strong>de</strong> datos <strong>eZ</strong> Publish, por ejemploMysql, Postgres, Oracle.(ver tambi<strong>en</strong> API http://pubsvn.ez.no/doxyg<strong>en</strong>/class<strong>eZ</strong>Persist<strong>en</strong>tObject.html )Posteriom<strong>en</strong>te usamos las funciones creadas <strong>en</strong> <strong>el</strong> script create.php. Para guardarnuevos datos, creamos un nuevo objeto d<strong>el</strong> tipo JACExt<strong>en</strong>sionData mediante lafunción JACExt<strong>en</strong>sionData::create($value) . La función create() crea <strong>el</strong> valuetransmitido ( valor d<strong>el</strong> formulario) , la user_id actual y la hora actual.Con la función store() guardamos ahora los datos <strong>en</strong> la tabla <strong>de</strong> base <strong>de</strong> datosjacext<strong>en</strong>sion_data. Para ver como han cambiado los datos, escribimos éstas <strong>en</strong> lavista Debug (ver Listing 15).


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 21Para acce<strong>de</strong>r a objetos d<strong>el</strong> tipo <strong>eZ</strong>Persit<strong>en</strong>tObjekt, usamos $JacDataObject->attribute('id'). El parametro <strong>de</strong> funcion “id” correspon<strong>de</strong> a la columna <strong>de</strong> tablas id.Asi no t<strong>en</strong>emos que p<strong>en</strong>sar mucho para acce<strong>de</strong>r a los distintos valores.De hecho esto vale para todos los datos que se guardan <strong>en</strong> <strong>eZ</strong> como por ejemploobjetos <strong>eZ</strong>Cont<strong>en</strong>tObject y <strong>eZ</strong>User.Listing 14. jacext<strong>en</strong>sion/classes/jacext<strong>en</strong>siondata.php ejemplo para <strong>el</strong> acceso a labase <strong>de</strong> datos mediante <strong>eZ</strong> Persist<strong>en</strong>tObjekt


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 22'required' => true ),'user_id' => array( 'name' => 'UserID','datatype' => 'integer','<strong>de</strong>fault' => 0,'required' => true ),'created' => array( 'name' => 'Created','datatype' => 'integer','<strong>de</strong>fault' => 0,'required' => true ),'value' => array( 'name' => 'Value','datatype' => 'string','<strong>de</strong>fault' => '','required' => true )),'keys'=> array( 'id' ),'function_attributes' => array( 'user_object' => 'getUserObject' ),'increm<strong>en</strong>t_key' => 'id','class_name' => 'JACExt<strong>en</strong>sionData','name' => 'jacext<strong>en</strong>sion_data' );}/*!Aqui ampliamos attribute() d<strong>el</strong> <strong>eZ</strong>Persist<strong>en</strong>tObject*/function &attribute( $attr ){if ( $attr == 'user_object' )return $this->getUserObject();<strong>el</strong>sereturn <strong>eZ</strong>Persist<strong>en</strong>tObject::attribute( $attr );}/*!Función <strong>de</strong> ayuda se abre <strong>en</strong> la función attribute*/function &getUserObject( $asObject = true )


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 23{$userID = $this->attribute('user_id');$user = <strong>eZ</strong>User::fetch($userID, $asObject);return $user;}/*!crea un nuevo objeto d<strong>el</strong> tipo JACExt<strong>en</strong>sionData y muestra éste*/function create( $user_id, $value ){$row = array( 'id' => null,'user_id' => $user_id,'value' => $value,'created' => time() );return new JACExt<strong>en</strong>sionData( $row );}/*!muestra los datos como JACExt<strong>en</strong>sionData con id dada*/function &fetchByID( $id , $asObject = true){$result = <strong>eZ</strong>Persist<strong>en</strong>tObject::fetchObject(JACExt<strong>en</strong>sionData::<strong>de</strong>finition(),null,array( 'id' => $id ),$asObject,null,null );


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 24if ( is_object($result) )return $result;<strong>el</strong>sereturn false;}/*!muestra todos los objetos JACExt<strong>en</strong>sionData como objeto o como array*/function &fetchList( $asObject = true ){$result = <strong>eZ</strong>Persist<strong>en</strong>tObject::fetchObjectList(JACExt<strong>en</strong>sionData::<strong>de</strong>finition(),null,null,null,null,$asObject,false,null );return $result;}/*!muestra la cantidad <strong>de</strong> datos*/function getListCount(){$db =& <strong>eZ</strong>DB::instance();$query = 'SELECT COUNT(id) AS count FROM jacext<strong>en</strong>sion_data';$rows = $db->arrayQuery( $query );return $rows[0]['count']}// -- member variables--//// \privatesectionvar $ID;var $UserID;var $Created;var $Value;}?>


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 25Listing 15. jacext<strong>en</strong>sion/modules/modul1/create.php Creación <strong>de</strong> una nueva <strong>en</strong>trada<strong>en</strong> la base <strong>de</strong> datos y difer<strong>en</strong>tes metodos para mostrarlos


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 26$userObject = $JacDataObject->attribute('user_object');$userName = $userObject->attribute('login');// mostrar <strong>de</strong> nuevo los datos$dataObject = JACExt<strong>en</strong>sionData::fetchByID($id);<strong>eZ</strong>Debug::writeDebug( '3.'.print_r( $dataObject, true ), 'JacDataObjectmostrado mediante función fetchByID()');// investigar la cantidad <strong>de</strong> datos exist<strong>en</strong>tes$count = JACExt<strong>en</strong>sionData::getListCount();$statusMessage = 'Nombre: >>'. $value .'>'.$userName.''.$id.'


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 271.3.10 Funcion plantilla Fetch (Template Fetch)Sabemos ahora transmitir parametros y variables GET / POST a una view y mostrarlos.Pero si queremos mostrar datos por ejemplo <strong>de</strong> nuestra tabla <strong>de</strong> base <strong>de</strong> datos <strong>en</strong> unaplantilla cualquiera <strong>de</strong> <strong>eZ</strong> Publish, no lo conseguiremos abri<strong>en</strong>do <strong>el</strong> View.Para ésto hay las funciones Fetch que conocemos d<strong>el</strong> modulo Kern<strong>el</strong> <strong>eZ</strong> por ejemplo .{fetch('cont<strong>en</strong>t', 'no<strong>de</strong>', hash( 'no<strong>de</strong>_id', 2 )}.Queremos <strong>de</strong>finir dos funciones Fetch, list y count, que <strong>de</strong>jan abrirse mediante <strong>el</strong> sigui<strong>en</strong>tesintax <strong>de</strong> plantillas.{fetch( 'modul1', 'list', hash( 'as_object' , true() ) )} und {fetch( 'modul1', 'count', hash())}.La función list muestra todas las <strong>en</strong>tradas <strong>de</strong> datos como Array o como objeto, y se <strong>de</strong>finecon <strong>el</strong> parametro propio <strong>de</strong>finido 'as_object'.La función count no ti<strong>en</strong>e parametro y investiga mediante un simple comando SQL lacantidad <strong>de</strong> datos <strong>en</strong> nuestra tabla <strong>de</strong> base <strong>de</strong> datos jacext<strong>en</strong>sion_data.La <strong>de</strong>finición <strong>de</strong> las funciones Fetch se realiza <strong>en</strong>jacext<strong>en</strong>sion/modules/modul1/function_<strong>de</strong>finition.php. Aqui se <strong>de</strong>fine que parametros setransmit<strong>en</strong> a que función PHP <strong>de</strong> una clase PHP <strong>de</strong>terminada ( ver Listing 16 ).En <strong>el</strong> archivo jacext<strong>en</strong>sion/modules/modul1/ezmodul1functioncollection.php se<strong>en</strong>cu<strong>en</strong>tra una clase <strong>de</strong> ayuda, que conti<strong>en</strong>e todas las funciones Fetch ( ver Listing17) .Consejo: En ...functioncollection.php <strong>de</strong> cada modulo se pued<strong>en</strong> leer los posiblesparametros para la parte hash() <strong>de</strong> una función Fetch.Asi por ejemplo se pue<strong>de</strong> investigar <strong>en</strong> <strong>el</strong> archivokern<strong>el</strong>/cont<strong>en</strong>t/ezcont<strong>en</strong>tfunctioncollection.php que parametros hay para la funcionFetch {fetch('cont<strong>en</strong>t', 'tree', hash( ... ) )} d<strong>el</strong> modulo Kern<strong>el</strong> cont<strong>en</strong>t <strong>de</strong> <strong>eZ</strong>.Esto ayuda a m<strong>en</strong>udo cuando la docum<strong>en</strong>tación <strong>de</strong> <strong>eZ</strong> Publish online estáincompleta.


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 28Listing 16. Definición <strong>de</strong> las funciones Fetch d<strong>el</strong> modulo modul1 -ext<strong>en</strong>sion/jacext<strong>en</strong>sion/modules/modul1/function_<strong>de</strong>fintion.php


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 29Listing 17. Clase <strong>de</strong> ayuda con funciones PHP que se usan <strong>en</strong> la <strong>de</strong>finición d<strong>el</strong>template Fetch <strong>en</strong> function_<strong>de</strong>fintion.php– ext<strong>en</strong>sion/jacext<strong>en</strong>sion/modules/modul1/ezmodul1functioncollection.php1.3.11 Template OperatorOtra manera <strong>de</strong> acce<strong>de</strong>r a funciones <strong>en</strong> una propia ext<strong>en</strong>sión es usar operadores <strong>de</strong>plantillas ( template operators )<strong>eZ</strong> Publish ya conti<strong>en</strong>e una multitud <strong>de</strong> operadores <strong>de</strong> plantillas.Seguidam<strong>en</strong>te <strong>de</strong>finimos un nuevo operador <strong>de</strong> plantillas con <strong>el</strong> nombre ( $result_type ) conun parametro result_type.Mediante <strong>el</strong> parametro queremos controlar si se muestran todos los datos <strong>de</strong> nuestra tabla<strong>de</strong> base <strong>de</strong> datos o solo la cantidad. El comando <strong>de</strong> plantillas {jac('list')}Muestra un array <strong>de</strong> datos y {jac('count')} la cantidad <strong>de</strong> los datos.En nuestro ejemplo se usan las mismas funciones que <strong>en</strong> <strong>el</strong> Template Fetch fetch('modul1','list' , ...) und fetch( 'modul1', 'count', ... )


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 30La <strong>de</strong>finición <strong>de</strong> los operadores <strong>de</strong> plantillas disponibles <strong>en</strong> nuestra ext<strong>en</strong>sión jacext<strong>en</strong>sionse realiza <strong>en</strong> <strong>el</strong> archivo ext<strong>en</strong>sion/jacext<strong>en</strong>sion/autoloads/ eztemplateautoload.php (verListing 18).Lo que hace <strong>el</strong> operador <strong>de</strong> plantillas se <strong>de</strong>fine <strong>en</strong> una propia clase PHP. En nuestro caso<strong>en</strong> JACOperator d<strong>el</strong> archivo ext<strong>en</strong>sion/jacext<strong>en</strong>sion/autoloads/ jacoperator.php (verListing 19).Para que <strong>eZ</strong> Publish sepa que nuestra ext<strong>en</strong>sión jacext<strong>en</strong>sion conti<strong>en</strong>e operadores<strong>de</strong> plantillas, t<strong>en</strong>emos que comunicarlo <strong>en</strong> <strong>el</strong> archivo <strong>de</strong> configuraciónext<strong>en</strong>sion/jacext<strong>en</strong>sion/settings/site.ini.app<strong>en</strong>d.php <strong>eZ</strong> <strong>publish</strong> medianteExt<strong>en</strong>sionAutoloadPath[]=jacext<strong>en</strong>sion (ver Listing 20).Para comprobar nuestras funciones Template Fetch fetch('modul1', 'list',hash('as_object',true() )) y fetch( 'modul1', 'count', hash() ) d<strong>el</strong> operador <strong>de</strong> plantillas jac('list') ojac('count') ampliamos la plantilla list.tpl <strong>de</strong> la lista View ( ver Listing 21)Abri<strong>en</strong>do <strong>el</strong> View por ejemplo abri<strong>en</strong>do la URLhttp://localhost/ez/in<strong>de</strong>x.php/plain_site/modul1/list/tableblue/1234Se <strong>de</strong>berían mostrar aparte d<strong>el</strong> ejemplo Array $data_array, los datos <strong>de</strong> la tabla <strong>de</strong>base <strong>de</strong> datos jacext<strong>en</strong>sion_data dos veces, por una vez mediante los operadores<strong>de</strong> plantillas y por otra parte <strong>de</strong> las funciones Template Fetch .Asi que hay varias posibilida<strong>de</strong>s <strong>de</strong> acce<strong>de</strong>r a las mismas funciones <strong>de</strong> la propiaext<strong>en</strong>sion <strong>en</strong> una plantilla.Listing 18. ext<strong>en</strong>sion/jacext<strong>en</strong>sion/autoloads/eztemplateautoload.php


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 31Listing 19. ext<strong>en</strong>sion/jacext<strong>en</strong>sion/autoloads/jacoperator.php


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 32'required' => true,'<strong>de</strong>fault' => 'list' )) );}/*!Dep<strong>en</strong>di<strong>en</strong>do <strong>de</strong> los parametros que se transmitieron fetch objetos JACExt<strong>en</strong>sionData{jac('list)} o contar datos {jac('count')}*/function modify( &$tpl, &$operatorName, &$operatorParameters,&$rootNamespace, &$curr<strong>en</strong>tNamespace, &$operatorValue,&$namedParameters){inclu<strong>de</strong>_once('ext<strong>en</strong>sion/jacext<strong>en</strong>sion/classes/jacext<strong>en</strong>siondata.php');$result_type = $namedParameters['result_type'];if( $result_type == 'list')$operatorValue = JACExt<strong>en</strong>sionData::fetchList(true);<strong>el</strong>seif( $result_type == 'count')$operatorValue = JACExt<strong>en</strong>sionData::getListCount();}};?>Listing 20. ext<strong>en</strong>sion/jacext<strong>en</strong>sion/settings/site.ini.app<strong>en</strong>d.phpListing 21. Comprobación <strong>de</strong> las funciones Template Fetch propias <strong>de</strong>finidas y d<strong>el</strong>operador <strong>de</strong> plantllas -ext<strong>en</strong>sion/jacext<strong>en</strong>sion/<strong>de</strong>sign/standard/templates/modul1/list.tplTemplate Operator: jac('count') und jac('list')Count: {jac( 'count' )}


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 33Lista: {jac( 'list' )|attribute(show)}Funciones Template Fetch:fetch('modul1','count', hash() yfetch('modul1','list', hash( 'as_object', true()) )Count: {fetch( 'modul1', 'count', hash() )} Lista: {fetch( 'modul1', 'list', hash( 'as_object', true()))|attribute(show)}


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 341.3.12 Archivo INIPara terminar queremos crear un propio archivo .iniext<strong>en</strong>sion/jacext<strong>en</strong>sion/settings/jacext<strong>en</strong>sion.ini. En ésta ponemos todos los valores quehemos introducido <strong>en</strong> plantillas o modulos y valores que puedan variar <strong>en</strong> difer<strong>en</strong>tesinstalaciones <strong>de</strong> <strong>eZ</strong> Publish por ejemplo si se <strong>de</strong>b<strong>en</strong> mostrar m<strong>en</strong>sajes Debug especiales.La <strong>de</strong>fault .ini se pue<strong>de</strong> sobreescribir con los archivos jacext<strong>en</strong>sion.ini.app<strong>en</strong>d.php, porejemplo <strong>en</strong> <strong>el</strong> Siteaccess.El Listing 22 es un ejemplo para un archivo .ini y Listing 23 muestra como se acce<strong>de</strong>mediante PHP. Ampliamos list.php para comprobar <strong>el</strong> acceso.Las <strong>de</strong>más funciones para <strong>el</strong> acceso a archivo INI se pued<strong>en</strong> consultar <strong>en</strong> API:http://pubsvn.ez.no/doxyg<strong>en</strong>/class<strong>eZ</strong>INI.html.Imag<strong>en</strong> 1 muestra <strong>de</strong> nuevo la estructura <strong>de</strong> nuestro ejemplo jacext<strong>en</strong>sion.Listing 22. Archivo <strong>de</strong> configuración <strong>de</strong> la ext<strong>en</strong>sión jacext<strong>en</strong>sion –ext<strong>en</strong>sion/jacext<strong>en</strong>sion/settings/jacext<strong>en</strong>sion.ini[JACExt<strong>en</strong>sionSettings]# Should Debug <strong>en</strong>abled / disabledJacDebug=<strong>en</strong>abledListing 23. Acceso PHP a archivos INI jacext<strong>en</strong>sion.ini –ext<strong>en</strong>sion/jacext<strong>en</strong>sion/modules/modul1/list.php...// leer variable JacDebug d<strong>el</strong> bloque INI [JACExt<strong>en</strong>sionSettings]// d<strong>el</strong> archivo INI jacext<strong>en</strong>sion.iniinclu<strong>de</strong>_once( "lib/ezutils/classes/ezini.php" );$jacext<strong>en</strong>sionINI =& <strong>eZ</strong>INI::instance( 'jacext<strong>en</strong>sion.ini' );$jacDebug = $jacext<strong>en</strong>sionINI->variable('JACExt<strong>en</strong>sionSettings','JacDebug');// Si Debug está activado haz algoif( $jacDebug === '<strong>en</strong>abled' )echo 'jacext<strong>en</strong>sion.ini: [JACExt<strong>en</strong>sionSetting] JacDebug=<strong>en</strong>abled'; ...


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 351.3.13 Estructura <strong>de</strong> ext<strong>en</strong>sion <strong>de</strong> ejemplo 'jacext<strong>en</strong>sion' & Sourceco<strong>de</strong>Imag<strong>en</strong> 1: Estructura <strong>de</strong> la ext<strong>en</strong>sión <strong>de</strong> ejemplo jacext<strong>en</strong>sionEl Sourceco<strong>de</strong> (codigo fu<strong>en</strong>te) d<strong>el</strong> <strong>Tutorial</strong> se pue<strong>de</strong> <strong>de</strong>scargar <strong>en</strong> internet <strong>en</strong> la dirección:http://ez.no/community/contribs/examples/jacext<strong>en</strong>sion


1 Introducción <strong>en</strong> <strong>el</strong> <strong><strong>de</strong>sarrollo</strong> <strong>de</strong> ext<strong>en</strong>siones <strong>en</strong> <strong>eZ</strong> <strong>publish</strong> 361.4 ConclusiónMediante un simple ejemplo <strong>de</strong> jacext<strong>en</strong>sion hemos apr<strong>en</strong>dido las técnicas difer<strong>en</strong>tes útilespara la creación <strong>de</strong> ext<strong>en</strong>siones.Aparte <strong>de</strong> crear propios modulos con difer<strong>en</strong>tes Views y parametros Views, funcionesTemplate Fetch, Operador <strong>de</strong> plantillas y <strong>el</strong> uso d<strong>el</strong> sistema <strong>de</strong> <strong>de</strong>rechos <strong>de</strong> <strong>eZ</strong> Publishsabemos ahora como escribir propios m<strong>en</strong>sajes <strong>en</strong> la vista Debug o <strong>en</strong> archivos Log.Se ha m<strong>en</strong>cionado como se acce<strong>de</strong> a archivos INI.Con éste conocimi<strong>en</strong>to básico <strong>de</strong>bería ser posible ahora crear propias ext<strong>en</strong>siones.1.4.1 Enlaces em Internet_ http://www.ez<strong>publish</strong>.<strong>de</strong>/ – Comunidad Alemana <strong>eZ</strong>_ http://www.ez.no/community - Comunidad International <strong>eZ</strong>_ http://pubsvn.ez.no/doxyg<strong>en</strong>/in<strong>de</strong>x.htm l – Docum<strong>en</strong>tación <strong>eZ</strong> API_ http://ez.no/doc/ez_<strong>publish</strong>/technical_manual/3_8/refer<strong>en</strong>ce – <strong>eZ</strong> docum<strong>en</strong>tación <strong>de</strong>refer<strong>en</strong>cia_ http://ez.no/community/contribs/docum<strong>en</strong>tation/jac_dokum<strong>en</strong>tation_in_german_ez_<strong>publish</strong>_basics_ext<strong>en</strong>sion_<strong>de</strong>v<strong>el</strong>opm<strong>en</strong>t – PDF <strong>eZ</strong> <strong>publish</strong> principios <strong>en</strong> prorgamación <strong>de</strong> modulos(<strong>en</strong> alemán)1.4.2 Sobre <strong>el</strong> AutorF<strong>el</strong>ix Woldt ha estudiado informática <strong>en</strong> la FH-Stralsund. Durante la carrera (<strong>de</strong>s<strong>de</strong> 2002) ysu diploma (2004) se ha r<strong>el</strong>acionado con <strong>eZ</strong> <strong>publish</strong> y la programación <strong>de</strong> ext<strong>en</strong>siones.F<strong>el</strong>ix es miembro activo <strong>de</strong> la comunidad alemana <strong>de</strong> <strong>eZ</strong> <strong>publish</strong>http://ez<strong>publish</strong>.<strong>de</strong> y empleado <strong>en</strong> <strong>eZ</strong> Partner JAC Systeme http://www.jac-systeme.<strong>de</strong>

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!