Maestros del Web


Estás en Inicio / Editorial / PHP

11.09.2007

El framework Symfony, una introducción práctica (II parte)

En la primera parte de este artículo, se instaló Symfony, se configuró el servidor web y se creó la parte de administración de la aplicación de ejemplo. En esta segunda parte, se crean algunas funcionalidades de la parte pública de la aplicación, detallando el funcionamiento de los módulos, las plantillas y las acciones.

Crear la parte pública del blog

La parte pública del blog se va a programar manualmente aprovechando las utilidades de Symfony. En primer lugar, se crea el esqueleto de los dos módulos que forman la aplicación frontend mediante los comandos:

> symfony module frontend articulo
> symfony module frontend comentario

Ahora, si se accede a la dirección http://blog/articulo se ve la página de bienvenida por defecto del módulo creado. Cada uno de los módulos se subdivide en acciones, de forma que su desarrollo sea más estructurado.

El módulo articulo de la aplicación frontend debería disponer, por ejemplo, de las acciones “listar” (que muestra un listado de todos los artículos) y “mostrar” (que muestra los detalles de un artículo concreto).

Las acciones de cada módulo se incluyen en su archivo actions/actions.class.php. Cada acción se define mediante una función cuyo nombre comienza siempre por “execute“, por lo que el siguiente código añade las dos nuevas acciones:

// En apps/frontend/modules/articulo/actions/actions.class.php
public function executeListar()
{
}

public function executeMostrar()
{
}

El archivo actions.class.php contiene una acción por defecto llamada index y que muestra la página principal del módulo. En este caso, la página principal debería mostrar el listado de artículos, por lo que la acción index se va a redirigir a la acción listar:

public function executeIndex() {
  $this->forward('articulo', 'listar');
}

¿Qué página HTML muestra una acción cuando se ejecuta?

Evidentemente, depende de la acción concreta que se está ejecutando y también del resultado de la acción (resultado correcto, error, etc.). Las páginas se guardan en forma de plantillas en la carpeta templates de cada módulo.

El nombre de cada plantilla se forma mediante: nombre_de_la_accion + Resultado_de_la_accion. Cuando la acción listar obtiene un resultado correcto (”success” en inglés), se carga la plantilla listarSuccess.php. Si se crea ese archivo con el siguiente contenido:

<h1>Bienvenido a mi blog</h1>

Al cargar en el navegador la dirección http://miblog/articulo/listar o http://miblog/articulo, se mostrará esa página básica con el mensaje de bienvenida. A continuación, se obtiene la lista de artículos de la base de datos y se pasan a la plantilla para que pueda mostrarlos:

public function executeListar()
{
  $c = new Criteria();
  $articulos = ArticuloPeer::doSelect($c);

  $this->articulos = $articulos;
}

Pasar variables a una plantilla es tan fácil como establecer sus valores en la variable $this dentro de la acción. De esta forma, la instrucción $this->articulos = $articulos; permite que la plantilla asociada a esta acción disponga de una variable llamada $articulos con todos los artículos de la base de datos.

Las clases de tipo Peer (como ArticuloPeer) son las que se generan automáticamente mediante el comando symfony propel-build-model y permiten acceder a la base de datos utilizando objetos en vez de SQL.

La sintaxis que se utiliza para acceder a los datos es la que define el ORM Propel. Básicamente, el proceso consiste en crear un objeto de tipo Criteria() para establecer las condiciones utilizadas para obtener los registros de la tabla.

En este caso se quieren obtener todos los artículos, por lo que se construye un objeto vacío sin condiciones que se pasa directamente al método doSelect(), que es el que realiza la búsqueda en la base de datos (las dos instrucciones anteriores son equivalentes a realizar una consulta de tipo SELECT * FROM blog_articulo).

Ahora, sólo hace falta modificar la plantilla de esta acción (archivo listarSuccess.php) para que muestre los detalles de los artículos:

<h1>Bienvenido a mi blog</h1>

