SlideShare ist ein Scribd-Unternehmen logo
1 von 48
Downloaden Sie, um offline zu lesen
Documento Técnico




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




Corporate Headquarters              EMEA Headquarters         Asia-Pacific Headquarters
100 California Street, 12th Floor   York House                L7. 313 La Trobe Street
San Francisco, California 94111     18 York Road              Melbourne VIC 3000
                                    Maidenhead, Berkshire     Australia
                                    SL6 1SF, United Kingdom
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.
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.
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.
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.
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.
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.
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.
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.
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.
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 ?> 
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
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.
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.
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.
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.
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>
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.
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.
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 ?> 
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.
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.
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.
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 ?> 
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.
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 } 
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.
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`) 
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.
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.
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.
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.
Una vez hecho esto, guardamos el archivo, y si lo abrimos en un navegador web, esto
es lo que veremos.
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.
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 
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:
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> 
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.
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.
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.
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
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(); 
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.
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.
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.
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; 
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.
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
support@qadram.com

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.

Weitere ähnliche Inhalte

Was ist angesagt?

Generalidades de Visual Basic
Generalidades de Visual BasicGeneralidades de Visual Basic
Generalidades de Visual Basic
denis2801
 
Qué es visual basic
Qué es visual basicQué es visual basic
Qué es visual basic
romeprofe
 

Was ist angesagt? (20)

Trabajo de programacion (visual basic)
Trabajo de programacion (visual basic)Trabajo de programacion (visual basic)
Trabajo de programacion (visual basic)
 
Generalidades de Visual Basic
Generalidades de Visual BasicGeneralidades de Visual Basic
Generalidades de Visual Basic
 
Atix17
Atix17Atix17
Atix17
 
Visual basic 6
Visual basic 6Visual basic 6
Visual basic 6
 
Programacion 5% Karolayn Cardozo 28.252.584
Programacion 5% Karolayn Cardozo 28.252.584Programacion 5% Karolayn Cardozo 28.252.584
Programacion 5% Karolayn Cardozo 28.252.584
 
Hendric gutierrez visual basic.
Hendric gutierrez visual basic.Hendric gutierrez visual basic.
Hendric gutierrez visual basic.
 
Fundamentos basicos de visual basic
Fundamentos basicos de visual basicFundamentos basicos de visual basic
Fundamentos basicos de visual basic
 
Presentación2
Presentación2Presentación2
Presentación2
 
Instituto universitario politecnico
Instituto universitario politecnicoInstituto universitario politecnico
Instituto universitario politecnico
 
Visual basic
Visual basicVisual basic
Visual basic
 
Qué es visual basic
Qué es visual basicQué es visual basic
Qué es visual basic
 
Visual Basic
Visual BasicVisual Basic
Visual Basic
 
visual basic- programacion
visual basic- programacionvisual basic- programacion
visual basic- programacion
 
Fundamentos de Visual Basic
Fundamentos de Visual BasicFundamentos de Visual Basic
Fundamentos de Visual Basic
 
Jose palencia - PROGRAMACIÓN
Jose palencia - PROGRAMACIÓN Jose palencia - PROGRAMACIÓN
Jose palencia - PROGRAMACIÓN
 
Manual android
Manual androidManual android
Manual android
 
Visual Basic 6.0
Visual Basic 6.0Visual Basic 6.0
Visual Basic 6.0
 
Visual Basic 6.0
Visual Basic 6.0Visual Basic 6.0
Visual Basic 6.0
 
ATIX22
ATIX22ATIX22
ATIX22
 
Programación en Visual Basic - Conceptos Básicos
Programación en Visual Basic - Conceptos BásicosProgramación en Visual Basic - Conceptos Básicos
Programación en Visual Basic - Conceptos Básicos
 

Andere mochten auch

5 basico historia - zig zag - estudiante
5 basico   historia - zig zag - estudiante5 basico   historia - zig zag - estudiante
5 basico historia - zig zag - estudiante
Pilar Santander
 
Observatorio de Cafés en el Quindío 2015
Observatorio de Cafés en el Quindío 2015Observatorio de Cafés en el Quindío 2015
Observatorio de Cafés en el Quindío 2015
Cámara de Comercio de Armenia y del Quindío
 
Capitulo 9
Capitulo 9Capitulo 9
Capitulo 9
eaceved5
 
150 Circuitos Electronicos
150 Circuitos Electronicos150 Circuitos Electronicos
150 Circuitos Electronicos
F Blanco
 

Andere mochten auch (19)

El templo del café (Ejemplo, Proyecto)
El templo del café (Ejemplo, Proyecto)El templo del café (Ejemplo, Proyecto)
El templo del café (Ejemplo, Proyecto)
 
Uribe el señor de las sombras
Uribe el señor de las sombrasUribe el señor de las sombras
Uribe el señor de las sombras
 
5 basico historia - zig zag - estudiante
5 basico   historia - zig zag - estudiante5 basico   historia - zig zag - estudiante
5 basico historia - zig zag - estudiante
 
Observatorio de Cafés en el Quindío 2015
Observatorio de Cafés en el Quindío 2015Observatorio de Cafés en el Quindío 2015
Observatorio de Cafés en el Quindío 2015
 
Observatorio de comercio exterior en el departamento del Quindío
Observatorio de comercio exterior en el departamento del QuindíoObservatorio de comercio exterior en el departamento del Quindío
Observatorio de comercio exterior en el departamento del Quindío
 
Capitulo 9
Capitulo 9Capitulo 9
Capitulo 9
 
Estudio de la industria agroalimentaria del Quindío
Estudio de la industria agroalimentaria del QuindíoEstudio de la industria agroalimentaria del Quindío
Estudio de la industria agroalimentaria del Quindío
 
Automasaje Mantak Chia
Automasaje  Mantak  ChiaAutomasaje  Mantak  Chia
Automasaje Mantak Chia
 
Manual del café
Manual del café Manual del café
Manual del café
 
Revista Ejército nº 896 Mes de noviembre
Revista Ejército nº 896 Mes de noviembreRevista Ejército nº 896 Mes de noviembre
Revista Ejército nº 896 Mes de noviembre
 
T7 metales
T7 metalesT7 metales
T7 metales
 
El poder-de-la-imagen-publica-ejemplar-electronico by-imagen-publica
El poder-de-la-imagen-publica-ejemplar-electronico by-imagen-publicaEl poder-de-la-imagen-publica-ejemplar-electronico by-imagen-publica
El poder-de-la-imagen-publica-ejemplar-electronico by-imagen-publica
 
PROYECTO CLIMATIZACIÓN
PROYECTO CLIMATIZACIÓNPROYECTO CLIMATIZACIÓN
PROYECTO CLIMATIZACIÓN
 
Procesos metacognitivos
Procesos metacognitivosProcesos metacognitivos
Procesos metacognitivos
 
150 Circuitos Electronicos
150 Circuitos Electronicos150 Circuitos Electronicos
150 Circuitos Electronicos
 
Materiales Askeland Ciencia E Ingenieria De Los Materiales 3 Edicion
Materiales   Askeland  Ciencia E Ingenieria De Los Materiales  3 EdicionMateriales   Askeland  Ciencia E Ingenieria De Los Materiales  3 Edicion
Materiales Askeland Ciencia E Ingenieria De Los Materiales 3 Edicion
 
Geotecnia para ingeniería civil y arquitectura
Geotecnia para ingeniería civil y arquitecturaGeotecnia para ingeniería civil y arquitectura
Geotecnia para ingeniería civil y arquitectura
 
Química inorgánica - Glen E. Rodgers
Química inorgánica - Glen E. RodgersQuímica inorgánica - Glen E. Rodgers
Química inorgánica - Glen E. Rodgers
 
Libro de química
Libro de químicaLibro de química
Libro de química
 

Ähnlich wie Delphi para PHP “en acción”

Manual de usuarios_de_eclipse_jenny
Manual de usuarios_de_eclipse_jennyManual de usuarios_de_eclipse_jenny
Manual de usuarios_de_eclipse_jenny
Jenny Martinez
 
Herramientas para el desarrollo de aplicaciones SharePoint
Herramientas para el desarrollo de aplicaciones SharePointHerramientas para el desarrollo de aplicaciones SharePoint
Herramientas para el desarrollo de aplicaciones SharePoint
goreorti
 

Ähnlich wie Delphi para PHP “en acción” (20)

Eymi paredes informe programacion
Eymi paredes informe programacionEymi paredes informe programacion
Eymi paredes informe programacion
 
Visual Basic
Visual BasicVisual Basic
Visual Basic
 
Manual visualfoxpro6
Manual visualfoxpro6Manual visualfoxpro6
Manual visualfoxpro6
 
Manual de eclpse emrt
Manual de eclpse emrtManual de eclpse emrt
Manual de eclpse emrt
 
Manual de usuarios_de_eclipse_jenny
Manual de usuarios_de_eclipse_jennyManual de usuarios_de_eclipse_jenny
Manual de usuarios_de_eclipse_jenny
 
Instructivo de exe lerning
Instructivo de exe lerningInstructivo de exe lerning
Instructivo de exe lerning
 
Paso a paso exerlearning
Paso a paso exerlearningPaso a paso exerlearning
Paso a paso exerlearning
 
Paso a paso exerlearning
Paso a paso exerlearningPaso a paso exerlearning
Paso a paso exerlearning
 
56874982 curso-de-delphi-7
56874982 curso-de-delphi-756874982 curso-de-delphi-7
56874982 curso-de-delphi-7
 
Elysaul yoris
Elysaul yorisElysaul yoris
Elysaul yoris
 
tutorial de eclipse
tutorial de eclipsetutorial de eclipse
tutorial de eclipse
 
Fundamentos del entorno_de_trabajo_de_visual_basic_y_del_lenguaje_en_si
Fundamentos del entorno_de_trabajo_de_visual_basic_y_del_lenguaje_en_siFundamentos del entorno_de_trabajo_de_visual_basic_y_del_lenguaje_en_si
Fundamentos del entorno_de_trabajo_de_visual_basic_y_del_lenguaje_en_si
 
Herramientas wed 2.0
Herramientas wed 2.0Herramientas wed 2.0
Herramientas wed 2.0
 
Tutorial eclipse
Tutorial eclipseTutorial eclipse
Tutorial eclipse
 
Informe programacion 10% adrian reinoza
Informe programacion 10% adrian reinozaInforme programacion 10% adrian reinoza
Informe programacion 10% adrian reinoza
 
Herramientas para el desarrollo de aplicaciones SharePoint
Herramientas para el desarrollo de aplicaciones SharePointHerramientas para el desarrollo de aplicaciones SharePoint
Herramientas para el desarrollo de aplicaciones SharePoint
 
Visual basic 6.0
Visual basic 6.0Visual basic 6.0
Visual basic 6.0
 
Visual basic 6.0
Visual basic 6.0Visual basic 6.0
Visual basic 6.0
 
Tutorial eclipse dc-(1)
Tutorial eclipse dc-(1)Tutorial eclipse dc-(1)
Tutorial eclipse dc-(1)
 
Phpstorm exposicion-villacres-michilena-alisson
Phpstorm exposicion-villacres-michilena-alissonPhpstorm exposicion-villacres-michilena-alisson
Phpstorm exposicion-villacres-michilena-alisson
 

Mehr von Embarcadero Technologies

Getting Started Building Mobile Applications for iOS and Android
Getting Started Building Mobile Applications for iOS and AndroidGetting Started Building Mobile Applications for iOS and Android
Getting Started Building Mobile Applications for iOS and Android
Embarcadero Technologies
 

Mehr von Embarcadero Technologies (20)

PyTorch for Delphi - Python Data Sciences Libraries.pdf
PyTorch for Delphi - Python Data Sciences Libraries.pdfPyTorch for Delphi - Python Data Sciences Libraries.pdf
PyTorch for Delphi - Python Data Sciences Libraries.pdf
 
Android on Windows 11 - A Developer's Perspective (Windows Subsystem For Andr...
Android on Windows 11 - A Developer's Perspective (Windows Subsystem For Andr...Android on Windows 11 - A Developer's Perspective (Windows Subsystem For Andr...
Android on Windows 11 - A Developer's Perspective (Windows Subsystem For Andr...
 
Linux GUI Applications on Windows Subsystem for Linux
Linux GUI Applications on Windows Subsystem for LinuxLinux GUI Applications on Windows Subsystem for Linux
Linux GUI Applications on Windows Subsystem for Linux
 
Python on Android with Delphi FMX - The Cross Platform GUI Framework
Python on Android with Delphi FMX - The Cross Platform GUI Framework Python on Android with Delphi FMX - The Cross Platform GUI Framework
Python on Android with Delphi FMX - The Cross Platform GUI Framework
 
Introduction to Python GUI development with Delphi for Python - Part 1: Del...
Introduction to Python GUI development with Delphi for Python - Part 1:   Del...Introduction to Python GUI development with Delphi for Python - Part 1:   Del...
Introduction to Python GUI development with Delphi for Python - Part 1: Del...
 
FMXLinux Introduction - Delphi's FireMonkey for Linux
FMXLinux Introduction - Delphi's FireMonkey for LinuxFMXLinux Introduction - Delphi's FireMonkey for Linux
FMXLinux Introduction - Delphi's FireMonkey for Linux
 
Python for Delphi Developers - Part 2
Python for Delphi Developers - Part 2Python for Delphi Developers - Part 2
Python for Delphi Developers - Part 2
 
Python for Delphi Developers - Part 1 Introduction
Python for Delphi Developers - Part 1 IntroductionPython for Delphi Developers - Part 1 Introduction
Python for Delphi Developers - Part 1 Introduction
 
RAD Industrial Automation, Labs, and Instrumentation
RAD Industrial Automation, Labs, and InstrumentationRAD Industrial Automation, Labs, and Instrumentation
RAD Industrial Automation, Labs, and Instrumentation
 
Embeddable Databases for Mobile Apps: Stress-Free Solutions with InterBase
Embeddable Databases for Mobile Apps: Stress-Free Solutions with InterBaseEmbeddable Databases for Mobile Apps: Stress-Free Solutions with InterBase
Embeddable Databases for Mobile Apps: Stress-Free Solutions with InterBase
 
Rad Server Industry Template - Connected Nurses Station - Setup Document
Rad Server Industry Template - Connected Nurses Station - Setup DocumentRad Server Industry Template - Connected Nurses Station - Setup Document
Rad Server Industry Template - Connected Nurses Station - Setup Document
 
TMS Google Mapping Components
TMS Google Mapping ComponentsTMS Google Mapping Components
TMS Google Mapping Components
 
Move Desktop Apps to the Cloud - RollApp & Embarcadero webinar
Move Desktop Apps to the Cloud - RollApp & Embarcadero webinarMove Desktop Apps to the Cloud - RollApp & Embarcadero webinar
Move Desktop Apps to the Cloud - RollApp & Embarcadero webinar
 
Useful C++ Features You Should be Using
Useful C++ Features You Should be UsingUseful C++ Features You Should be Using
Useful C++ Features You Should be Using
 
Getting Started Building Mobile Applications for iOS and Android
Getting Started Building Mobile Applications for iOS and AndroidGetting Started Building Mobile Applications for iOS and Android
Getting Started Building Mobile Applications for iOS and Android
 
Embarcadero RAD server Launch Webinar
Embarcadero RAD server Launch WebinarEmbarcadero RAD server Launch Webinar
Embarcadero RAD server Launch Webinar
 
ER/Studio 2016: Build a Business-Driven Data Architecture
ER/Studio 2016: Build a Business-Driven Data ArchitectureER/Studio 2016: Build a Business-Driven Data Architecture
ER/Studio 2016: Build a Business-Driven Data Architecture
 
The Secrets of SQL Server: Database Worst Practices
The Secrets of SQL Server: Database Worst PracticesThe Secrets of SQL Server: Database Worst Practices
The Secrets of SQL Server: Database Worst Practices
 
Driving Business Value Through Agile Data Assets
Driving Business Value Through Agile Data AssetsDriving Business Value Through Agile Data Assets
Driving Business Value Through Agile Data Assets
 
Troubleshooting Plan Changes with Query Store in SQL Server 2016
Troubleshooting Plan Changes with Query Store in SQL Server 2016Troubleshooting Plan Changes with Query Store in SQL Server 2016
Troubleshooting Plan Changes with Query Store in SQL Server 2016
 

Kürzlich hochgeladen

Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
241521559
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
FagnerLisboa3
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
silviayucra2
 

Kürzlich hochgeladen (10)

Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdf
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 

Delphi para PHP “en acción”

  • 1. Documento Técnico Delphi para PHP “en acción” José León, qadram software S.L. Diciembre 2009 Corporate Headquarters EMEA Headquarters Asia-Pacific Headquarters 100 California Street, 12th Floor York House L7. 313 La Trobe Street San Francisco, California 94111 18 York Road Melbourne VIC 3000 Maidenhead, Berkshire Australia SL6 1SF, United Kingdom
  • 2. 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.
  • 3. 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.
  • 4. 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.
  • 5. 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.
  • 6. 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.
  • 7. 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.
  • 8. 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.
  • 9. 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.
  • 10. 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.
  • 11. 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 ?> 
  • 12. 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
  • 13. 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.
  • 14. 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.
  • 15. 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.
  • 16. 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.
  • 17. 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>
  • 18. 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.
  • 19. 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.
  • 20. 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 ?> 
  • 21. 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.
  • 22. 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.
  • 23. 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.
  • 24. 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 ?> 
  • 25. 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.
  • 26. 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 } 
  • 27. 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.
  • 28. 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`) 
  • 29. 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.
  • 30. 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.
  • 31. 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.
  • 32. 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.
  • 33. Una vez hecho esto, guardamos el archivo, y si lo abrimos en un navegador web, esto es lo que veremos.
  • 34. 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.
  • 35. 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 
  • 36. 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:
  • 37. 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> 
  • 38. 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.
  • 39. 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.
  • 40. 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.
  • 41. 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
  • 42. 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(); 
  • 43. 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.
  • 44. 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.
  • 45. 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.
  • 46. 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; 
  • 47. 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.
  • 48. 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 support@qadram.com 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.