Ayer os mostré mi pequeña odisea para instalar Symfony en WAMP o al menos el SandBox, hoy toca empezar a programar.

Sigo con el libro en español de symfony.es. En el capítulo cuarto la cosa se empieza a poner interesante, voy a empezar a enrear con Symfony jejejeje.

Bien, primero la teoría:

Symfony utiliza el sistema MVC (modelo, vista y controlador) para así poder separar la estructura de la web de los estilos y sobre todo de la lógica en php. ¿Hasta aquí todo bien?… sigamos… Para tener todo lo más organizado posible, symfony suele separar el backend del frontend (en realidad es lo normal), por ejemplo en una tienda virtual la administración (backend) está separada de la tienda que pueden ver los usuarios (frontend); pero symfony va un paso más allá, cada aplicación (backend, frontend o como quieras llamarlas) se subdivide en módulos, cada módulo puede contener una o varias páginas, es decir, la cesta de la compra de la tienda sería un módulo, el proceso de compra (identificación o registro del usuario, confirmación de los datos y los productos a comprar y el proceso de pago) sería también un módulo. Cada módulo se divide en dos partes, las acciones y las plantillas. En las acciones se guardará la lógica del módulo (las llamadas a la BD, los calculos que hubiese que realizar, etc) y en las plantillas se mostraría esa información.

Vamos con la práctica para entenderlo mejor:

En el libro indican que necesitamos abrir una cosola para poder crear el módulo (cuando me refiero a consola es a la ventana de MS-DOS de windows no que destripes la play xD). Bien vamos a ello:

Accedemos a la carpeta de nuestro proyecto, que por defecto es: C:\wamp\www\sf_sandbox y le damos la siguiente instrucción:

symfony generate:module frontend contenido

Esto significa:

symfony genera un módulo en la aplicación frontend llamada contenido.

Esto generará varias carpetas y algunos archivos. Puedes verlo accediendo a C:\wamp\www\sf_sandbox\apps\frontend\modules\contenido.

Como verás tenemos dos carpetas: actions y templates. En la carpeta actions tenemos un archivo llamado actions.class.php, aquí es donde crearemos toda la lógica del módulo; y en la carpeta templates tenemos el archivo indexSuccess.php donde está la estructura en html de nuestro módulo.

Abrimos el archivo actions.class.php. El nombre de cada acción comienza SIEMPRE (no se que tamño ponerle para que sepas que esto es importantísimo) por execute, esto es así simplemente por convección para que symfony lo entida, y poder diferenciarlo del resto de posibles funciones. Ahora mismo hay una acción creada llamada executeIndex, en realidad no nos sirve para nada y puedes borrarla o comentarla como quieras. Vamos a crear nuestra primera acción:

public function executeVer()
{
$hoy = getdate();
$this->hora = $hoy[‘hours’];
}

Esta acción nos dará la hora actual. Pero para poder mostrarla debemos crear la plantilla:

Si usas Dreamweaver, tendrás que crear una nueva página en html y borrar todo el contenido (Sí todo el html, las cabeceras y el resto de etiquetas, todo); si usas otro editor o el bloc de notas igual.

Escribimos lo siguiente en la plantilla:

<p>Hola Mundo</p>

Y guardamos la plantilla como verSuccess.php en la carpeta templates del modulo contenido, que es en el que estamos trabajando. Las plantillas se le añade el Success.php igual que el execute a las acciones, no lo olvides.

Ya podemos ejecutarlo en nuestro navegador escribe: localhost/sf_sandbox/web/frontend.php/contenido/ver y os debería aparecer vuestro “¡Hola Mundo!”.

Ale, muy bonito, ¿Ya os habeís autolaureado y satisfecho vuestro ego por lo buenos que sois? ¿si? pues sigamos…

Volvemos a la plantilla verSuccess.php que acabamos de crear y escribimos lo siguiente:

<?php if ($hora >=18): ?>
<p>Quizá debería decir buenas tardes. Ya son las <?php echo $hora ?>.</p>
<?php endif; ?>

Se me olvidaba comentar algunas reglas sobre las plantillas:

  • Las etiquetas para php deben empezar por <?php y acabar por ?>.
  • No se debe escribir código html con un echo o un print, de esta manera una persona que no sepa programar podrá modificar la estructura de la plantilla sin producir destrozos.
  • Para escribir bucles sólo se debería utilizar la síntasis alternativa.
  • Las plantillas tienen acceso directo a los atributos de la acción, por eso no hace falta incluir o declararlos.
  • No darles de comer después de las 12 de la noche, no mojarlos y no debe darles la luz del sol XD.

Guarda la plantilla si no lo has hecho aún y actualiza la página en  el navegador. Si la hora es mayor o igual a 18 te aparecerá la frase sino no.

Seguimos…

Vamos a crear un formulario para ver como serían con symfony:

En la plantilla verSuccess.php añadimos lo siguiente:

<form method=”post” action=”<?php echo url_for(‘contenido/Actualizar’) ?>”>
<label for=”nombre”>¿Cómo te llamas?</label>
<input type=”text” name=”nombre” id=”nombre” value=”” />
<input type=”submit” value”Ok” />
<?php echo link_to(‘Nunca digo mi nobre’,’contenido/actualizar?nombre=anonymous’,
array(
‘class’ => ‘enlace_especial’,
‘confirm’ => ‘¿Estás seguro?’,
‘absolute’ => true
)) ?>
</form>

Varias cositas:

  • Como puedes observar el valor del atributo action del formulario lo obtenemos a través de la función url_for(), esto es un helper o ayudante. La razón estriba en que las rutas podrían modificarse en un futuro y para evitar tener que ir plantilla por plantilla haciendolo manualmente esta función nos lo hace automáticamente.
  • Además de el ayudante para la url existe otro ayudante para crear links, link_to(); esta función tiene dor parámetros obligatorios: el texto a mostrar y la ruta del link (el parametro src de la etiqueta a en html). Además tiene un parámetro de opciones optativo, utilizando un array se pueden añadir más atributos de la etiqueta a o incluso alguna función en javascript como ahora veremos.

Pero antes…

Vamos al archivo de acciones y creamos esta nueva función:

public function executeActualizar($peticion)
{
$this->nombre = $peticion->getParameter(‘nombre’);
}

Y creamos una nueva plantilla llamada actualizarSuccess.php con el siguiente contenido:

<?php if ($sf_params->has(‘nombre’)): ?>
<p>Hola, <?php echo $sf_params->get(‘nombre’) ?>!</p>
<?php else: ?>
<p>¡Hola, Juan Pérez!</p>
<?php endif; ?>

Guardamos la nueva plantilla en la carpeta templates del módulo que estamos creando y cargamos la página con dirección localhost/sf_sandbox/frontend_dev.php/contenido/ver.

¿Porqué se accede a las páginas con esa ruta? Bueno, symfony en vez de utilizar frontend_dev.php?module=contenido&action=ver usa esto que es más útil para los navegadores, aunque se puede cambiar (de ahí que sea mucho mejor utilizar helpers para las rutas).

Bien, por último comentar que existe una forma abreviada de hacer el condicional de la plantilla actualizarSuccess.php:

<p>¡Hola, <?php echo $sf_params->get(‘nombre’, ‘Juan Pérez’) ?>!</p>

Esto lo que hace es añadir un parámetro optativo a la función get() del objeto $sf_params; en el caso que el primero no exista se muestra el segundo.

Pero lanza un error y estoy esperando haber si un alma caritativa me lo pueda solucionar, hasta entonces habrá que esperar.