<?php foreach($articulos as $articulo): ?>
  <h2><?php echo $articulo->getTitulo() ?></h2>
  <p><?php echo $articulo->getContenido() ?></p>
<?php endforeach; ?>

El código de la plantilla anterior utiliza la sintaxis alternativa de foreach, que es una buena práctica para conseguir una mejor separación entre el código PHP y las etiquetas HTML. De esta forma, los diseñadores sin conocimientos de programación pueden manipular más fácilmente el marcado XHTML de las plantillas.

Si se vuelve a cargar la página http://miblog/articulo se observa el listado de todos los artículos de la base de datos. ¿Cómo se puede mejorar el listado de artículos? Mostrando por ejemplo sólo un resumen de su contenido y añadiendo un enlace al artículo completo. Aquí es donde se introduce el concepto de “helper“, funciones PHP sencillas que aportan utilidades para las plantillas:

<?php use_helper('Text') ?>

<h1>Bienvenido a mi blog</h1>

<?php foreach($articulos as $articulo): ?>
  <h2><?php echo $articulo->getTitulo() ?></h2>
  <p><?php echo truncate_text($articulo->getContenido(), 200) ?></p>
  <?php echo link_to('Continuar leyendo...', 'articulo/mostrar?id='.$articulo->getId()) ?>
<?php endforeach; ?>

El helper truncate_text() trunca el texto que se le pasa según el máximo número de caracteres indicado. Se trata de un helper que pertenece al grupo de las funciones relacionadas con el texto.

Para optimizar el rendimiento de la aplicación, Symfony sólo carga los helpers más utilizados (entre los que no se incluyen los del texto), por lo que para emplear helpers de texto, se deben incluir explícitamente estos helpers mediante la instrucción <?php use_helper('Text') ?>. El otro helper utilizado y que siempre se puede utilizar directamente es link_to(), que se emplea para construir enlaces internos.

Aunque las posibilidades para construir enlaces son ilimitadas (más adelante se detallan algunas de ellas) la forma más simple de construir un enlace interno es indicar el nombre del módulo, el nombre de la acción y los parámetros que se quieren pasar en la URL. El valor articulo/mostrar?id=XXXX se convierte en una URL de tipo /articulo/mostrar/id/XXXX en el entorno de producción.

Si se ejecuta la aplicación en el entorno de desarrollo, la URL generada sería /frontend_dev.php/articulo/mostrar/id/XXXX. Utilizando el helper link_to(), Symfony se encarga de construir URL correctas y limpias en función del entorno en el que se ejecuta la aplicación en cada momento.

El enlace articulo/mostrar/id/xxx que se ha incluido en la plantilla anterior, enlaza con la acción mostrar del módulo articulo. Dentro de esta acción, se obtiene el id del artículo a partir de la URL, se busca el artículo y se pasan sus datos a la plantilla:

public function executeMostrar()
{
  $id = $this->getRequestParameter('id');
  $articulo = ArticuloPeer::retrieveByPk($id);

  $this->forward404Unless($articulo);

  $this->articulo = $articulo;
}

En primer lugar, la acción obtiene el parámetro id de la URL mediante el método getRequestParameter(). Utilizando este parámetro, que es el identificador único del artículo, se busca directamente el artículo mediante el método retrieveByPK(), que obtiene una fila de la tabla de datos a partir del valor de su clave primaria.

Si el artículo obtenido no existe o no es válido, es una buena práctica redirigir al usuario a la página de error 404, lo que se consigue con la función forward404Unless(). Si el artículo es válido, la acción lo pasa a la plantilla mostrarSuccess.php, cuyo código se muestra a continuación:

<h1><?php echo $articulo->getTitulo() ?></h1>

<p><?php echo $articulo->getContenido() ?></p>

<?php echo link_to('Volver', 'articulo/listar') ?>

Aunque al principio parece que son muchos los archivos que se deben crear o modificar, en realidad se trata de desarrollar las aplicaciones de la forma más ordenada y estructurada posible. Separar las partes que forman una aplicación (base de datos, controlador, plantillas, etc.) simplifica su desarrollo, su mantenimiento y la actualización de su código.

