El módulo Addthis de Drupal permite a los usuarios compartir el contenido de nuestro sitio en varias redes sociales. Por defecto el modulo crea enlaces que se encuentran al final de nuestro nodo.
¿Pero como podríamos hacer para mover estos enlaces arriba del nodo?
Vamos a crear una variable (template) $addthis que será disponible en node.tpl.php y eliminar la variable $links['addthis'] creada por el modulo Addthis. Después añadiremos esta nueva variable en node.tpl.php y si es necesario aplicaremos un style a esta variable.
La variable $links['addthis']
Si analizamos el módulo Addthis vemos que crea sus enlaces a través del hook_link() que justamente nos permite crear links en los nodos o en los comentarios.
<?php
/**
* Implementation of hook_link().
*/
function addthis_link($type, $node = NULL, $teaser = FALSE) {
//...
$links = array();
$links['addthis'] = array(
'title' => theme($addthis_widget_type, NULL, array(
'url' => url('node/' . $node->nid, array('absolute' => TRUE)),
'title' => $node->title,
)),
'html' => TRUE,
);
return $links;
}
?>Los links creados por el hook_link() (añadir un comentario, leer más…) se muestran debajo de los nodos en el archivo node.tpl.php como sigue:
<div class="node<?php if ($sticky) { print " sticky"; } ?><?php if (!$status) { print " node-unpublished"; } ?>">
<div class="content">
<?php print $content ?>
</div>
<?php if ($links): ?>
<div class="links"><?php print $links ?></div>
<?php endif; ?>
<?php if ($terms): ?>
<div class="taxonomy"><?php print "<span class='lostags'>Tags:</span> ".$terms ?></div>
<?php endif;?>
</div>
?>1. Crear una nueva variable ($addthis) y eliminar la antigua ($links['addthis'])
En nuestro archivo template.php, en nuestra función preprocess_node hook() vamos a crear la nueva variable $addthis ($variables['addthis']) que tomará los enlaces creados por el modulo Addthis en la variable $links['addthis'] ['title']. Después eliminaremos la variable $links['addthis'] y reconstruiremos la variable $links sin $links['addthis'].
<?php
function mytheme_preprocess_node(&$variables) {
if (!empty($variables['node']->links['addthis'])) {
// 1. Crear la variable $addthis disponible para el theme del nodo
$variables['addthis'] = $variables['node']->links['addthis']['title'];
// 2. Eliminar links['addthis'] de la variable $links y recrear la variable $links
unset($variables['node']->links['addthis']);
$variables['links'] = theme_links($variables['node']->links, array('class' => 'links inline'));
}
}
?>No se olviden cambiar mytheme por el nombre de su tema.
Una vez creada la variable, debemos reconstruir nuestro theme registry. Para ello solo debemos limpiar nuestro cache. Lo podemos hacer con el módulo devel, admin_menu o cache_browser. Si no tenemos estos módulos, podemos hacerlo via admin/settings/performance y hacer clic en el botón “Limpiar Cache”. Ahora nuestra nueva variable estará disponible en nuestro tema.
2. Poner nuestra nueva variable $addthis en nuestro archivo node.tpl.php
En el archivo node.tpl.php vamos a añadir nuestra nueva variable $addthis antes de la viariable $content.
...
<?php if ($addthis): ?>
<div class="addthis">
<?php print $addthis ?>
</div>
<?php endif; ?>
<div class="content">
<?php print $content ?>
</div>
...3. Aplicamos los estilos si es necesario
En el archivo css de nuestro tema, aplicamos el estilo para que la variable $addthis aparezca a la derecha.
<div class="content">
<?php print $content ?>
</div>“Voilà”. Ahora entendemos cómo funcionan los links en Drupal y como crear una nueva variable en nuestro theme layer.
Si tienen una pregunta, no dude en hacer un comentario. La comunidad Drupal está allí para ayudarles.
Referencias:
El módulo Addthis: http://drupal.org/project/addthis
El Hook hook_link(): http://api.drupal.org/api/drupal/developer--hooks--core.php/function/hoo...
La función template_preprocess_node(): http://api.drupal.org/api/drupal/includes--theme.inc/function/template_p...
El archivo node.tpl.php: http://api.drupal.org/api/drupal/modules--node--node.tpl.php/6



Comentarios
Que tal hacerlo con DS ?
Que opinión tienes de utilizar un módulo como Display Suite para lograr esto desde la interfaz web esto pensando en :
-Los usuarios menos experimentados.
-Mantener compatibilidad del tema cuando una nueva version sea publicada.
Saludos,
Jesus Manuel Olivas
@jmolivas
DS
Display Suite es sin duda una increíble API. Como siempre, deberíamos evaluar si requerimos de todas estas funcionalidades (performances) y el nivel del usuario guardando en mente que menos módulos siempre nos dará un mayor rendimiento.
Pero me gusta mucho DS para proyectos grandes. Context y Panels son también buenos candidatos en este caso (http://www.lullabot.com/articles/assembling-pages-with-drupal).
Saludos
module vs coding
Creo es un punto muy importante analizar y comparar las ventajas de utlizar un modulo vs escribir algo de codigo, aqui un articulo de Jacob Singh de acquia en relacion a este tema "module vs coding" http://www.jacobsingh.name/content/lazy-programmers
Yo en lo particular prefiero utilizar Context + Display Suite y ultimamente combinado con el tema Omega + Delta
Gracias por el link de lullabot interesante
Saludos,
Enviar un comentario nuevo