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 `