Por último, las plantillas permiten definir y utilizar un layout, que no es más que una plantilla global que se aplica a todas las plantillas de la aplicación y que se encuentra en el archivo apps/[nombre aplicacion]/templates/layout.php.

Este layout es ideal para incluir todos los elementos invariantes de la aplicación: cabecera, logotipo, pie de página, menú de navegación, etc. Además, algunas de las partes que se repiten en las plantillas, como por ejemplo los menús de navegación, se pueden definir en elementos reutilizables llamados fragmentos.

La capa del modelo

El código mostrado anteriormente hace referencia a la capa del controlador (las acciones) y a la capa de la vista (las plantillas). El código responsable del acceso a los datos debe incluirse en la parte correspondiente al modelo, es decir, en las clases generadas automáticamente por Symfony para acceder a la base de datos.

De esta forma, el código mostrado en la acción anterior no debería acceder directamente a los datos, sino que debería delegar esta responsabilidad en la parte del modelo. Para ello, se modifica el código de la acción listar:

public function executeListar()
{
  $articulos = ArticuloPeer::getTodos();

  $this->articulos = $articulos;
}

Desde la acción (que forma parte del controlador) se llama a una función del modelo (clase ArticuloPeer). Para que la aplicación siga funcionando correctamente, se debe crear una función en el modelo que se llame getTodos() y que devuelva el listado completo de artículos que se encuentran en la base de datos. El código que hay que añadir a la clase lib/model/ArticuloPeer se muestra a continuación:

class ArticuloPeer extends BaseArticuloPeer
{
  public static function getTodos() {
    $c = new Criteria();
    $articulos = self::doSelect($c);
    return $articulos;
  }
}

Ahora que todo el código correspondiente al acceso a los datos se encuentra en la parte del modelo, es muy sencillo añadir otras funciones útiles para acceder a los datos:

class ArticuloPeer extends BaseArticuloPeer
{
  public static function getTodos() {
    $c = new Criteria();
    $articulos = self::doSelect($c);
    return $articulos;
  }

  public static function getRecientes($numero = 10) {
    $c = new Criteria();
    $c->addAscendingOrderByColumn(ArticuloPeer::CREATED_AT);
    $c->setLimit($numero);
    $articulos = self::doSelect($c);
    return $articulos;
  }

  public static function getSegunId($id) {
    $articulo = self::retrieveByPK($id);
    return $articulo;
  }
}

El método getSegunId() es el que utiliza la acción mostrar para obtener los datos de un artículo a partir de su identificador. El otro método getRecientes() puede ser utilizado por la acción listar para obtener un número limitado de artículos ordenados del más reciente al más antiguo.

Enlaces y sistema de enrutamiento

Una buena práctica tanto de usabilidad como de SEO para las aplicaciones web es la utilización de URL limpias y significativas. Symfony por defecto genera URL de tipo http://nombredominio.com/articulo/mostrar/id/5 en vez de las tradicionales URL tipo http://nombredominio.com/index.php?c=23423&s=a4j3h.

De hecho, el sistema de enrutamiento es otro de los puntos fuertes de Symfony, ya que ofrece unas posibilidades ilimitadas para generar de forma sencilla cualquier tipo de URL.

Las reglas que definen la forma en que se generan las URL se encuentran en el archivo apps/[nombre aplicacion]/config/routing.yml. El archivo contiene por defecto una serie de reglas básicas, como por ejemplo:

