Delphi para PHP “en acción”

48
Corporate Headquarters EMEA Headquarters Asia-Pacific Headquarters 100 California Street, 12th Floor San Francisco, California 94111 York House 18 York Road Maidenhead, Berkshire SL6 1SF, United Kingdom L7. 313 La Trobe Street Melbourne VIC 3000 Australia Documento Técnico Delphi para PHP “en acción” José León, qadram software S.L. Diciembre 2009

description

José León, qadram software S.L., PHP es un lenguaje de programación interpretado, cuyo propósito inicial era facilitar lacreación de páginas web dinámicas. Se utiliza principalmente en el desarrollo deaplicaciones web, siendo ejecutado en el lado del servidor, aunque actualmente haevolucionado hasta poder ser utilizado como lenguaje de scripting de propósitogeneral e incluso, para la creación de aplicaciones de escritorio.

Transcript of Delphi para PHP “en acción”

Page 1: Delphi para PHP “en acción”

Corporate Headquarters EMEA Headquarters Asia-Pacific Headquarters 100 California Street, 12th Floor San Francisco, California 94111

York House 18 York Road Maidenhead, Berkshire SL6 1SF, United Kingdom

L7. 313 La Trobe Street Melbourne VIC 3000 Australia

Documento Técnico

Delphi para PHP “en acción” José León, qadram software S.L. Diciembre 2009

Page 2: Delphi para PHP “en acción”

SUMARIO PHP es un lenguaje de programación interpretado, cuyo propósito inicial era facilitar la creación de páginas web dinámicas. Se utiliza principalmente en el desarrollo de aplicaciones web, siendo ejecutado en el lado del servidor, aunque actualmente ha evolucionado hasta poder ser utilizado como lenguaje de scripting de propósito general e incluso, para la creación de aplicaciones de escritorio. Entre sus características, destaca la multiplataforma, es decir, los scripts PHP pueden ser interpretados en multitud de sistemas operativos y entornos, lo que aporta una gran versatilidad. Otra de sus características principales, son las extensiones, que proporcionan funciones al lenguaje, enriqueciendo las aplicaciones de forma muy sencilla. Su sintaxis es muy similar a C, con algunos toques de Perl, y debido a esto, su curva de aprendizaje es muy pequeña. No requiere la definición de tipos de variables, aunque sí se puede saber el tipo de una variable en un determinado momento. Delphi para PHP supone una auténtica revolución en el panorama del desarrollo de aplicaciones PHP, ya que proporciona un entorno de desarrollo visual completamente integrado, y, lo más importante, una librería de clases orientada a componentes, que facilita enormemente el desarrollo de interfaces. Delphi para PHP representa la opción más sencilla para los programadores en Delphi para Windows a la hora de aprender a crear aplicaciones web, ya que les proporciona el mismo IDE, y una librería de clases visual que ha sido modelada utilizando VCL para Windows como base. Este documento le presenta todas las características del producto que debe tener en cuenta si está pensando desarrollar aplicaciones web en PHP, o si ya lo hace, le explica las mejoras de productividad puede conseguir.

Page 3: Delphi para PHP “en acción”

UN RECORRIDO POR EL IDE VENTANA PRINCIPAL La ventana principal acoge todos los elementos que Delphi para PHP proporciona para el desarrollo de aplicaciones. Cuando el IDE arranca por primera vez, vemos en el centro la página de bienvenida, que muestra los proyectos recientes, noticias, enlaces a recursos, etc. En la parte izquierda podemos ver el panel de estructura y el inspector de objetos, y en la parte derecha, el gestor de proyectos, explorador de datos y paleta de herramientas. El interfaz está compuesto de ventanas empotrables que le permiten configurar el entorno de desarrollo para que se ajuste a su forma de trabajar. Para mover una herramienta de un sitio a otro, simplemente haga clic sobre ella y arrástrela hasta su localización definitiva. Las ventanas de herramienta también pueden estas agrupadas en pestañas, de forma que compartan una misma zona de trabajo. Estas configuraciones se pueden guardar utilizando la barra de herramientas de la zona superior, y el desplegable también le permite cambiar la configuración activa.

Page 4: Delphi para PHP “en acción”

PÁGINA DE BIENVENIDA Al iniciar el IDE, se muestra esta página, que puede utilizar para abrir un proyecto o archivo reciente, leer las últimas noticias relacionadas con Delphi para PHP, acceder a notas de la versión, al documento de instalación y le presenta enlaces con más información en la web. También dispone de cuatro botones en la parte superior que le permiten crear nuevos elementos, como proyectos o componentes, abrir proyectos y archivos e incluso, acceder a la ayuda. A todos los efectos, esta página es un explorador web, por lo que puede utilizarlo para navegar por internet.

Page 5: Delphi para PHP “en acción”

ESTRUCTURA Este panel muestra la estructura del elemento que se esté editando actualmente en la zona de contenido. Por ejemplo, si está editando código PHP, este panel mostrará una representación jerarquizada del contenido de su código fuente. Sin embargo, si está editando un formulario visual, este panel mostrará una vista jerárquica de los componentes que contiene dicho formulario. Dependiendo de la vista activa puede realizar diferentes acciones. Si está mostrando la estructura de un código fuente, haciendo doble clic en cualquier elemento, el editor se posicionará en la declaración del elemento pulsado. Si está mostrando la estructura de un formulario, doble clic no hará nada, pero puede arrastrar y soltar elementos dentro de otros, para insertar un control dentro de otro.

Page 6: Delphi para PHP “en acción”

INSPECTOR DE OBJETOS El inspector de objetos muestra las propiedades y eventos del objeto seleccionado en el diseñador, tanto su nombre, como su valor. Y también le permite cambiar dicho valor o asignar un evento. Dependiendo del tipo de elemento que esté seleccionado, las pestañas disponibles de información cambian, por ejemplo, si es un componente VCL para PHP, se mostrarán Propiedades, Eventos y Javascript, pero si es un componente HTML, se mostrará solo Propiedades, ya que el resto de pestañas no tienen sentido para ese elemento. Es importante destacar que las propiedades cuyo valor difiera del valor por defecto, se muestran en negrita. También indicar que las propiedades que hacen referencia a otro componente se muestran en rojo y que, si se les asigna un valor, se pueden desplegar para cambiar directamente los valores de dicha referencia. Puede utilizar el Inspector de Objetos para la edición de propiedades complejas, como por ejemplo Font, de forma que se pueden establecer propiedades anidadas como Align o Size de independientemente. A la hora de editar una propiedad, dependiendo del tipo de propiedad y el editor asignado, se muestra un tipo de editor, puede ser texto normal, una lista de valores o un editor personalizado.

Page 7: Delphi para PHP “en acción”

GESTOR DE PROYECTOS Puede utilizar esta herramienta para agrupar los archivos de su aplicación en proyectos, y estos, a su vez, ser agrupados en grupos de proyectos. En cualquier caso, la creación de un proyecto no es necesaria para la utilización de Delphi para PHP, ya que se puede trabajar perfectamente en archivos independientes. Sin embargo, hay herramientas, como el asistente de internacionalización o el de despliegue, que son más útiles cuando se trabaja con un proyecto, ya que necesitan saber todos los archivos que componen una aplicación. Cualquier archivo puede formar parte de un proyecto, incluyendo sus plantillas HTML o las hojas de estilo CSS. Para añadir un proyecto nuevo a un grupo de proyectos, utilice el botón “Nuevo” de la barra de herramientas, también puede añadir un proyecto existente al grupo de proyectos actual utilizando el comando Proyecto | Añadir proyecto existente.

Por último, puede hacer clic con el botón derecho sobre un proyecto, y utilizar “Añadir carpeta al proyecto”, una herramienta muy útil para incorporar al proyecto archivos sueltos que estén en una carpeta. Esta herramienta permite filtrar por extensión para añadir solo los archivos que cumplan con la condición del filtro.

Page 8: Delphi para PHP “en acción”

