Joomla: Títulos HTML personalizables por página
14 de Enero de 2008 en Programación, PHP, Joomla
Lecturas: 11,799

JoomlaSiguiendo con los artículos de customización de Joomla entramos en otro tema controvertido: los títulos HTML en las páginas. Estos títulos que normalmente incluiríamos en la sección HEAD de una página web se determina automáticamente según el título del artículo o de la sección en la que estemos. Como mucho podemos especificar que Joomla agregue el título del sitio después del título del contenido, pero en ningún caso es completamente editable.
Éso comporta algún problema a nivel de SEO, no mucho si no nos preocupa, pero en mi caso el cliente quiere tener el control total sobre el título HTML que se muestra.
Así que siguiendo un pequeño tutorial en el foro de Joomla.org y algunas pinceladas mías he escrito un HowTo en castellano para poder personalizar totalmente dicho título HTML... y encima añadir su soporte al componente JoomFish de traducciones.

En primer lugar cabe decir que antes de meterme con ésto intenté la solución de Joomla SEF Patch creyendo (erróneamente) que me permitiría tener el control sobre los títulos HTML, así que puede que los números de línea sean incorrectos y es por éso que hago referencia a los nombres de las funciones y métodos, con su estado inicial.

1.- Crear un campo nuevo en la lista de parámetros
El primer paso es añadir un parámetro nuevo a la lista de parámetros de los componentes que nos interesen para poder personalizar el título. El texto a introducir es la definición del nuevo campo que se añadirá:

<param name="title_cust" type="text" size="20" default="" label="Título de la página" description="Un título personalizado a aplicar a la página, ésto permite títulos individuales por página" />

Los archivos que deberemos editar son los XMLs de configuración de los componentes a los que querremos personalizar el título HTML. En mi caso he pecado de "lo hago en todos", pero normalmente se querrá editar solamente los XMLs de los contenidos dinámicos (com_content) y estáticos (com_typedcontent). La lista entera es la siguiente:

-> administrator/components/com_menus/component_item_link/component_item_link.xml
-> administrator/components/com_banners/banners.xml
-> administrator/components/com_banners/com_contact/contact.xml
-> administrator/components/com_banners/com_contact/contact_items.xml
-> administrator/components/com_content/content.xml
-> administrator/components/com_frontpage/frontpage.xml
-> administrator/components/com_login/login.xml
-> administrator/components/com_massmail/massmail.xml
-> administrator/components/com_media/media.xml
-> administrator/components/com_menumanager/menumanager.xml
-> administrator/components/com_newsfeeds/newsfeeds.xml
-> administrator/components/com_poll/poll.xml
-> administrator/components/com_search/search.xml
-> administrator/components/com_syndicate/syndicate.xml
-> administrator/components/com_trash/trash.xml
-> administrator/components/com_typedcontent/typedcontent.xml
-> administrator/components/com_users/users.xml
-> administrator/components/com_weblinks/weblinks.xml
-> administrator/components/com_weblinks/weblinks_item.xml
En principio en todos los componentes de administrator/components que tengan un archivo de configuración XML

Ahora aparecerá un campo más en los parámetros de los componentes editados, pero aún no hará nada ;)

2.- Editar la llamada al setado del título
El setado del título se hace llamando a un método del objeto que construye la página. Este método se llama simplemente pasándole el título pero ahora necesitamos que reciba también la lista de parámetros para que recoja el título que le hemos especificado.
Para ello tenemos que editar el archivo components/com_content/content.php y sobre la línea 1676 encontramos el siguiente código:

PHP:
  1. // page title
  2. $mainframe->setPageTitle( $row->title );

Debemos modificarlo para que acepte también los parámetros:

PHP:
  1. // page title
  2. $mainframe->setPageTitle( $row->title, $params );

3.- Editar la función de setado del título
Ahora la función recibirá los parámetros. Debemos modificarla para que los acepte correctamente y recoja el posible título setado, si existe, y lo defina como tal. Para ello editamos el archivo includes/joomla.php y buscamos la declaración del método setPageTitle() que está dentro de la clase mosMainFrame sobre la línea 507:

PHP:
  1. function setPageTitle( $title=null ) {
  2.     if (@$GLOBALS['mosConfig_pagetitles']) {
  3.         $title = trim( htmlspecialchars( $title ) );
  4.         $title = stripslashes($title);
  5.         $this->_head['title'] = $title ? $GLOBALS['mosConfig_sitename'] . ' - '. $title : $GLOBALS['mosConfig_sitename'];
  6.     }
  7. }

Sustituiremos la función por la siguiente. Debemos poner especial atención en la propia declaración del método, que ahora debe aceptar un segundo parámetro, que serán los parámetros definidos en la administración (valga la redundancia):