default:
  url:   /:module/:action/*

Esta regla es la que se aplica por defecto cuando se accede a una URL como las utilizadas anteriormente (articulo/listar, articulo/mostrar/id/5). La primera palabra de la URL se considera como el módulo que se quiere acceder y la segunda palabra es la acción concreta dentro de ese módulo.

Todas las reglas están compuestas obligatoriamente por un nombre, un patrón que indica mediante expresiones regulares las posibles URL a las que hace referencia esa regla y una serie de valores que se incluyen cuando el usuario realiza su petición.

Si se quiere modificar la URL anterior articulo/mostrar/id/5 por una URL más sencilla tipo articulo/mostrar/5, se debe incluir una nueva regla después de la regla homepage:

mostrar:
  url:   /articulo/mostrar/:id
  param: { module: articulo, action: mostrar }

El nombre de la regla (mostrar) se puede elegir de forma libre. El patrón de las URL utiliza los 2 puntos (:) delante de cada parte que debe considerarse como una variable.

En la URL anterior, la parte “articulo/mostrar” es fija para todas las URL de este tipo y la tercera parte de la URL puede ser “cualquier cosa” y será interpretada como una variable llamada id (en la acción correspondiente se utilizará este nombre de variable).

Para terminar de completar la regla de enrutamiento, sería bueno poder restringir los posibles valores de la variable id. Para ello, se utilizan expresiones regulares y la opción requirements:

mostrar:
  url:           /articulo/mostrar/:id
  param:         { module: articulo, action: mostrar }
  requirements:  { id: \d+ }

La expresión regular \d+ significa “uno o más números consecutivos”, por lo que la variable id podrá ser cualquier número entero y no podrá contener caracteres alfabéticos.

El nombre de las reglas también se puede utilizar para simplificar la forma en la que se incluyen los enlaces en las plantillas. Antes de poder utilizar las nuevas reglas, no olvides utilizar el entorno de desarrollo (frontend_dev.php) o borrar la caché de la configuración mediante el comando symfony cc.

<?php echo link_to('Continuar leyendo...', 'articulo/mostrar?id='.$articulo->getId()) ?>
<?php echo link_to('Continuar leyendo...', '@mostrar?id='.$articulo->getId()) ?>

Para insertar un enlace mediante el nombre de la regla, se utiliza su nombre prefijado con el símbolo "@". En este ejemplo sencillo las ventajas no parecen tan evidentes, pero cuando las URL son muy complejas, es mucho mejor utilizar el nombre de las reglas, en vez del nombre del módulo y de la acción.

Utilizando el nombre de la regla, se puede incluir fácilmente un enlace a la página principal del sitio mediante la siguiente instrucción: <?php echo link_to('Página principal', '@homepage') ?>. Utilizando los valores definidos por la opción param es muy sencillo cambiar la página principal de la aplicación para que vaya directamente al listado de artículos del blog:

homepage:
  url:   /
  param: { module: articulo, action: listar }

Ahora, cuando se accede a http://blog, la aplicación muestra directamente el listado de artículos, sin necesidad de tener que acceder a http://blog/articulo/listar. Si se accede a la aplicación en el entorno de producción, no te olvides borrar la cache de configuración con el comando symfony cc.

Archivos de log y depuración de aplicaciones

Independientemente de lo bueno o experimentado que sea el programador y de lo bueno y estable que sea el framework, durante el desarrollo de una aplicación siempre se cometen errores. Disponer de una buena herramienta para detectar la causa de los errores y las posibles mejoras en el rendimiento de una aplicación es lo que multiplica la productividad del desarrollo.

Cuando se accede a una aplicación en el entorno de desarrollo, Symfony crea un exhaustivo archivo de log en el que se recoge toda la información generada durante el procesamiento de la petición del usuario. Además, al acceder a cualquier página de la aplicación en el entorno de desarrollo, en la parte superior derecha de la ventana del navegador se muestra una barra de información y depuración como la de la siguiente imagen:

symfony1.jpg

La barra de depuración web está dividida en varias partes. En primer lugar, muestra el tiempo total que ha empleado Symfony en generar la página. Si se pincha sobre el tiempo indicado, se ve el detalle del tiempo utilizado por cada parte de Symfony (el controlador, la configuración de la aplicación, la vista, etc.).

La barra también incluye una parte llamada vars & config en la que se muestran todas las opciones de configuración del proyecto y de la aplicación, los parámetros de la petición del usuario, la configuración del servidor web, etc.

La parte más útil de la barra suele ser logs & messages en la que se muestran todos los mensajes de log que ha generado esta petición: parámetros recibidos, configuración que se ha cargado, regla de enrutamiento que se está utilizando, todas las consultas SQL realizadas a la base de datos, etc.

Imagina lo que te costaría abrir todos los archivos de log del servidor web y de la base de datos cada vez que quieres consultar un problema. Con Symfony, toda la información útil siempre está a 1 click de distancia:

symfony2.png

Si eres de los programadores más avanzados, seguramente utilizas aceleradores de PHP (eaccelerator, APC o Xcache) y herramientas de depuración como Xdebug.

Symfony se integra de forma transparente con todas estas herramientas y muchas otras, de manera que por ejemplo, la información generada por Xdebug se puede integrar automáticamente en la información de log generada por Symfony.

Plugins

Symfony es un framework muy completo que automatiza la mayor parte de las tareas habituales y repetitivas de las aplicaciones web. Por este motivo, ni Symfony ni ningún otro framework pueden incluir utilidades para cualquier característica específica de un proyecto.

Afortunadamente, no es necesario programar manualmente cualquier utilidad no incluida en el framework, ya que gracias a los plugins de Symfony, existen decenas de funcionalidades creadas por otros programadores y que se pueden reutilizar.

Todos los plugins disponibles son gratuitos, se instalan en menos de 1 minuto, funcionan igual de bien en cualquier sistema operativo y en general, están bien documentados.

Entre los más de 100 plugins disponibles, se encuentran por ejemplo SimpleBlog, que permite añadir un blog sencillo en cualquier aplicación, SimpleForum, que permite incluir un completo pero sencillo sistema de foros en cualquier aplicación Symfony y SimpleCMS, que pretende convertirse en un completo CMS (gestor de contenidos) para que los usuarios puedan gestionar los contenidos creados por ellos mismos en una aplicación Symfony.

Otras utilidades de Symfony

Los creadores de Symfony viven de programar aplicaciones reales para empresas utilizando su propio framework, por lo que son muy conscientes de lo importante que es conseguir un buen rendimiento.

Por este motivo, Symfony dispone de un espectacular sistema de cache, que abarca desde la caché de la configuración de las aplicaciones y la caché de fragmentos de las plantillas hasta el uso de las cabeceras HTTP 1.1 para controlar la caché en el navegador del usuario.

Los creadores de Symfony son europeos, lo que significa que conocen lo importante que es facilitar la creación de aplicaciones en múltiples idiomas. La internacionalización y localización de aplicaciones están completamente integradas en el framework.

De esta forma, es muy sencillo extender el modelo de datos para que soporte varios idiomas y la traducción de los elementos de la interfaz se realiza mediante gettext y el uso de diccionarios en formato XLIFF, un estándar que utilizan todas las empresas de traducción profesionales.

Symfony también dispone de numerosos helpers para incluir interacciones Ajax en las aplicaciones. Sin necesidad de conocer Ajax y sin escribir ni una sola línea de código JavaScript, cualquier programador puede incluir interacciones complejas realizadas mediante Ajax gracias a la integración de las librerías Prototype y script.aculo.us en Symfony.

Cualquier aplicación web de tamaño medio incluye decenas de formularios en sus módulos y acciones. Symfony dispone de numerosas utilidades para formularios: helpers para incluir elementos de formulario en las plantillas, relleno automático de datos y, sobre todo, un completo mecanismo de validación automática de los datos de un formulario.

Lo mejor de Symfony

  • Sólo funciona con PHP 5, lo que garantiza el máximo rendimiento y permite aprovechar PHP hasta el límite.
  • Ha sido probado en miles de aplicaciones personales, cientos de sitios web públicos y varias aplicaciones web con decenas de millones de usuarios, por lo que es escalable hasta cualquier límite (siempre que se dispongan de los recursos técnicos necesarios).
  • Se trata de software libre, con licencia MIT, con la que puedes desarrollar aplicaciones libres o comerciales.
  • Symfony dispone de una de las mejores documentaciones del mundo del software libre, ya que aúna cantidad, calidad, gratuidad y una actualización continua.
  • Programar bien con Symfony es muy sencillo, ya que simplifica al máximo la aplicación de patrones de diseño y buenas prácticas propias de los mejores programadores.
  • Internacionalización probada y completamente integrada en el framework.

Lo peor de Symfony

  • Antes de ser realmente productivo con Symfony y comprender su funcionamiento, es necesario dedicar un tiempo a su estudio. Todos los programadores que lo han hecho, han podido comprobar que Symfony devuelve multiplicada por 100 cada hora dedicada a su aprendizaje.
  • El ORM que utiliza por defecto no es ideal ya que su sintaxis es muy recargada. Existe un plugin para integrar un ORM alternativo llamado Doctrine y que será incluido en Symfony en cuanto se lance oficialmente de forma estable.

Conclusión

A pesar de su extensión, este artículo apenas cubre el 10% de las posibilidades de Symfony. Adentrarse en cada una de las partes que componen Symfony permite darse cuenta de que utilizando este framework se puede ser mucho más productivo, se puede crear código de mucha más calidad y que sea más fácil de mantener y actualizar. Symfony es un framework completo, estable, maduro y con una documentación excelente.

Referencias

La mejor referencia para aprender Symfony es el libro oficial del framework, que se puede comprar en papel (editorial Apress, ISBN-13: 978-1590597866) y que se puede leer gratuitamente en su versión original en inglés (The Definitive Guide to Symfony) y completamente traducido al español (Symfony, la guía definitiva).

También se puede leer el tutorial My First Project en el que se construye un blog completo y el tutorial de Askeet, una serie de 24 tutoriales de 1 hora cada uno con los que se construye una aplicación de preguntas y respuestas tipo web 2.0.

El grupo de usuarios de Symfony en español también es una buena referencia para resolver dudas sobre Symfony, problemas con el desarrollo de aplicaciones y cualquier otro aspecto relacionado con este framework.

El framework Symfony, una introducción práctica (I parte)

Califica esta nota:

1 estrella2 estrellas3 estrellas4 estrellas5 estrellas (23 votos, promedio: 4.74 de 5)
Loading ... Loading ...

Sobre el autor

Javier Eguiluz
Ingeniero de telecomunicaciones, programador y formador en tecnologías web a través de cursos, libros y su propio sitio web.

Si eres nuevo en Maestros del Web y te agradan nuestras publicaciones, te invitamos a suscribirte a nuestro Feed.

Sindícanos en: Google Reader, Bloglines, My Yahoo o My MSN | ¿Qué es el Feed?

Comentarios

28 comentarios en total.

  1. palotex 11.09.2007 - 02:43 - #

    Excelente articulo. Para ser una introduccion esta bastante bien, gracias maestrosdelweb.com

    Ojala sigan con esta serie de articulos sobre symfony.

  2. DooBie 11.09.2007 - 13:00 - #

    Lástima que solo sirva para PHP5, mi hosting actual no lo soporta… de momento.

  3. mario libertad 11.09.2007 - 20:30 - #

    Excelente Maestro del web, sigan por favor publicando artículos, clarifican muchas cosas del libro. Este artículo me enseño 3 a 4 cositas que no dominaba.

    Espero el próximo maestros.

  4. Alberto 14.09.2007 - 15:55 - #

    Muy buen tutorial, buen comienzo practico para quienes empezamos mas el libro que esta en español ya tenemos las herramientas para usar el mejor framework de php.

  5. juan 20.09.2007 - 17:28 - #

    falta el contenido de executeMostrar()
    asi como esta da error

  6. Javier Eguiluz 21.09.2007 - 04:56 - #

    Juan, tienes razón en que falta el código de ese método. Aquí está:

    public function executeMostrar()
    {
    $id = $this->getRequestParameter(’id’);
    $articulo = ArticuloPeer::retrieveByPk($id);

    $this->forward404Unless($articulo);

    $this->articulo = $articulo;
    }

  7. Frank R 21.09.2007 - 09:48 - #

    Excelente la iniciativa del tutorial, solo tengo una consulta de la segunda parte. Al crear la parte pública del blog y ejecutar:

    symfony module frontend articulo
    symfony module frontend comentario

    todo parece estar bien, pero al acceder a:
    http://blog/articulo o a la ruta por defecto, en mi caso http://localhost/articulo

    retorna

    Not Found

    The requested URL /articulo was not found on this server.

    Busco en el directorio del proyecto y no existe ninguna carpeta creada “articulo” o documento “articulo.php”, motivo por el cual no puedo continuar con los siguientes pasos del tutorial.

    Alguna sugerencia al respecto?

    Gracias anticipadas

  8. Alberto 21.09.2007 - 11:22 - #

    Hola tengo un problema, la funcion mostrar es esta
    public function executeMostrar()
    {
    $id = $this->getRequestParameter(’id’);
    $articulo=ArticuloPeer::getSegunId($id);
    $this->forward404Unless($articulo);
    $this->articulo = $articulo;
    }
    cuando le doy para ir al articulo me muestra la pagina de error, parece que no reciviera la variable porque si le asigno un valor a $id si funciona bien
    hace falta algo?

  9. Gamaliel 20.10.2007 - 22:55 - #

    Disculpen no entendi el paso “Crear la parte pública del blog”
    ¿Cual debe ser el contenido de: ?
    apps/frontend/modules/articulo/actions/actions.class.php

    yo entendi que debe de contener esto:

    class articuloActions extends sfActions
    {
    public function executeListar()
    {
    }
    public function executeMostrar()
    {
    }
    public function executeIndex()
    {
    $this->forward(’articulo’, ‘listar’);
    }
    }
    esto entendi hasta ese paso, pero me marca error.

    alguien me puede pasar el contendido de action.class.php?

  10. Neverwolf 24.10.2007 - 12:37 - #

    Muchísimas gracias por el tutorial. He empezado hace muy poco y me costaba mucho seguir el manual, pero con este tutorial he cazado todo a la primera. En serio, os lo agradezco :)

  11. Gabriel Lopez 26.10.2007 - 20:48 - #

    Hola el articulo me parece muy bueno, pero la verdad se me ha complicado instalar todo el paquete de linux para trabajar symfony me aparcen mutiples errores.. a que se debe estos errores? Gracias de antemano.

  12. andreav 20.11.2007 - 14:03 - #

    Hola!

    Quisiera ayuda de como poder realizar reportes con symfony?, si existe alguna herramienta, plugins, helpers, etc? o como es la manera de hacerlos, estoy trabajando bajo windows.

    ejemplo de lo que necesito hacer:

    id descripcion cantidad
    1 memorias 40
    2 disco duros 80 30
    3 mouses inalam 80

    gracias y espero puedan responderme.

  13. Esteve 03.01.2008 - 12:44 - #

    Excelente artículo en la misma línea que la parte 1

  14. Javiplay 09.01.2008 - 12:14 - #

    Me pasa como a Frank R, cuando voy a http://blog/frontend_dev.php/articulo
    me sale bien pero si voy a
    http://blog/articulo
    sale error 404 Not found aunque limpie la caché.

    Muy bueno el articulo

  15. Javiplay 09.01.2008 - 12:51 - #

    Vale, se me olvidó habilitar el modulo de apache rewrite… ok, magnifico articulo

  16. Carlos 22.01.2008 - 17:20 - #

    muy buena articulo, llevo apenas una semana de conocer este framework y me parece muy bueno…sigo haciendo algunas pruebas con el. Gracias por este buen articulo.

  17. {alcides 23.01.2008 - 08:40 - #

    muy bueno este articulo pero me gustaria saber un poco mas sobre como realizar filtros a los registros que se listan en un formulario gracias de antemano.

  18. laksjdg 03.02.2008 - 10:40 - #

    los comandos para la creacion de filtros en symfony,,, syudenme

  19. HM 26.02.2008 - 16:45 - #

    Frank R debes habilitar
    módulo mod_rewrite para reescribir las URL …
    y luego vuelve a probar …

  20. HM 26.02.2008 - 16:47 - #

    este artículo está buenísimo, creo q todos los princiantes en Symfony estaríamos muy agradecidos si continuan haciendo trabajos de esta naturaleza …

  21. Juan 22.04.2008 - 02:33 - #

    No se como modificar la acciones del boton save del generator.yml. Lo que quiero es que cuando se le de a guardar se guarden desde un tipe radio, si marca una opcion un valor y si marca la otra otro valor

  22. Juan 22.04.2008 - 02:41 - #

    mas especificamente, esta la opcion de incrementar en uno el nº de factura si escoje hacer una factura y en incrementar en 1 el nº de presupuesto si escoje hacer un presupuesto. Por favor contestarme si lo sabeis que llevo atrancao aki dos dias.
    Muxas gracias symfoneros

  23. Javier Velez 22.04.2008 - 07:43 - #

    Hola , bueno me gustaria muchisimo, que me aclararan algunos detalles de symfony. Hace unos cuantos dias estoy tratando de ver la integracion de cada capa en symfony, o sea la relacion, las clases responsables de acceder a cada una de ella cada ves que se hace una petición. Me gustaria saber como es el funcionamiento de symfony y la responsabilidad de las clases, desde acceder a la base de datos hasta los layout.

    Me gustaria que me respondieran a mi correo jvelez@estudiantes.uci.cu

    Gracias!!!!

  24. Javier Velez 22.04.2008 - 07:45 - #

    Me gustaria mucho saber si alguien sabe como ponerme en contacto con Javier Eguiluz

  25. manuel de vicente 30.04.2008 - 02:26 - #

    tengo el siguiente error y no se como se saca
    backend/articulo
    Oops! An Error Occurred
    The server returned a “500 Internal Server Error”.
    y si hago
    backend_dev.php7articulo me sale
    PROPER EXCEPTION
    Alguien sabe como desconecto esto.

  26. huspy 10.06.2008 - 05:31 - #

    Hola, alguien sabe como puedo utilizar php en la consola?:
    cuando escribo >php -v
    me dice: “php” no es un comando interno o externo, programa o archivo por lotes ejecutable.

    Al igual cuando intento instalar un nuevo proyecto en con el comando symfony:
    > symfony init-project miproyecto, me da el mismo mensaje de error pero con el comando “php.exe”, cosa que no escribo. No entiendo muy bien la consola. A ver si alguien me puede ayudar. Me han comentado que puede ser cosa de las variables de entorno, pero no se como va tampoco.
    Gracias!!!!!

  27. Luis 15.06.2008 - 20:09 - #

    Hola amigo muy bueno tuto tengo una duda como cambio el color de fondo de los botones generados los iconos se que los puedo cambiar en el generator.yml puedo tambien cambiarle el color de fondo desde alli ?

    Gracias por la ayuda ;)

  28. Oskar 12.09.2008 - 11:57 - #

    Hola a todos, es un muy buen tutorial, mis felicitaciones por ello.
    He estado probando hacer una aplicacion, pero cuando ejecuto la direccio http://localhos/blog no me muestra las imagenes y me da un error 500 la verdad ya no se por donde seguir

Deja tu Comentario


Maestros del Web se reserva el derecho de moderación de los comentarios. Evita utilizar palabras soeces, ataques directos, descalificativos, insultos, de lo contrario tu comentario será eliminado.


Anuncios por Q
-


Maestros del Web es el punto de encuentro para los entusiastas de la red.

Creative Commons by-nc-sa 3.0 | Política de Privacidad | CMS: Wordpress