EXPLORADOR DE DATOS Esta herramienta tiene una doble función, primero, le permite explorar bases de datos, añadiendo la información de la conexión, y luego expandiendo cada uno de los niveles. Puede explorar tablas, vistas, procedimientos almacenados, funciones y sinónimos, y, a su vez, los campos y parámetros que los componen. La segunda función es la de interactuar con el diseñador de formularios, ya que puede arrastrar y soltar información desde el explorador de datos en el formulario activo. Si arrastra una base de datos, se creará un componente Database, con las propiedades establecidas en sus valores adecuados. Si arrastra una tabla, se crearán los componentes necesarios (Database, Table, Datasource), todos ellos conectados convenientemente, y aparte, un DBGrid conectado al Datasource. Si arrastra un campo de una tabla, se creará un Edit, más todos los componentes de acceso a datos si es necesario. Puede establecer tipo de control que se creará mediante los dos desplegables de la parte superior, denominados “Conjunto de datos” y “Campos”. Esto es muy útil cuando se están creando formularios con acceso a datos.

Page 9: Delphi para PHP “en acción”

PALETA DE HERRAMIENTAS La paleta de herramientas contiene todos los componentes que puede utilizar para desarrollar su aplicación. Estos componentes se instalan en el IDE mediante “paquetes” en la opción Componente | Paquetes. Dichos componentes se agrupan en categorías, como “Standard”, “Additional”, etc., y puede utilizar el símbolo (-) para colapsar dichas categorías y dejar solo las que le interesen. Para utilizar un componente de la paleta, haga clic en su icono o nombre, y luego haga clic en un formulario, el componente se creará a su tamaño por defecto. También puede arrastrar y soltar para crear el componente con unas dimensiones establecidas, y puede hacer doble clic directamente en la paleta de herramientas para que el componente se cree dentro del control activo, centrado y con su tamaño por defecto. Si desea buscar un componente, puede hacer clic en el icono de filtro, y luego, utilizando el teclado, escribir parte del nombre. A medida que vaya escribiendo, la lista de componentes se filtrará y se mostrará solo aquellos cuyo nombre contenga la cadena que está escribiendo.

Page 10: Delphi para PHP “en acción”

VCL PARA PHP ESTRUCTURA VCL para PHP es la librería de clases que utiliza Delphi para PHP para crear aplicaciones. Ha sido escrita utilizando la misma estructura que VCL para Windows, por lo que todas las clases base son las mismas y sirven para lo mismo. Por ejemplo, la clase base de todas las clases de la librería es Object, igual que en VCL para Windows, que es TObject. Esta clase proporciona métodos básicos como “classname”, que están disponibles para todas las clases que derivan de ella. Directamente de Object, deriva Persistent, que introduce métodos y propiedades que permiten almacenar y recuperar una clase en la sesión. A continuación, de Persistent, deriva Component, que es la clase mínima a utilizar para escribir un componente que se pueda situar en un formulario. Component introduce propiedades tan importantes como Name, y el concepto de “propiedad” entre componentes. Posteriormente, Control, deriva de Component y es el control base para crear controles visuales, es decir, controles que produzcan código que luego interpretará el navegador.

Page 11: Delphi para PHP “en acción”

PROPIEDADES Y EVENTOS En Delphi para Windows, podemos crear una propiedad para un determinado componente, es decir, un atributo que determine una característica de un objeto, y cuyo acceso venga determinado por dos métodos. Uno de los métodos se utiliza para establecer el valor y el otro para obtenerlo, de esta forma, se puede formatear la propiedad, validarla o ser notificado cuando se produzca algún cambio. En la sintaxis de PHP no existe una palabra clave para definir una “propiedad” entendida de esta forma, pero no hay que preocuparse, ya que VCL para PHP proporciona un mecanismo similar. En VCL para PHP, una propiedad está compuesta de dos métodos, el “setter” y el “getter”, y una vez un objeto tiene definidos dichos métodos, es posible escribir código como este: 01 <?php 02 require_once("vcl/vcl.inc.php"); 03 //Includes 04 use_unit("system.inc.php"); 05 06 class MiClase extends Object 07 { 08 protected $_mipropiedad=""; 09 10 function getMiPropiedad() { return $this‐>_mipropiedad; } 11 function setMiPropiedad($value) { $this‐>_mipropiedad=$value; } 12  13 } 14 15 $objeto=new MiClase(); 16 17 $objeto‐>MiPropiedad="¡hola, mundo!"; 18 19 echo $objeto‐>MiPropiedad; 20 21 ?> 

Page 12: Delphi para PHP “en acción”

Hay dos tipos de propiedades, Public y Published, la diferencia está en el nombre de los métodos, read/write o set/get, de esta forma el IDE es capaz de saber qué propiedades debe presentar en el Inspector de Objetos y que propiedades no. 01 <?php 02 class MiClase extends Object 03 { 04 protected $_propiedadpublic=""; 05 06 function readPropiedadPublic() { return $this‐>_propiedadpublic; } 07 function writePropiedadPublic($value) { $this‐>_propiedadpublic=$value; } 08  09 10 protected $_propiedadpublished=""; 11 12 function getPropiedadPublished() { return $this‐>_propiedadpublished; } 13 function setPropiedadPublished($value) { $this‐>_propiedadpublished=$value; } 14  15 } 16 ?> 

PERSISTENCIA Una de las diferencias entre las aplicaciones web y las aplicaciones de escritorio es la persistencia de los datos. En una aplicación de escritorio, el programa no termina hasta que se cierra la ventana principal, por lo tanto, los valores asignados a las propiedades de los componentes no se pierden hasta que la aplicación se cierra. En una aplicación web, los scripts que las componen se ejecutan de principio a fin, perdiendo el valor de dichas propiedades. En VCL para PHP, esto está resuelto de forma automática, ya que los componentes almacenan el valor de sus propiedades y posteriormente lo recuperan cuando el script arranca de nuevo. Esto tiene el efecto deseado, es decir, siempre que establezcamos el valor de una propiedad, dicha propiedad conservará el valor asignado durante todo el tiempo de vida de la aplicación.

CARACTERÍSTICAS DE TIEMPO DE DISEÑO Para que un IDE pueda gestionar componentes de forma visual, es absolutamente necesario que dichos componentes puedan distinguir cuando están ejecutándose dentro del IDE y cuando lo están haciendo en la aplicación del usuario. Quizás, en tiempo de diseño, el componente quiera mostrar indicadores, guías o información adicional, exclusivamente para el desarrollador. Es por eso, que es necesario proporcionar un mecanismo por el cual, podamos saber si estamos en tiempo de diseño o tiempo de ejecución. Para ello, podemos comprobar si el bit

Page 13: Delphi para PHP “en acción”

csDesigning está establecido en la propiedad ControlState, de estar activado, indica que el componente está siendo utilizando dentro del IDE. 01 <?php 02 if (($this‐>ControlState & csDesigning) == csDesigning) 03 { 04   echo "Estoy dentro del IDE"; 05 } 06 else 07 { 08   echo "Estoy en tiempo de ejecución"; 09 } 10 ?> 

Aparte, para facilitar al desarrollador el uso de los componentes, es necesario proporcionar información adicional al IDE, como por ejemplo, indicar los valores válidos para una determinada propiedad, o el tipo de editor de propiedades a utilizar cuando se edite una propiedad. O incluso, indicar al IDE, mediante el registro del componente, en qué categoría de la paleta de componentes debe aparecer.

TIPOS DE CONTROLES Actualmente, hay varios tipos de controles o componentes, que varían desde los menos visuales a los más visuales:

Componentes no visuales Controles basados en tags HTML estándar Controles HTML compuestos Controles Javascript Controles de Imagen Controles Flash

Veamos con más detalle las características principales de cada uno.

COMPONENTES NO VISUALES Estos componentes derivan directamente de Component, y no producen ninguna salida por el navegador, sino que aportan funcionalidad, como por ejemplo, el componente Timer. Este componente se utiliza para ser notificado, mediante un evento, y dependiendo de un intervalo de tiempo. Este componente no produce ningún código visible por el usuario, pero sí que utiliza Javascript para toda su programación. Otro tipo de componentes no visuales, son los de acceso a datos, que permiten conectar controles con tablas de base de datos.

Page 14: Delphi para PHP “en acción”

