<?xml version="1.0"?>
     <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
     <channel>
      <link>http://www.bitacora.gesbit.com/</link>
      <title>Bitácora de Gesbit - Entrada "Previa de los comentarios: cómo se hizo" de la bitácora</title>
      <generator>Gesbit</generator>
      <description>Bitácora del gestor de bitácoras</description>
      <atom:link href="http://www.bitacora.gesbit.com/rss/" rel="self"
       type="application/rss+xml" />
    
      <item>
       <link>http://www.bitacora.gesbit.com/previa-de-los-comentarios-como-se-hizo/</link>
       <guid>http://www.bitacora.gesbit.com/previa-de-los-comentarios-como-se-hizo/</guid>
       <pubDate>Sat, 12 Jan 2008 20:01:00 +0100</pubDate>
       <title><![CDATA[ Previa de los comentarios: cómo se hizo ]]></title>
       <description><![CDATA[<p>
Sobre la vista previa de los comentarios que permite ahora Gesbit he hablado en esta bitácora en más de una ocasión. Un ejemplo es el <a href="http://www.bitacora.gesbit.com/me-he-llevado-un-buen-chasco/" title="Entrada en esta bitácora">chasco que me llevé</a> con este asunto, y otro el <a href="http://www.bitacora.gesbit.com/vista-previa-de-los-comentarios/" title="Entrada en esta bitácora">anuncio de la esperada característica</a> en Gesbit. Quiero hablar ahora en esta entrada sobre todo esto, desde el punto de vista del programador.
</p>

<p><strong>De qué se partía</strong></p>

<p>
Empezaré comentando de qué se partía en Gesbit cuando se decide implementar la vista previa de los comentarios. En Gesbit los nuevos comentarios se procesan en un "script" que se encuentra entre los del apartado de administración de las bitácoras, concretamente, los nuevos comentarios se procesan en el script "comment-new.php".
</p>

<p>
¿Qué quiere decir que los comentarios se procesan en ese "script"? Quiere decir que el formulario para nuevos comentarios, que a su vez se imprime en el "script" "comments.php" de los temas de Gesbit, dicho formulario, tiene su atributo "action" apuntando al "script" "comment-new.php". En este "script", por tanto, se recogen los datos del formulario, se validan, y, llegado el caso, se inserta el nuevo comentario en la base de datos, o, si se detecta alguno, se muestra al usuario un mensaje de error.
</p>

<p>
Entonces tenemos dos "script", digamos, complementarios, implicados en el asunto. En uno se imprime el formulario que ha de ser rellenado para publicar nuevos comentarios, y en el otro se procesa el formulario, se inserta el comentario, si los datos son válidos. Digamos que "se sale" del "script" que está mostrando el formulario de nuevos comentarios al usuario, "nos vamos" al "script" que se encarga de su proceso, y "perdemos" contacto con el primero.
</p>



<p><strong>Una mala solución</strong></p>

<p>
Después de varios intentos infructuosos, como suele decirse, parecía que todo empezaba a pintarme bien, porque me pareció haber dado con una posible solución. Solución que luego se demostró cuando menos parcial, y que implicaba bastantes cambios en Gesbit, incluso la desaparición (aunque premeditada) del "script" "comment-new.php", en vista de que ya no se creía necesario.
</p>

<p>
Esta solución pasaba por procesar el formulario en el mismo "script" en que se imprimía. De modo que en el "script" "comments.php" del tema de Gesbit se usara, entre otros, un método de la clase "G" de Gesbit, encargado de realizar el proceso del formulario. Además, en el mismo "script", usando otro par de métodos de nuevos métodos de la mencionada clase, podía "comprobarse" si el usuario quería ver una vista previa del comentario, y así se hacía, y todo parecía ir bien.
</p>

<p>
Hasta que me di cuenta de que había olvidado algo. Fue muy sencillo reutilizar el código del desaparecido "script" "comment-new.php" en un nuevo método de la clase "G", pero, había olvidado algo importante: la salida de la aplicación, que ya se había producido, en parte, cuando se ejecutaba este método. Una de las tareas del "script" "comment-new.php" es redireccionar al usuario a su nuevo comentario, recién este sea publicado, efectivamente.
</p>

<p>
Para esto último se hace uso de la función "header()" de <a href="http://www.php.net/" title="PHP.net">PHP</a>, previo "cálculo" del enlace permanente del comentario recién publicado. Pero, esto podía hacerse perfectamente en "comment-new.php", porque este "script" no producía ninguna salida, y, como sabes, la función "header()" (que envía cabeceras HTTP) no funciona una vez se ha producido alguna salida hacia el cliente.
</p>

<p>
De modo que la solución parecía muy buena, pero, era parcial, puesto que ya no podía usar la función "header()", ya no podía redirigir al usuario al comentario que acababa de publicar, y, además de esto, mejor dicho, una vez descubierto esto, que cayó como un jarro de agua fría a destiempo, me di cuenta de que habían sido necesarios muchos cambios, demasiados cambios, y no podía dejar las cosas así: la solución que me parecía estupenda no lo era en realidad. 
</p>

<p><strong>La solución actual</strong></p>

<p>
Luego de volverme atrás, luego de actualizar "las fuentes" de nuevo (había considerado la solución anterior válida y la había dado por buena, sin duda, precipitadamente), dejé de pensar en el asunto, mejor dicho, di por bueno que me había equivocado, pero, que, no pasaba nada, que en otra ocasión sería. Y en estas estaba (y con todo a punto para ponerme con otra solución) cuando se me encendió la bombilla.
</p>

<p>
Y salió en mi ayuda JavaScript. Lo tenía enfrente de mis narices, pero, no era capaz de verlo. Los cambios que había que llevar a cabo en realidad eran mínimos, y, el principal, era añadir un botón al formulario de nuevos comentarios, botón que el usuario pulsaría para ver una vista previa de su comentario, no para publicarlo. ¡Y en el botón estaba la solución!
</p>

<p>
A lo menos la solución que ahora mismo se implementa en Gesbit. Todo se mantiene igual. El "script" "comment-new.php" sigue procesando los nuevos comentarios. No ha sido necesario ahí ningún cambio en absoluto. El "truco" consiste en que el botón "Vista previa" del formulario "cambia" el atributo "action" del propio formulario, de modo que este se procese en la misma "URL" en que el usuario se encuentra.
</p>

<p>
Digo en la misma "URL" porque en realidad no se trata de ningún "script". Rompería esta entrada si ahora me pusiera a explicar cómo se conforman las "URL" en Gesbit, pero, ahora esto es lo de menos. Lo importante es que al hacer, simplemente, es el "script" "comments.php" del tema de Gesbit, quien, apoyado en un par de métodos de la clase "G", se encarga de comprobar si lo que el usuario quiere es ver una vista previa de su comentario.
</p>

<p>
Los datos del formulario llegan a la "URL" correspondiente, el "script" "comments.php" lo "nota", y, con ayuda de la clase "G" se encarga de mostrar al usuario la vista previa de su comentario. Vista previa que es completamente "real", puesto que se hacen uso de los mismos filtros que se harían en caso de mostrar el comentario ya publicado, "plugins" de Gesbit incluidos.
</p>

<p>
Por si fuera poco se mataron dos pájaros de un tiro, puesto que, al llegar a la "URL" los datos del formulario para nuevos comentarios, estos pueden mostrarse en sus casillas correspondientes, de modo que no se pierden, si ya habías escrito tu dirección de correo electrónico, esta volverá a estar donde corresponde, no tendrás que escribirla de nuevo. Pareciera que así tendría que ser, pero, recuerda que los formularios se procesan "fuera" de la "URL" en que se esté, y al volver a dicha "URL", dependiendo del navegador, esos datos se pierden.
</p>

<p>
Esto último no está todavía del todo bien mirado. Quiero decir que si no usas la vista previa y pulsas el botón "Publicar", si ocurre algún error (por ejemplo, te equivocaste al escribir el código "CAPTCHA"), Gesbit lo advertirá (desde "comment-new.php") y, al volver atrás, al regresar al formulario, ya digo, dependiendo del navegador, es posible que hayas perdido todos los datos, erróneos o no.
</p>

<p>
En fin. Me ha quedado una entrada demasiado larga. No sé si podrá servir de algo o no, puesto que no he mostrado código alguno, y, al fin y al cabo, hablo de Gesbit, no de algo "en general". En todo caso el <a href="http://www.bitacora.gesbit.com/descarga/" title="Código fuente de Gesbit">código de Gesbit está disponible</a>, si alguien quiere echar un vistazo a los "scripts" mencionados, por ejemplo. Tal vez a mí me haya servido para sacarme alguna espinita, o sea, que me apetecía. Uno escribe para uno, o eso dicen. Espero que no haya sido del todo así en este caso.
</p>]]></description>
      </item>
      
     </channel>
    </rss>