viernes, 14 de febrero de 2014

Estableciendo la codificación de nuestro portal

Los no anglo-parlantes nos vemos siempre en la problemática de los acentos, la codificación UTF-8 no los admite, se ha de hacer una conversión previa a esa codificación.
El problema es aún más grave si, como veremos, al usar diccionarios de traducción cuando se crean formularios si los campos tienen acentos veremos que no aparecen correctamente, y eso es debido a la función gettext que espera un tipo de codificación y encuentra caracteres que no son válidos.

Recordemos nuestra clase Bootstrap la cual dijimos que nos permitiría definir parámetros de configuración tanto de entorno como de componentes en concreto como nuestras vistas. Así si incluimos la codificación en esta clase, en la función encargada de la creación de las vistas (_initView), el problema queda solucionado.

Contenido del fichero application/Bootstrap.php:
<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
 protected function _initView()
 {
  // Initialize view
  $view = new Zend_View();
  $view->doctype('XHTML1_STRICT');
  $view->headTitle('Centro de Documentación');
  $view->skin = 'liquid';
  // Add it to the ViewRenderer
  $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
    'ViewRenderer'
  );
  $viewRenderer->setView($view);
  // Return it, so that it can be stored by the bootstrap
  $view->setEncoding('ISO-8859-1');
  return $view;
 }
}

Ahora sí que podremos ver nuestro título con sus acentos.
Otra forma totalmente válida es incluir estos parámetros en nuestro application.ini, podría quedar más elegante, es una forma de centralizar los parámetros de configuración en un mismo lugar y desvincularlos del código, para que no tengamos que recorrer todo nuestro código buscando allí donde definimos tal parámetro.
Añadimos en el fichero application/configs/application.ini en la sección production las siguientes líneas:

resources.view.encoding = "ISO-8859-1"
resources.view.doctype = "XHTML1_STRICT"
resources.view.contentType = "text/html;charset=ISO-8859-1"
resources.view.Content-Language = "es_ES"
resources.view.headTitle = "Centro de documentación"

Ahora toca modificar nuestra clase Bootstrap para que lea estos parámetros:
Contenido del fichero application/Bootstrap.php:

<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
 protected function _initView()
 {
 // Initialize view     
     $options = $this->getOptions();
     if (isset($options['resources']['view'])){
         $view = new Zend_View($options['resources']['view']);
     }
     else {
         $view = new Zend_View;
     }
     if (isset($options['resources']['view']['doctype'])) {
         $view->doctype($options['resources']['view']['doctype']);
     }
     if (isset($options['resources']['view']['contentType'])) {
         $view->headMeta()->appendHttpEquiv('Content-Type',$options['resources']['view']['contentType']);
     }
     if (isset($options['resources']['view']['Content-Language'])) {
      $view->headMeta()->appendHttpEquiv('Content-Language',$options['resources']['view']['Content-Language']);
     }
     if (isset($options['resources']['view']['headTitle'])) {
      $view->headTitle($options['resources']['view']['headTitle']);
     }
     $view->skin = 'liquid';
     // Add it to the ViewRenderer
     $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
       'ViewRenderer'
     );
     $viewRenderer->setView($view);
     // Return it, so that it can be stored by the bootstrap
     return $view;
 }
}

Podemos ver que la instrucción setEncoding ha desaparecido, deja de tener sentido dado que le pasamos al constructor de la vista la codificación.
Al probar de nuevo la página no hemos de apreciar ningún cambio, podemos verificar que deja de funcionar la codificación ISO-8859-1 si eliminamos la línea resources.view.encoding del fichero applicaction.ini.
Sólo nos queda ir al fichero layout.phtml y elminar la línea que especifica la codificación, pues si vemos el código fuente HTML de la página resultante veremos que aparece repetido.

Contenido del fichero application/layouts/scripts/layout.phtml:

<?php
echo $this->doctype ();
?>
<html>
<head>
<?php
$this->loadSkin ( $this->skin );
echo $this->headMeta ();
echo $this->headTitle ();
echo $this->headScript ();
echo $this->headLink ();
?>
</head>

Ya que estamos y para finalizar la configuración del entorno podemos incluir el skin utilizado en nuestro fichoer application.ini de la misma forma que hemos hecho con la codificación.
Añadimos en el fichero application/configs/application.ini en la sección production la siguiente línea:

resources.view.skin = "liquid"
Ahora solo es necesario cargar en skine en la clase Bootstrap.

Contenido final de la clase Bootstrap en el archivo application/Bootstrap.php:

<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
 protected function _initView()
 {
 // Initialize view     
     $options = $this->getOptions();
     if (isset($options['resources']['view']))
         $view = new Zend_View($options['resources']['view']);
     else
         $view = new Zend_View;
     if (isset($options['resources']['view']['doctype'])) 
         $view->doctype($options['resources']['view']['doctype']);
     if (isset($options['resources']['view']['contentType']))
         $view->headMeta()->appendHttpEquiv('Content-Type',$options['resources']['view']['contentType']);
     if (isset($options['resources']['view']['Content-Language'])) 
      $view->headMeta()->appendHttpEquiv('Content-Language',$options['resources']['view']['Content-Language']);
     if (isset($options['resources']['view']['headTitle'])) 
      $view->headTitle($options['resources']['view']['headTitle']);
     if (isset($options['resources']['view']['skin']))
      $view->skin = $options['resources']['view']['skin'];
     else       
      $view->skin = 'liquid';
     // Add it to the ViewRenderer
     $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
       'ViewRenderer'
     );
     $viewRenderer->setView($view);
     // Return it, so that it can be stored by the bootstrap
     return $view;
 }
}

No hay comentarios:

Publicar un comentario