COMPONENTES BASADOS EN TAGS HTML ESTÁNDAR Estos componentes generan código basado en tags HTML estándar como <input> o <select> y utilizan sus propiedades para generar todos los atributos que determinan el aspecto de dicho tag. Controles como Button, Edit o ComboBox están basados en estos tags. La ventaja de utilizar estos controles, es que prácticamente todos los navegadores proporcionan una representación de ellos, y se adaptan visualmente al interfaz que utilice el usuario en su sistema operativo. Es conveniente utilizar estos controles cuando no se requieran características avanzadas, ya que son mucho más ligeros y se ejecutan más rápido que controles más complejos.

Page 15: Delphi para PHP “en acción”

COMPONENTES HTML COMPUESTOS Controles como CheckListBox, utilizan el HTML disponible, para funcionar, en este caso, tablas, checkboxes, etc. Estos componentes también son muy ligeros, ya que apenas utilizan javascript y se comportan muy bien en diferentes sistemas. Realmente se pueden hacer muchas cosas con HTML en un navegador para emular las aplicaciones de escritorio. Aprovechando las ventajas de VCL para PHP, se pueden crear componentes muy sofisticados que utilicen HTML, imágenes y CSS. Estos componentes también pueden hacer uso de Ajax para interactuar con el servidor y actualizar su estado sin necesidad de hacer un envío completo.

Page 16: Delphi para PHP “en acción”

CONTROLES JAVASCRIPT Estos controles suelen estar basados en librerías de javascript, como jquery, qooxdoo, xinha, etc. Utilizan toda la potencia de Javascript para crear controles avanzados, como RichEdit o DBGrid, que emulan controles complejos que se pueden encontrar en aplicaciones de escritorio. Actualmente, los navegadores están mejorando la velocidad de ejecución de Javascript de forma asombrosa, por lo que el uso de estos componentes hace que cada vez, las aplicaciones web se asemejen más a aplicaciones de escritorio.

Page 17: Delphi para PHP “en acción”

CONTROLES DE IMAGEN Hay veces que un componente, en vez de generar código HTML o Javascript, puede generar un archivo de imagen, por ejemplo, un PNG. Este tipo de controles, se denominan controles de imagen, y un ejemplo, puede ser el componente SimpleChart. Estos componentes utilizan los valores de las propiedades para generar una imagen de forma dinámica y volcarla por la salida. Si desea crear un control de este tipo, debe establecer el estilo csImageContent a 1 para el control, de esta forma, el IDE sabe que tiene que gestionarlo de forma diferente. Puede realizar esto con esta línea de código en el constructor: 1 $this‐>ControlStyle="csImageContent=1"; 

Como vemos en la imagen inferior, el IDE genera primero la imagen en un archivo temporal y luego se muestra usando el tag <img>

Page 18: Delphi para PHP “en acción”

CONTROLES FLASH Podemos decir que este tipo de controles son los más avanzados, aunque para funcionar, necesitan que el navegador del usuario disponga del plug-in de Flash. Las valores de las propiedades de estos componentes se envían a la película flash que los utiliza para mostrar el control al usuario. Un ejemplo de este tipo de control, es el control OpenChart, basado en una librería flash.

EMPAQUETADO DE CÓDIGO YA EXISTENTE La forma más sencilla de crear un componente VCL para PHP, es empaquetar código ya existente. Existen multitud de librerías, bien sean de javascript, de PHP, basadas en jquery, en flash, etc, etc, que son candidatas ideales para ser integradas en Delphi para PHP. La librería de clases fue diseñada con ese concepto en mente, por lo tanto, el proceso es muy sencillo, basta con crear un componente que actuará de “envoltorio” o “wrapper” sobre esa librería, ofreciendo un interfaz común de propiedades, métodos y eventos que se utilizarán para llamar a la librería que deseemos. De esta forma, podemos incorporar la funcionalidad de dicha librería en el IDE, y realizar diseños de interfaces de forma visual, con el mínimo esfuerzo.

ASISTENTE DE CREACIÓN DE COMPONENTES Para crear un nuevo componente, lo más sencillo es ejecutar el asistente que proporciona el IDE, utilizando Componente | Nuevo Componente. Debemos indicar que clase servirá de base para desarrollar nuestro nuevo componente, normalmente será Control. Después debemos introducir el nombre de la clase del nuevo componente y por último, si queremos crear el paquete para instalarlo en el IDE, seleccionar la categoría de la paleta que queramos.

Page 19: Delphi para PHP “en acción”

Una vez pulsemos aceptar, se creará la unidad con el código base de nuestro componente: 01 <?php 02 require_once("vcl/vcl.inc.php"); 03 //Includes 04 05 //Class definition 06 class MyNewComponent extends Control 07 { 08   function __construct($aowner = null) 09   { 10     parent::__construct($aowner); 11   } 12 13   function dumpContents() 14   { 15     parent::dumpContents(); 16   } 17 } 18 ?> 

Y también, si lo hemos seleccionado, el código del paquete: 01 <?php 02 require_once("vcl/vcl.inc.php"); 03 use_unit("designide.inc.php"); 04 05 setPackageTitle("Put the title of your package here"); 06 //Change this setting to the path where the icons for the components reside 07 setIconPath("./icons"); 08 09 //Change yourunit.inc.php to the php file which contains the component code 10 registerComponents("MyComponents",array("MyNewComponent"),"unit1.inc.php"); 11 ?> 

PAQUETES DE COMPONENTES Un paquete de componentes, es un simple fichero PHP que contiene llamadas a funciones PHP que interactúan con el IDE, para indicar cómo se tiene que instalar un determinado componente o grupo de componentes. Aparte de indicar donde instalar los componentes, también contienen indicaciones para el IDE acerca de las propiedades de dichos componentes, y como editarlas en el Inspector de Objetos.

Page 20: Delphi para PHP “en acción”

