Drupal

Hook_theme a Drupal 7 i Drupal 8

A Drupal 7/8 disposem del hook_theme per poder de definir com imprimir un conjunt de dades en format HTML.

Drauta agencia digitalDrauta

Hook_theme a Drupal 7 i Drupal 8

Com utilitzar el hook_theme a Drupal 7 i Drupal 8?

Per exemple, el nucli de Drupal i diversos mòduls contribuïts defineixen les seves plantilles o funcions de tematització per imprimir un paginador, una taula de dades, un menú, etc. En qualsevol moment, a través del "hook" esmentat podem definir una manera personalitzada d'imprimir les nostres dades o d'imprimir dades d'altres mòduls de forma diferent. Per fer-ho tenim dues opcions:

  • Fitxer de plantilla: Definim com s'imprimeixen les dades a través d'un fitxer de plantilla. Únic mètode vàlid a Drupal 8 perquè obliga a separar clarament el tractament de les dades de la seva visualització.
  • Funció de tematització: Definim com s'imprimeixen les dades a través d'una funció. Aquest mètode només és vàlid a Drupal 7 i no es tan elegant donat que permet barrejar codi HTML amb codi PHP.

A continuació podem veure un exemple d'implementació del hook_theme a Drupal 7. Aquí podem veure com definim una manera personalitzada d'imprimir enllaços a partir de tres variables: href, class i title.

<?php
/**
 * Implements hook_theme().
 */

function MODULE_NAME_theme() {
   
  // Opció 1: Fitxer de plantilla
  $themes['customlink'] = array(
    'variables' => array('href' => NULL, 'class' => NULL, 'title' => NULL),
    'template' => 'customlink', //Nom del fitxer de plantilla.
    'path' => drupal_get_path('module', 'MODULE_NAME') . '/templates', //Ubicació del fitxer.
  );

  // Opció 2: Funció de tematització
  $themes['custom_link_bis'] = array(
    'variables' => array('href' => NULL, 'class' => NULL, 'title' => NULL),
    'file' => 'MODULE_NAME.themable.inc', // Ubicació de la funció.
  );

  return $themes;
}

Contingut del fitxer templates/customlink.tpl.php:

<a href="<?php print $href;?>" class="<?php print $class;?>"><?php print $title;?></a>

Contingut del fitxer MODULE_NAME.themable.inc

<?php
/**
 * Renderització d'un link de forma personalitzada (Opció 2).
 *
 * @ingroup themeable
 */
function theme_custom_link_bis($variables) {
  $href = $variables['href'];
  $class = $variables['class'];
  $title = $variables['title'];
  
  $output = '<a href="'. $href .'" class="' . $class . '">' . $title . '</a>';

  return $output;
}

Aleshores, per fer ús d'aquesta nova manera d'imprimir un enllaç, haurem de fer el següent:

<?php

$params = array(
  'href' => 'drauta.com',
  'class' => 'external',
  'title' => 'Drauta website'
);

// Opció 1
$output = theme('customlink', $params);
print $output;

// Opció 2
$output = theme('custom_link_bis', $params);
print $output;

 

Vols començar un nou projecte amb nosaltres?

Necessites un servei per a la teva web? Descobreix com et podem ajudar i no dubtis en contactar amb nosaltres.