PHP:
  1. function setPageTitle( $title=null, $params=null ) {
  2.     if (@$GLOBALS['mosConfig_pagetitles']) {
  3.         if ($params) {
  4.             $custom_title = $params->def( 'title_cust', '' );
  5.         } else {
  6.             global $database, $mainframe, $Itemid;
  7.             $params = new stdClass();
  8.             if ( $Itemid ) {
  9.                 $menu = new mosMenu( $database );
  10.                 $menu->load( $Itemid );
  11.                 $params = new mosParameters( $menu->params );
  12.             } else {
  13.                 $menu = "";
  14.                 $params = new mosParameters( '' )
  15.             }
  16.             $custom_title = $params->def( 'title_cust', '' );
  17.         }
  18.         $title = $custom_title ? $custom_title : $GLOBALS['mosConfig_sitename'] . ' - '. $title;
  19.         $title = trim( htmlspecialchars( $title ) );
  20.         $title = stripslashes($title);
  21.         $this->_head['title'] = $title ? $title : $GLOBALS['mosConfig_sitename'];
  22.     }
  23. }

Si nos fijamos, lo que hemos añadido es un checkeo para ver si recibimos el nuevo parámetro $params, y si es así recogemos el parámetro 'title_cust'. Si no intentará generar los parámetros según el estado actual del Item a mostrar para recoger el título definido. Y si aún así no hay título, pues setará el título que Joomla ya hacía de por sí.

4.- Asegurarnos que siempre se sete el título
Siguiendo el threat del tutorial original ví que no siempre se setaba el título. La forma para obligar siempre a setar el título pasa por llamar al método setPageTitle() justo después de crear el objeto que se encarga de montar la página. Así, editamos el archivo index.php situado en la raíz del Joomla (ojo, no el de la plantilla!) y sobre la línea 105 tenemos la inicialización del objeto MainFrame:

PHP:
  1. // mainframe is an API workhorse, lots of 'core' interaction routines
  2. $mainframe = new mosMainFrame( $database, $option, '.' );
  3. $mainframe->initSession();

Justo debajo añadiremos la siguiente línea:

PHP:
  1. $mainframe->setPageTitle();

Una vez realizado ésto ya podremos personalizar los títulos HTML de nuestras páginas.

5.- Añadir soporte para JoomFish
Si tenemos una web multilingüe nos daremos cuenta que no es correcto tener el contenido en un idioma y el título en otro... Para solucionar ésto debemos dar soporte a la traducción de los parámetros en la pantalla de traducción del JoomFish. Deacuerdo, no es muy correcto poder "traducir" todo el objeto de parámetros, pero digamos que es la forma fácil/rápida de darle soporte.
Para ello debemos añadir un nuevo campo en el archivo de configuración de la plantilla de traducción de contenido de JoomFish, editando el archivo XML administrator/components/com_joomfish/contentelements/content.xml y añadiendo la línea siguiente:

<field type="textarea" name="attribs" translate="1">Attributes (inc. Title Custom)</field>

Y dado que no sólo hemos editado los componentes de contenido sino que también otros componentes (ver paso 1) deberemos dar soporte también a ésos tipos de elementos en las traducciones añadiendo la siguiente línea:

<field type="textarea" name="params" translate="1">Atributos (inc. Title Custom)</field>

en los siguientes archivos:

-> administrator/components/com_joomfish/contentelements/category.xml
-> administrator/components/com_joomfish/contentelements/contact.xml
-> administrator/components/com_joomfish/contentelements/newsfeeds.xml
-> administrator/components/com_joomfish/contentelements/polls.xml
-> administrator/components/com_joomfish/contentelements/section.xml
-> administrator/components/com_joomfish/contentelements/weblinks.xml

Y ya tenemos soporte para la traducción del título. ¿Cómo lo traduciremos? Pues bién, al entrar en la traducción de un elemento, por ejemplo, un contenido, veremos una sección más debajo de todo dónde se vuelca todo el contenido de los parámetros. Uno de ellos es el título llamado title_cust. Debemos copiar TODO EL OBJETO y pegarlo en la caja de texto, separando cada parámetro por un salto de línea, y luego procedemos a traducir el título al idioma deseado.
Guardamos y listo!

Saludos.

Tag:
 Enviar a Fresqui

Leer los Comentarios

[ # 67940 ] Comment desde carlos manuel [24 de Abril de 2009, 08:44]

Buenas…. hice al pie de la letra todo lo que explicas aqui pero no me trabajo, al contrario quita las opciones en la pestaña Parametros, me gustaria saber si hay alguna otra manera de lograrlo gracias… pues quizas cometi algun error.

Escribe un Comentario





Estadísticas