GENERACIÓN DE CÓDIGO A diferencia de los componentes para aplicaciones de escritorio, los componentes VCL para PHP no “pintan” su aspecto (excepto los controles de imagen), sino que “generan” código para que sea el navegador el encargado de pintarlos. Por lo tanto, la tarea básica de un desarrollador de componentes VCL para PHP es la de analizar el código que hay que generar, código que entienda el navegador (HTML, Javascript, CSS) para que el componente vaya cambiando en base al valor de sus propiedades. Este es quizás el aspecto que más diferencia la creación de componentes VCL para PHP de la creación de componentes VCL para Windows, el resto, es exactamente igual, propiedades, métodos y eventos. La generación del código principal se hace sobrescribiendo el método dumpContents(), que es llamado por la VCL para PHP para obtener el código del componente. Existen otros, como dumpHeaderCode() que son más específicos. 01 <?php 02 function dumpContents() 03 { 04   // set type depending on $_ispassword 05   $type = ($this‐>_ispassword) ? 'password' : 'text'; 06 07   if ($style != "") $style = "style=\"$style\""; 08 09   // call the OnShow event if assigned so the Text property can be changed 10   if ($this‐>_onshow != null) 11   { 12     $this‐>callEvent('onshow', array()); 13   } 14 15   $avalue=$this‐>_text; 16   $avalue=str_replace('"','&quot;',$avalue); 17   echo "<input type=\"$type\" id=\"$this‐>_name\" name=\"$this‐>_name\" value=\"$avalue\" $style />"; 18 } 19 ?> 

Page 21: Delphi para PHP “en acción”

LOCALIZACIÓN DE APLICACIONES La localización de aplicaciones en Delphi para PHP es un proceso que consta de dos partes bien diferenciadas: Traducción de las cadenas o literales usados en el código y la traducción de las propiedades de los componentes que sean de tipo cadena.

CADENAS EN EL CÓDIGO Para traducir las cadenas de texto del código, se utiliza el método estándar de traducción de aplicaciones en el mundo *nix, esto es, la tecnología gettext que es soportada perfectamente por el motor de PHP. Para indicar que una cadena de texto está sujeta a traducción, debemos encerrarla en la función _(“”), de esta forma, el parser encargado de extraer esas cadenas puede identificarlas. Aparte, llamando a esa función, hace que la cadena devuelta sea la traducción correcta en base al lenguaje activo. 1 <?php 2 function mifuncion($parametro) 3 { 4   echo _("Cadena sujeta a traducción"); 5 } 6 ?> 

Para traducir las cadenas, utilizamos el asistente de internacionalización, que recopila los archivos que componen el proyecto, pide información sobre los lenguajes a los que se quiere traducir y, posteriormente, ejecuta sobre ellos el programa xgettext, encargado de extraer dichas cadenas a un archivo con extensión .po. Una vez tenemos ese archivo con extensión .po, podemos utilizar un programa de edición llamado poEdit (o cualquier otro con soporte para .po) que nos permite traducir las cadenas almacenadas y generar un archivo binario con extensión .mo. Este archivo .mo es el que utiliza el motor de PHP para traducir las cadenas que se pidan mediante la función _(“”). Este proceso lo podemos repetir cuantas veces queramos a medida que vayamos desarrollando nuestro proyecto, ya que las cadenas nuevas que se introduzcan, se añadirán al archivo .po, y no se pierden los contenidos que ya se hayan traducido.

Page 22: Delphi para PHP “en acción”

PROPIEDADES VISUALES Para traducir las propiedades visuales, lo que debemos hacer es cambiar la propiedad Language del formulario en el que estemos trabajando. Si cambiamos a otro idioma, por ejemplo, francés, todos los cambios de propiedades que hagamos en dicho idioma, se almacenarán en un archivo .xml.php aparte, no solo de las propiedades de tipo cadena, sino todas, de forma, que estas propiedades se tendrán en cuenta solo cuando el lenguaje activo cambie. Dependiendo del idioma al cual queramos traducir nuestra aplicación, hay ocasiones donde las dimensiones de los controles no son suficientes para que quepan los nuevos textos, es por eso, que podemos redimensionar nuestro formulario para que se adapten correctamente.

Page 23: Delphi para PHP “en acción”

CAMBIANDO EL LENGUAJE ACTIVO Para cambiar el lenguaje de nuestra aplicación en tiempo de ejecución, debemos usar la propiedad Language del objeto global application: 01 <?php 02 function Button1Click($sender, $params) 03 { 04 global $application; 05 06 if ($application‐>Language == "(default)") 07 { 08 $application‐>Language = "Spanish (Traditional Sort)"; 09 } 10 else 11 { 12 $application‐>Language = "(default)"; 13 } 14 } 15 ?> 

De esa forma, el motor de PHP utilizará el archivo .mo que coincida con el lenguaje nuevo. Dependiendo del sistema operativo en el que se ejecute, quizás debamos hacer algunos ajustes para que funcione correctamente, en algunas versiones de Linux debemos instalar los “locales” adecuados para los idiomas en los que funciona nuestra aplicación, pero lo normal es que funcione por defecto en cualquier servidor.

UTILIZANDO ESTILOS CSS Aparte de las propiedades que utilizan los componentes para determinar su aspecto, podemos utilizar hojas de estilo CSS y asignarlas a los componentes. Los componentes pueden tener propiedades que contengan el estilo a utilizar para un determinado aspecto del componente. Por ejemplo, un DBGrid puede tener una propiedad que determine el estilo de las cabeceras y otra propiedad para establecer el estilo de las celdas de datos.

COMPONENTE STYLESHEET La forma más sencilla de incorporar una hoja de estilos a un formulario es mediante el componente StyleSheet. Este componente representa un archivo .css, al que se enlaza mediante la propiedad FileName. Una vez hecho este enlace, cualquier componente con una propiedad de hoja de estilos, en el Inspector de Objetos mostrará un desplegable con los estilos contenidos en esta hoja de estilos. Puede hacer la prueba con el componente Label, y su propiedad Style.

Page 24: Delphi para PHP “en acción”

JAVASCRIPT EVENTOS JAVASCRIPT Hasta ahora, cuando nos hemos referido a eventos, siempre nos hemos limitado a hablar de eventos PHP, es decir, eventos que suceden en el servidor, y cuyo código, debe estar escrito en PHP. Aparte de esos eventos, los navegadores actuales, también soportan la ejecución de código Javascript. Este código se ejecuta en el ordenador del cliente, más concretamente en su navegador, sin enviar ninguna petición al servidor. Es por esto, que este tipo de eventos tienen una gran utilidad cuando las operaciones que queramos realizar necesiten de una respuesta rápida (como por ejemplo, reaccionar al movimiento del ratón) o queramos actualizar la información que está viendo el usuario, sin necesidad de tener que consultar al servidor para ello. Por todo esto, los componentes VCL para PHP también soportan eventos Javascript, a estos eventos se accede desde la pestaña Javascript del Inspector de Objetos. Haciendo doble clic en cualquiera de ellos, nos genera el manejador de evento, donde ya podemos escribir nuestro código, y el lenguaje que debemos utilizar para ello es Javascript. 1 <?php 2 function Button5JSClick($sender, $params) 3 { 4 ?> 5 //Add your javascript code here 6 window.alert("Este evento se produce cuando se pulsa el botón."); 7 <?php 8 } 9 ?> 

Page 25: Delphi para PHP “en acción”

FINDOBJ Una de las cosas que más llama la atención a los desarrolladores que se introducen en el mundo del javascript, es la incompatibilidad entre los distintos navegadores. A pesar de existir un estándar sobre este lenguaje que todos los navegadores deben cumplir, la realidad es bien distinta. Aunque afortunadamente, poco a poco, esas diferencias se van reduciendo. Entre las tareas más comunes cuando se programa en Javascript, está la búsqueda de objetos, por ejemplo, de una caja de edición en un formulario o de un botón, al cual debemos obtener una referencia para poder utilizarlo. VCL para PHP incorpora una rutina estándar para obtener una referencia a un objeto, que permite abstraer las diferencias entre navegadores y que incluso funciona cuando los objetos están en diferentes frames. Esa rutina se llama findObj, y se le pasa el nombre del objeto que queremos obtener. 1 //Find the object 2 hidden=findObj('edit_hidden'); 3 4 //Use it 5 hidden.value=edit.value; 

ACCESO A DATOS PHP es un lenguaje de acceso a datos por excelencia. Debido a sus orígenes como lenguaje de programación para hacer páginas web, esta característica le ha servido para disponer de múltiples formas de acceder a los datos, y lo que es más importante, muy rápidas.

MODELO DE ACCESO A DATOS VCL para PHP incorpora el mismo modelo de acceso a datos que VCL para Windows, es decir: Database -> Dataset -> Datasource -> Control

ADODB Los componentes de acceso a datos estándar, están basados en la librería ADOdb, que, a pesar de su nombre, no hay que confundir con la tecnología ADO de Microsoft. Esta es una librería 100% escrita en PHP, que proporciona una capa de abstracción sobre el motor de base de datos que utilicemos en nuestra aplicación, permitiendo migrar a otro motor de base de datos, con cambios mínimos o ninguno. Por lo tanto, cuando utilicemos los componentes estándar, no debemos preocuparnos del tipo de base de datos, ya que estos componentes se encargarán de la mayor parte del trabajo.

Page 26: Delphi para PHP “en acción”

COMPONENTES NATIVOS Obviamente, utilizar una capa de abstracción sobre los datos, tiene alguna penalización de rendimiento, que si bien, para la mayor parte de aplicaciones no supone ningún problema, en cierto tipo de aplicaciones donde la velocidad de acceso a los datos sea crucial, puede resultar importante. Para ello, en VCL para PHP se incluyen componentes de acceso nativo a datos, para InterBase, Oracle y MySQL. Estos componentes no utilizan ADOdb, sino que usan las funciones nativas de PHP para acceder a los datos.

AJAX Ajax es una tecnología que permite realizar llamadas desde un navegador a un servidor de forma transparente, sin que el usuario perciba ningún refresco en el contenido del navegador. Si deseamos utilizar Ajax en un formulario, tenemos que establecer la propiedad UseAjax a true, para esas peticiones sean procesadas correctamente. Para hacer una llamada Ajax, debemos utilizar un evento Javascript, por ejemplo, cuando se pulse un botón. En el código de dicho evento, tenemos que utilizar el método AjaxCall, que es el encargado de generar todo el código javascript necesario para realizar la llamada: 01 //Class definition 02 class Index extends Page 03 { 04   public $Label1 = null; 05   public $Button1 = null; 06   function Button1JSClick($sender, $params) 07   { 08     //Dump the call using Ajax to the Button1Click event 09     echo $this‐>Button1‐>ajaxCall("Button1Click"); 10   ?> 11     //Return false to prevent the button submit the form 12     return(false); 13   <?php 14   } 15 16   function Button1Click($sender, $params) 17   { 18     $this‐>Button1‐>Caption = "clicked Ajax " . date("Y‐m‐d g:i:s a"); 19     $this‐>Label1‐>Caption = "Hello from Ajax!! " . date("Y‐m‐d g:i:s a"); 20     $this‐>Label1‐>Color = "#" . dechex(rand(0, 0xFFFFFF)); 21   } 22 } 

Page 27: Delphi para PHP “en acción”

DEPURACIÓN DE APLICACIONES Delphi para PHP incorpora un depurador integrado y totalmente configurado que le permite depurar aplicaciones PHP desde el primer momento. Basta con poner un punto de ruptura y presionar F9.

TRAZADOR Esta herramienta permite encontrar los cuellos de botella de nuestra aplicación, ya que emite un informe con las líneas de la aplicación que se han ejecutado, cuantas veces, y el tiempo empleado en dicha ejecución. Para utilizarlo, tenemos que habilitarlo marcando la casilla “Habilitar trazador”, y ejecutando en modo de depuración.

Page 28: Delphi para PHP “en acción”

APLICACIONES DEL MUNDO REAL En esta segunda parte del documento, vamos a dejar a un lado la teoría y vamos centrarnos en la práctica. Vamos a ver la rapidez con la cual podemos desarrollar una página web corporativa, y, posteriormente, veremos cómo interactuar con Delphi para Windows.

PÁGINA WEB CORPORATIVA Vamos a realizar un sencillo ejemplo de página web corporativa, pero que nos va a servir para poder ver todos los aspectos relativos a la programación con Delphi para PHP. En este ejemplo veremos cómo utilizar plantillas, como conectar con base de datos y como desplegar nuestra aplicación.

ESTABLECER LOS REQUERIMIENTOS Primero vamos a especificar las páginas de las que va a constar nuestra web:

Inicio Servicios Clientes Contacto Empresa

El contenido de dichas páginas estará almacenado en una base de datos, de esa forma, podremos, en un futuro, crear un interfaz donde nuestro cliente imaginario pueda actualizar su contenido. Aparte, crear una nueva página, reutilizando el aspecto gráfico será más sencillo. También queremos que el aspecto gráfico sea independiente del contenido, por lo que vamos a usar un sistema de plantillas.

CREACIÓN DE LA BASE DE DATOS Vamos a crear una web corporativa, donde el texto de las páginas va a estar almacenado en una tabla de base de datos. De esta forma, podemos centralizar el script que va a mostrar las páginas y también podemos crear nuevas páginas de forma más fácil. Para nuestra aplicación, vamos a usar MySQL, se podría decir que es el motor de base de datos más usado por los programadores PHP, es muy rápido y normalmente viene preinstalado en la mayor parte de los paquetes de hosting que podemos encontrar para PHP. La base de datos va a ser muy pequeña, con una sola tabla, para albergar las páginas, con un campo para el identificador y otro para el texto a mostrar. 1 CREATE TABLE IF NOT EXISTS `paginas` ( 2 `id` int(11) NOT NULL AUTO_INCREMENT, 3 `pagina` varchar(40) NOT NULL, 4 `texto` text NOT NULL, 5 PRIMARY KEY (`id`) 

Page 29: Delphi para PHP “en acción”

6 ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

En este documento no se explica la instalación y puesta en marcha de un servidor MySQL, pero una vez instalado, aconsejamos la instalación de phpMyAdmin (http://www.phpmyadmin.net) que permite realizar todas las operaciones necesarias. Con esta herramienta, podremos crear la base de datos, y, dentro de esa base de datos, ejecutar el script de creación que se encuentra en la parte superior. PhpMyAdmin también permite la inserción de datos, por lo que será muy útil para introducir la información de las páginas por defecto.

CREACIÓN DEL PROYECTO Para empezar a programar, abrimos Delphi para PHP, y creamos una nueva aplicación. Cuando se crea una nueva aplicación, esta siempre contiene un formulario nuevo, utilizando el Inspector de Objetos, procedemos a darle nombre, en este caso “Index”. Ahora Lo guardamos todo en un directorio de nuestra elección, renombrando la unidad que se ha creado como “index.php”, ya que va a ser nuestro script principal. Una vez esté todo guardado, debe parecerse a esto:

CONEXIÓN CON LA BASE DE DATOS Para acceder a la base de datos, vamos a utilizar un DataModule, para un proyecto tan pequeño, no sería necesario, pero es conveniente acostumbrarse a aislar las conexiones con base de datos en un módulo aparte. Para añadir un módulo de datos, seleccionamos Archivo | Nuevo | Módulo de datos, como vemos, es un contenedor, pero que solo soporta componentes no visuales. Utilizando el Inspector de Objetos, cambiamos la propiedad Name a “DBModule”, guardamos este módulo de datos en la misma carpeta que el resto del proyecto, con el nombre, por ejemplo, “dbmodule.php”. Ahora vamos a utilizar el Explorador de Datos, hacemos clic con el botón derecho en el nodo de MySQL y seleccionamos “Registrar base de datos”. Nos presentará un diálogo donde tenemos que introducir los datos de conexión con nuestra base de datos.

Page 30: Delphi para PHP “en acción”

Una vez relleno, presionamos OK, y ya tendremos nuestra base de datos registrada. Ahora podemos desplegarla, para ver su contenido, más concretamente, las tablas que contiene. Esta misma operación se puede hacer con cualquiera de los tipos de bases de datos soportados. Y ahora, lo que debemos hacer es pinchar y arrastrar la tabla “páginas” desde el explorador de datos, al datamodule.

Page 31: Delphi para PHP “en acción”

Esta operación nos habrá creado tres componentes:

Database Table Datasource

Los tres componentes ya tienen todas sus propiedades necesarias puestas al valor correcto y están interconectados entre sí y listos para funcionar. Si este proceso lo tuviéramos que hacer a mano, tendríamos que hacer lo siguiente:

Colocar el componente Database y poner el valor correcto en DatabaseName, DriverName, Host, Username y UserPassword

Poner un componente Table, conectar su propiedad Database y establecer el valor de la propiedad TableName

Poner un componente Datasource y conectar su propiedad Dataset al componente Table

Como vemos, es mucho más sencillo arrastrar y soltar que hacer todo eso.

SISTEMA DE PLANTILLAS Vamos a utilizar plantillas, ya que aportan un alto grado de personalización y flexibilidad, y es lo que suele llegarnos desde los diseñadores. Para este proyecto, vamos a bajar una plantilla corporativa gratuita, que cumpla con las especificaciones XHTML. Hay que tener en cuenta que podremos luego cambiar la plantilla sin que eso afecte para nada a la programación de nuestra web.

Page 32: Delphi para PHP “en acción”

Para este ejemplo, vamos a utilizar esta plantilla: http://www.styleshout.com/templates/preview/Jungleland1-0/index.html La bajamos de internet, la descomprimimos, y colocamos todo su contenido en la misma carpeta del proyecto. Podría estar en una subcarpeta sin problemas, pero es más conveniente en la misma, por si acaso el diseñador no ha tenido en cuenta este detalle. Lo primero que tenemos que hacer es “vaciar” su zona central, que es donde insertaremos el contenido de la base datos. Para eso, editamos el archivo index.html y eliminamos el div con id “featured”, ese trozo a la página principal exclusivamente. Es conveniente que hagamos una copia de la plantilla, ya que varios de esos trozos eliminados, serán utilizados posteriormente.

Cuando quitemos ese div, tenemos que buscar el tag <div id=”main”> y vaciar todo el tag, ya que este es el contenido que va a variar entre las páginas.

Page 33: Delphi para PHP “en acción”

Una vez hecho esto, guardamos el archivo, y si lo abrimos en un navegador web, esto es lo que veremos.

Page 34: Delphi para PHP “en acción”

Ahora vamos a configurar la página, para que cuando se muestre, utilice esta plantilla, para esto, debemos utilizar dos propiedades:

TemplateEngine, que determina el motor de plantillas a utilizar, seleccionamos “SmartyTemplate”

TemplateFilename, que determina la plantilla a utilizar, en nuestro caso, “index.html”

Simplemente con esto, si ejecutamos index.php utilizando F9, obtendremos la plantilla tal y como está en el archivo index.html. SmartyTemplate está basado en el motor de plantillas más utilizado por los programadores PHP, se denomina Smarty y puedes encontrar más información en este enlace: http://www.smarty.net/ Para poder situar contenido dinámico dentro de la plantilla, debemos crear un “hueco”, esto se consigue con los tags especiales {%$NOMBRE%}. 1 <!‐‐ main ‐‐> 2 <div id="main"> 3 {%$CONTENIDO%} 4 <!‐‐ /main ‐‐> 5 </div> 

De esta forma, podemos insertar el contenido que necesitemos en el plantilla. Podemos hacer una prueba insertando algo de contenido, para ver que todo funciona, para ello, generamos el evento OnTemplate de la página e insertamos este código: 1 function IndexTemplate($sender, $params) 2 { 3 //Obtener el objeto template 4 $template=$params['template']; 5 6 //Asignar un contenido en el hueco 7 $template‐>_smarty‐>assign('CONTENIDO','¡Hola Mundo!'); 8 } 

Lo que estamos haciendo es obtener directamente una referencia al objeto smarty y asignarle un valor. Si ejecutamos, veremos como en la zona de contenido saldrá la cadena “¡Hola Mundo!”.

SCRIPT DE PROCESAMIENTO DE PÁGINAS Ya hemos visto como insertar contenido en el hueco que hemos creado, así que ahora vamos a procesar las peticiones de páginas e insertar el contenido que haya en la base de datos. Los enlaces a las páginas van a tener la forma index.php?page=nombre, donde nombre, debe coincidir con el campo “página” de la tabla de base de datos.

Page 35: Delphi para PHP “en acción”

Tenemos que buscar dicho registro e insertar el contenido del campo “texto” en la zona de contenido de la plantilla. Para hacer esto, debemos incluir en nuestro script, el modulo de datos que contiene la conexión con la base de datos. Utilizamos Archivo | Usar unidad y seleccionamos “dbmodule.php”. Esto añade, en la zona de inclusiones, la directiva require_once con el código fuente que le hemos indicado. De esta forma, ya tenemos acceso a dicho objeto. Primero vamos a ver si hay alguna petición de página, eso lo hacemos utilizando el objeto $input para realizar un filtrado y prevenir algún tipo de ataque: 1 global $input; 2 3 //Miramos si hay un parámetro page en la entrada 4 $page=$input‐>page; 5 6 //De haberlo, lo filtramos como una cadena, si no 7 //hay ninguno, sacaremos la página por defecto 8 if (is_object($page)) $pagina=$page‐>asString(); 9 else $pagina='inicio'; 

Ahora tenemos que utilizar ese nombre de página para buscar el contenido en la tabla de base de datos, para ello, vamos simplemente a filtrar la tabla y sacar el primer registro. Así quedaría la rutina completa: 01 function IndexTemplate($sender, $params) 02 { 03 //Obtener el objeto template 04 $template=$params['template']; 05 06 global $input; 07 08 //Miramos si hay un parametro page en la entrada 09 $page=$input‐>page; 10 11 //De haberlo, lo filtramos como una cadena, si no 12 //hay ninguno, sacaremos la página por defecto 13 if (is_object($page)) $pagina=$page‐>asString(); 14 else $pagina='inicio'; 15 16 global $DBModule; 17 18 //Filtramos la tabla de paginas por la página que queremos mostrar 19 $DBModule‐>tbpaginas1‐>close(); 20 $DBModule‐>tbpaginas1‐>Filter='pagina="'.$pagina.'"'; 21 $DBModule‐>tbpaginas1‐>open(); 22 23 //Sacamos el contenido 24 $contenido=$DBModule‐>tbpaginas1‐>texto; 25 

Page 36: Delphi para PHP “en acción”

26 //Asignar un contenido en el hueco 27 $template‐>_smarty‐>assign('CONTENIDO',$contenido); 28 } 

Ahora solo tenemos que introducir en la base de datos los textos de las páginas, que, recordemos, van a ser: inicio, servicios, clientes, contacto, empresa. Para la página de inicio vamos a usar el trozo que eliminamos del index.html, el div “featured”, lo podemos insertar con phpMyAdmin en la misma base de datos, este es el trozo: 01 <!‐‐ featured ‐‐> 02 <div id="featured"> 03 <div id="featured‐block" class="clear"> 04 <div id="featured‐ribbon"></div> 05 <a name="TemplateInfo"></a> 06 <div class="image‐block"> 07 <a href="index.html" title=""><img src="images/img‐featured.jpg" alt="featured" width="350px" height="250px"/></a> 08 </div> 09 10 <div class="text‐block"> 11 <h2><a href="index.html">Read me first</a></h2> 12 <p class="post‐info"> 13 Posted by <a href="index.html">erwin</a> | Filed under 14 <a href="index.html">templates</a>, 15 <a href="index.html">internet</a> 16 </p> 17 <p> 18 <strong>JungleLand 1.0</strong> is a free, W3C‐compliant, CSS‐based website template 19 by <a href="http://www.styleshout.com/">styleshout.com</a>. This work is 20 distributed under the <a rel="license" href="http://creativecommons.org/licenses/by/2.5/"> 21 Creative Commons Attribution 2.5 License</a>, which means that you are free to 22 use and modify it for any purpose. All I ask is that you include a link back to 23 <a href="http://www.styleshout.com/">my website</a> in your credits. For more free designs, you can visit 24 <a href="http://www.styleshout.com/">my website</a> to see 25 my other works. 26 </p> 27 28 <p>Good luck and I hope you find my free templates useful!</p> 29 <p><a href="index.html" class="more‐link">Read More</a></p> 30 </div> 31 </div> 32 </div> 

Si ahora ejecutamos la aplicación, veremos como en el centro sale el trozo de HTML de “featured”. Para la página de servicios, vamos a poner un trozo del style.html, que representa a un mensaje de un blog:

Page 37: Delphi para PHP “en acción”

01 <div class="post"> 02 <h2><a href="index.html">A Blog Post</a></h2> 03 <p class="post‐info">Posted by <a href="index.html">erwin</a> | Filed under <a href="index.html">templates</a>, <a href="index.html">internet</a></p> 04 <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec libero. Suspendisse bibendum. 05 Cras id urna. Morbi tincidunt, orci ac <a href="index.html">convallis aliquam</a>, lectus turpis varius lorem, eu 06 posuere nunc justo tempus leo.</p> 07 <p> 08 Donec mattis, purus nec placerat bibendum, <a href="index.html">dui pede condimentum</a> 09 odio, ac blandit ante orci ut diam. Cras fringilla magna. Phasellus suscipit, leo a pharetra 10 condimentum, lorem tellus eleifend magna, <a href="index.html">eget fringilla velit</a> magna id neque. Curabitur vel urna 11 In tristique orci porttitor ipsum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec libero. Suspendisse bib 12 Cras id urna. Morbi tincidunt, orci ac convallis aliquam, lectus turpis varius lorem, eu 13 posuere nunc justo tempus leo.</p> 14 <p class="postmeta"> 15 <a href="index.html" class="readmore">Read more</a> | 16 <a href="index.html" class="comments">Comments (3)</a> | 17 <span class="date">August 20, 2009</span> 18 </p> 19 </div> 

Si ahora pusiésemos en el navegador una dirección como esta: http://localhost:3570/index.php?page=servicios Veríamos como se nos mostraría la misma plantilla, pero el contenido de la página cambiaría. Ahora solo tenemos que repetir el proceso para el resto de páginas e insertarlas en la base de datos.

PULIENDO DETALLES Vamos a hacer unos pequeños cambios para completar la web y hacerla algo más amigable, en este caso, vamos a cambiar la cabecera de la plantilla para dos cosas:

Mostrar los enlaces de las páginas de la web corporativa Que dependiendo de la página activa, se ilumine el enlace correcto

Para todo esto, tenemos que cambiar la lista <ul> dentro del div id=”nav” del index.html, para que quede tal que así: 1 <div id="nav"> 2 <ul> 

Page 38: Delphi para PHP “en acción”

3 <li id="{%$INICIO%}"><a href="index.php">Inicio</a></li> 4 <li id="{%$SERVICIOS%}"><a href="index.php?page=servicios">Servicios</a></ 5 <li id="{%$CLIENTES%}"><a href="index.php?page=clientes">Clientes</a></li> 6 <li id="{%$CONTACTO%}"><a href="index.php?page=contacto">Contacto</a></li> 7 <li id="{%$EMPRESA%}"><a href="index.php?page=empresa">Empresa</a></li> 8 </ul> 9 </div> 

De esta forma, veremos en la parte superior los enlaces a todas las páginas que queremos, y, aparte, podemos establecer cuál de ellas va a estar resaltada si establecemos el hueco de su nombre de página a “current”. Para eso tenemos que añadir esta línea al final del evento OnTemplate: 1 $template‐>_smarty‐>assign(strtoupper($pagina),'current'); 

Haciéndolo de esta manera, nos resultará muy sencillo añadir páginas en el futuro siguiendo el mismo esquema.

DESPLIEGUE En este último paso, vamos a ver las tareas necesarias para desplegar una aplicación Delphi para PHP. Podemos utilizar el asistente de despliegue o realizar la instalación por nuestra cuenta. En ambos casos, la instalación es muy sencilla, realmente es una copia de archivos y al único aspecto que tenemos que prestar atención es a la localización de la carpeta que contiene VCL para PHP. Por defecto, las aplicaciones están preparadas para funcionar teniendo la librería de clases como un subdirectorio de nuestra aplicación. Es decir, si nuestra aplicación estuviera en /var/www/mywebsite.com, la VCL debe residir en /var/www/mywebsite.com/vcl, de esta forma, no necesitamos alterar la ruta de búsqueda de archivos para nada. En cualquier caso, la VCL para PHP debe residir en un directorio cuyo contenido sea accesible por el servidor web, ya que varios componentes utilizan recursos (imágenes, hojas de estilo, etc.) que están almacenados en la carpeta de la VCL. Para este ejemplo, vamos a poner la VCL para PHP en una subcarpeta de nuestra aplicación. Lo primero que tenemos que hacer es crear la base de datos en el directorio de destino. Para ello, podemos hacer un volcado de la base de datos que tenemos en local y luego recuperarla utilizando ese volcado en nuestro servidor. Después podemos utilizar el asistente de despliegue, el cual nos guiará por todo el proceso de copiar todos los archivos necesarios en una carpeta de nuestro disco duro.

Page 39: Delphi para PHP “en acción”

Es importante resaltar, que el asistente no copia archivos referenciados por propiedades de componentes, sino solo los archivos que formen parte del proyecto y los archivos necesarios de la VCL para PHP. Por lo tanto, si queremos que el asistente de despliegue tenga en cuenta nuestra plantilla, debemos añadir al proyecto todos los archivos de los que consta. El primer paso del asistente de despliegue, recolecta los archivos de los que consta nuestra aplicación. El segundo paso, identifica los componentes utilizados en nuestros formularios, y el fuente de la VCL para PHP correspondiente. El tercer paso hace un resumen de los archivos y carpetas que se van a copiar y en el último paso, se pide una carpeta donde poder hacer la copia. Estos son todos los archivos necesarios para hacer funcionar nuestra aplicación en un ordenador diferente al que utilizamos para desarrollo. Mi consejo es copiar la VCL para PHP completa, ya que es algo que no va cambiar, y siempre podemos incluir componentes nuevos. Posteriormente, solo será necesario copiar/actualizar los archivos de la aplicación para ir probándola. Una vez subidos todos estos archivos al servidor, debemos cambiar la configuración de acceso a base de datos para que coincida con la del servidor. Para ello, podemos editar el archivo dbmodule.xml.php, es una archivo texto, de sencilla estructura. Tenemos que buscar las propiedades de conexión del componente Database y cambiarlas por los valores correctos. 01 <object class="Database" name="dbweb1" > 02 <property name="Left">285</property> 03 <property name="Top">163</property> 04 <property name="Connected">1</property> 05 <property name="DatabaseName">web</property> 06 <property name="Host">localhost</property> 07 <property name="Name">dbweb1</property> 08 <property name="UserName">root</property> 09 <property name="UserPassword">test</property> 10 </object> 

Y eso es todo, nuestra aplicación tiene que funcionar perfectamente en el servidor. Os aconsejo que utilicéis servidores Linux, ya que el rendimiento en la ejecución de PHP es bastante mejor que en Windows. En cualquier caso, siempre utilizar Apache como servidor web y PHP cargado como módulo, no como CGI.

Page 40: Delphi para PHP “en acción”

INTERACTUANDO CON DELPHI PARA WINDOWS SERVICIO WEB Una de las grandes utilidades que podemos darle a Delphi para PHP es la creación de aplicaciones de servicios web, es decir, que proporcionen información y realicen operaciones en el servidor, y se comuniquen con un cliente para Windows desarrollado en Delphi para Windows. Para este ejemplo, vamos a crear un servicio web, que realice una búsqueda de un cliente en la base de datos y devuelva el estado de una ficticia cuenta de crédito. En el caso de existir más de un cliente que coincida con la búsqueda, devolverá un listado con dichos clientes, para que usuario pueda elegir.

CREACIÓN DE LA BASE DE DATOS Como en el ejemplo anterior, vamos a crear una base de datos, y una tabla, donde se almacenen los clientes y el estado de su cuenta de crédito. 1 CREATE TABLE `webservice`.`clientes` ( 2 `id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , 3 `firstname` VARCHAR( 40 ) NOT NULL , 4 `lastname` VARCHAR( 40 ) NOT NULL , 5 `credit` FLOAT( 10, 2 ) NOT NULL DEFAULT '0' 6 ) ENGINE = INNODB; 

Ahora, insertamos varios registros de prueba para tener datos con los que realizar algunas pruebas puntuales. 1 INSERT INTO `webservice`.`clientes` 2 (`id`, `firstname`, `lastname`, `credit`) 3 VALUES 4 (NULL, 'Jane', 'Smith', '200'), (NULL, 'Joe', 'Black', '400'); 

DESARROLLO DEL SERVICIO WEB Procedemos a crear una nueva aplicación, utilizando Archivo | Nuevo | Aplicación, y como no vamos a necesitar ningún formulario, cerramos la página nueva que se habrá creado, contestando “No” a la pregunta sobre si guardar los cambios o no. Nuestro servicio web, así como los componentes de acceso a datos que vamos a utilizar, son componentes no visibles, por lo que un Datamodule es más que suficiente para este proyecto. Así que utilizando Archivo | Nuevo | Data Module, creamos uno nuevo.

Page 41: Delphi para PHP “en acción”

Ahora sí que podemos guardar toda la aplicación en el directorio que queramos y darle nombre a los archivos. Por ejemplo, al datamodule, lo podemos nombrar como “customerservice”, ya que es muy posible que en un futuro, le añadamos funcionalidad. Para crear un servicio web, solo necesitamos un componente, que se llama Service, lo buscamos en la paleta de componentes y lo colocamos en el datamodule. Le cambiamos el ServiceName por “customerservice” y establecemos su propiedad Active a “true”. Esto es lo que tenemos que tener en el IDE:

Si ejecutamos ahora la aplicación, veremos cómo este componente ya proporciona una funcionalidad básica, en la forma de un frontend sencillo para interactuar con nuestro futuro servicio web.

Ahora lo que tenemos que hacer es dotar de funcionalidad a dicho servicio web, para ello, debemos registrar las rutinas o procedimientos que vamos a poner a disposición de los clientes del servicio web. Inicialmente solo va a ser uno, denominado getCredit, que va tener como entrada una cadena, con el nombre o parte del nombre del cliente, y devolverá un array de

Page 42: Delphi para PHP “en acción”

cadenas, si solo devuelve una, será el crédito del cliente, pero si devuelve más, serán todos los nombres de los clientes que coinciden con la búsqueda. Para devolver un array de cadenas, debemos añadir un tipo complejo de datos, para eso, podemos utilizar el evento OnAddComplexTypes del componente Service y llamar al método addComplexType. 01 function serviceAddComplexTypes($sender, $params) 02 { 03 $this‐>service‐>addComplexType 04 ( 05 'ArrayOfstring', 06 'complexType', 07 'array', 08 '', 09 'SOAP‐ENC:Array', 10 array(), 11 array(array('ref'=>'SOAP‐ENC:arrayType','wsdl:arrayType'=>'string[]')), 12 'xsd:string' 13 ); 14 } 

Ahora que ya tenemos definido el tipo complejo de datos, vamos a registrar la función que va a ser publicada por el servicio web. Esto se hace en el evento OnRegisterServices. 1 function serviceRegisterServices($sender, $params) 2 { 3 $this‐>service‐>register('getCredit', 4 array('input'=>'xsd:string'), 5 array('return'=>'tns:ArrayOfstring'), 6 'http://localhost/'); 7 } 

Una vez registrada nuestra función, debemos implementarla, recordemos lo que debemos hacer:

Buscar en la tabla de clientes un cliente cuyo nombre coincida con el parámetro de entrada

Devolver todos los registros que coincidan como un array de cadenas Aquí podéis ver la implementación de dicha función: 01 function getCredit($input) 02 { 03 global $Webservice; 04 05 $Webservice‐>tbclientes1‐>close(); 06 $Webservice‐>tbclientes1‐>Filter="concat(firstname,' ',lastname) like '%$input%'" 07 $Webservice‐>tbclientes1‐>open(); 08 $result=array(); 

Page 43: Delphi para PHP “en acción”

09 10 while (!$Webservice‐>tbclientes1‐>EOF) 11 { 12 $result[]=$Webservice‐>tbclientes1‐>firstname.' '. 13 $Webservice‐>tbclientes1‐>lastname.'|'. 14 $Webservice‐>tbclientes1‐>credit; 15 $Webservice‐>tbclientes1‐>next(); 16 } 17 18 return($result); 19 } 

Si ahora ejecutamos nuestro proyecto, la descripción WSDL ya proporciona toda la información necesaria para conectar y llamar a este servicio.

DESARROLLO DEL CLIENTE Para desarrollar el cliente, vamos a utilizar Delphi para Windows, pero hay que tener en cuenta que cualquier herramienta de desarrollo con soporte SOAP puede servir para consumir nuestro servicio. Lo primero que tenemos que hacer es crear una aplicación nueva con Delphi para Windows. Una vez la tengamos creada, vamos a utilizar el asistente de importación WSDL, que está en el repositorio, en la categoría WebServices.

Page 44: Delphi para PHP “en acción”

Al ejecutarlo, el asistente nos pide la URL donde reside la WSDL que queremos importar, dicha WSDL es accesible mediante un enlace publicado por el propio servicio.

El URL de la WSDL lo tenemos en la descripción del servicio web:

Una vez tengamos el enlace en el portapapeles, lo pegamos la casilla del asistente y presionamos en siguiente. Se nos mostrará un previo con los tipos de datos detectados y la unidad de código que se añadirá al proyecto para acceder al servicio web. Si presionamos el botón de finalización, dicha unidad se añadirá a nuestro proyecto. Ahora vamos a ver cómo utilizarla. Para eso, ponemos un TButton en el formulario y lo llamamos btnQueryCredit.

Page 45: Delphi para PHP “en acción”

Como hemos visto en los requerimientos, es posible que se devuelva más de un resultado, si la cadena de búsqueda coincide con más de un cliente. Es por ello que necesitamos añadir otro formulario, que solo lo utilizaremos para pedir la selección de un cliente. El formulario consta de un desplegable y dos botones, es un formulario modal normal y corriente, así que no me voy a parar en los detalles, aquí tenéis una captura.

Ahora, en el formulario de llamada del servicio web, debemos incluir en el uses, la unidad “customerservice”, que es la que contiene el código que necesitamos llamar, y también la unidad que contiene nuestro formulario de selección. Después, generamos el evento OnClick del botón y escribimos este código.

Page 46: Delphi para PHP “en acción”

01 procedure TMainForm.btnQueryCreditClick(Sender: TObject); 02 var 03   value: string; 04   return: ArrayOfstring; 05   i: integer; 06   customername: string; 07   k: integer; 08 begin 09   //Pedimos primero un cliente por el que buscar 10   if (InputQuery('Consultar crédito','Cliente:',value)) then begin 11 12     //Se hace la llamada al servicio web 13     return:=GetcustomerservicePortType.getCredit(value); 14 15     //Si solo se devuelve un resultado, mostramos el credito 16     if (length(return)=1) then begin 17       showmessage('Credito del cliente:'+return[0]); 18     end 19     else if (length(return)>1) then begin 20 21       //Si hay más de uno, entonces, se pide cual se quiere buscar 22       with TfrmSelectCustomer.Create(nil) do begin 23         try 24           cbCustomers.Clear; 25 26           //Rellenamos el desplegable 27           for i := low(return) to high(return) do begin 28             customername:=return[i]; 29             k:=pos('|',customername); 30             if (k<>0) then customername:=copy(customername,1,k‐1); 31             cbCustomers.Items.Add(customername); 32           end; 33 34           cbCustomers.ItemIndex:=0; 35           if (showmodal=mrOK) then begin 36             //Si el usuario acepta la operación volvemos a llamar al servicio web 37             //es redundante, pero esto es solo un ejemplo ;‐) 38             return:=GetcustomerservicePortType.getCredit(cbCustomers.Text); 39             showmessage('Credito del cliente:'+return[0]); 40           end; 41         finally 42           free; 43         end; 44       end; 45     end 46     else begin 47       showmessage('No se ha encontrado clientes'); 48     end; 49   end; 50 end; 

Page 47: Delphi para PHP “en acción”

Si ahora ejecutamos nuestra aplicación, veremos que funciona como esperábamos: Si pedimos el crédito de un cliente que NO está en la base de datos,

obtendremos un mensaje indicándolo Si pedimos el crédito de un cliente que está en la base de datos, veremos su

crédito Si el patrón de búsqueda coincide con varios clientes, veremos una pantalla

que nos indica que debemos seleccionar uno de ellos, y si aceptamos, veremos el crédito de dicho usuario.

Las posibilidades de este sistema de trabajo son ilimitadas, podemos crear servicios web que interactúen con el servidor y realicen consultas complejas y devuelvan los datos adecuados a aplicaciones ligeras en el cliente. Se pueden realizar cambios o actualizaciones en los servicios web sin necesidad de actualizar los clientes. Se pueden servir datos a diferentes clientes en diferentes plataformas con el mismo backend, etc.

Page 48: Delphi para PHP “en acción”

CONCLUSIÓN Es muy difícil explicar en un solo documento todas las capacidades de Delphi para PHP, y todo el beneficio que le puede suponer su uso. He intentado dar una visión global sobre lo que es el producto, y sobre todo, desde el punto de vista práctico, con la esperanza de que le pueda servir de ayuda en su toma de decisiones. Si ya es usuario de Delphi para PHP, quizás encuentre información que le sea de utilidad en sus proyectos. Delphi para PHP es la primera y única herramienta de desarrollo puramente visual que existe para PHP, y que incorpora las tecnologías RAD que tanto han beneficiado a los programadores Delphi para Windows.

SOBRE EL AUTOR José León es el arquitecto principal de Delphi para PHP, comenzó a escribir una primera versión aproximadamente en el año 2001 y en 2007 estableció un acuerdo con Embarcadero (CodeGear por aquel entonces) para desarrollar Delphi para PHP como un producto de primer nivel en el catálogo de productos de Embarcadero. Aparte de esto, es el CEO de qadram software S.L. una empresa de desarrollo de software a medida, basada en España, que utiliza Delphi para PHP en las soluciones que desarrolla para sus clientes. Puede visitar la web de su empresa en http://www.qadram.com , puedes seguir las evoluciones del desarrollo en http://twitter.com/qadram y contactar con él en [email protected] José quiere agradecer a Paweł Głowacki por su interés en Delphi para PHP y por su incansable capacidad de comunicación.

Embarcadero Technologies, Inc. is a leading provider of award-winning tools for application developers and database professionals so they can design systems right, build them faster and run them better, regardless of their platform or programming language. Ninety of the Fortune 100 and an active community of more than three million users worldwide rely on Embarcadero products to increase productivity, reduce costs, simplify change management and compliance and accelerate innovation. The company’s flagship tools include: Embarcadero® Change Manager™, Embarcadero™ RAD Studio, DBArtisan®, Delphi®, ER/Studio®, JBuilder® and Rapid SQL®. Founded in 1993, Embarcadero is headquartered in San Francisco, with offices located around the world. Embarcadero is online at www.embarcadero.com.