Calendario de symfony día nueve: Mejoras locales
====================================================
Previamente en symfony
----------------------
Durante el [día ocho](8.txt), agregamos interacciones AJAX a askeet sin ningún dolor, La aplicación es ahora bastante usable, pero podría usar un montón de pequeñas mejoras. Texto enriquecido debería permitirse en el `body` de la pregunta, y las claves primarias no deberían aparecer en las URIs. Todo esto no es difícil de acomodar con symfony: hoy será una buena ocasión para practicar lo que ya has aprendido, y verificar que ya conoces como manipular todas las capas de la arquitectura MVC.
Permitiendo texto enriquecido en preguntas y respuestas
-------------------------------------------------------
### Markdown
Los body de las preguntas y respuestas solo aceptan texto plano por ahora. Para permitir formateado básico - negrita, itálica, hyperenlaces, imágenes, etc, . utilizaremos una librería externa en lugar de reinventar la rueda.
Si ya has echado un vistazo a la documentación de symfony en formato de texto, probablemente sepas que somos grandes [Markdown](http://daringfireball.net/projects/markdown/) fans. Markdown es una herramienta de conversión de texto-a-HTML, y una sintaxis para el formateado de texto. La gran ventaja de Markdown sobre, por ejemplo, Wiki o sintaxis de foro, es que un archivo de texto markdown es muy legible:
Prueba de texto Markdown
------------------
Este es un **muy simple** ejemplo de [Markdown][1].
Lo mejor de markdown es su característica de _auto-escape_ para trozos de código:
enlace a symfony
>Los `<` y `>` son apropiadamente escapados como `<` y `>`,
>y no son interpretados por ninguna navegador
[1]: http://daringfireball.net/projects/markdown/ "Markdown"
El Markdown se procesa como sigue:
>Prueba de texto Markdown
>------------------
>
>Este es un **muy simple** ejemplo de [Markdown](http://daringfireball.net/projects/markdown/).
>Lo mejor de markdown es su característica de _auto-escape_ para trozos de código:
>
> enlace a symfony
>
>>Los `<` y `>` son apropiadamente escapados como `<` y `>`,
>>y no son interpretados por ninguna navegador
### Librería Markdown
Aunque originalmente escrito en [Perl](http://www.perl.com/), Markdown esta disponible como una librería PHP en [PHP Markdown](http://www.michelf.com/projects/php-markdown/). Ésta es la que utilizaremos. Descarga el archivo `markdown.php` y ubicalo en la carpeta `lib` del proyecto askeet (`askeet/lib`). Eso es todo: Ahora esta disponible a todas las clases de la aplicación askeet, suponiendo que la requires primero:
[php]
require_once('markdown.php');
Podríamos llamara a la conversión Markdown cada vez que mostramos el body de un mensaje, pero eso requeriría demasiada carga en nuestros server. En lugar convertimos el texto a HTML cuando la pregunta es creada, y guardamos la versión HTML del body en la tabla `Question`. Probablemente ya te hayas acostumbrando a esto, por lo que la extensión del modelo no será una sorpresa.
### Extender el modelo
Primero, agrega una columna a la tabla `Question` en el `schema.xml`:
[php]
Luego, regenere el modelo y actualice la base de datos:
$ symfony propel-build-model
$ symfony propel-build-sql
$ symfony propel-insert-sql
### Sobreescriva el método `setBody`
Cuando el método `->setBody()` de la clase `Question` es llamado, la columna `html_body` debe también ser actualizada con la conversión Markdown del texto del body. Abre el archivo del modelo `askeet/lib/model/Question.php`, y cree:
[php]
public function setBody($v)
{
parent::setBody($v);
require_once('markdown.php');
// strip all HTML tags
$v = htmlentities($v, ENT_QUOTES, 'UTF-8');
$this->setHtmlBody(markdown($v));
}
Aplicando la función `htmlentities()` antes de setear el HTML protege askeet de ataques cross-site-script (XSS) pues todos los tags `