Creare un filtro per i formati di testo di Drupal

I filtri processano il contenuto inserito nei campi di testo lungo per la sua visualizzazione. Sono uno strumento molto versatile: possono essere utilizzati sia per stampare blocchi di codice in mezzo al contenuto che per eseguire uno script PHP nel front-end.

I formati di testo invece, servono a creare gruppi di configurazione di filtri facilitando così la loro selezione sui campi di testo.

Anche se sul sito di Drupal troviamo migliaia di moduli sotto la categoria filters/editors a volte siamo costretti a dover sviluppare un modulo personalizzato per creare un nuovo filtro che riesca a soddisfare le esigenze richieste. Questo articolo non parlarà di questo, ma di un’altro modulo chiamato Custom filters.

Custom filter è un modulo poco popolare ma molto utile, semplice da utilizzare e con un potenziale infinito (o quasi). Custom filter serve a creare filtri personalizzati direttamente dall’interfaccia web di Drupal.

Creare un filtro con Custom filter

Il primo passo è quello di dare alcune informazioni sul filtro: nome, descrizione e i consigli per l’utilizzo che saranno visualizzati nella parte inferiore del campo di testo. Dopo di che, sarà necessario aggiungere delle regole indicando il pattern (testo da sostituire) e il testo di sostituzione (replacement text).

Sarà possibile, inoltre, compilare il campo replacement text con uno script PHP. Il risultato di questo script sarà utilizzato come testo di sostituzione.

Dopo aver creato il filtro, dovremmo attivarlo nella configurazione del formato di testo selezionato nel campo di testo.

Creare un filtro per generare links al interno del sito

Ci sono moduli che si occupano di questo, ma il fatto di crearlo con Custom filter renderà più semplice la personalizzazione del link. L’obiettivo è generare un filtro per facilitare la creazione di un link all’interno del sito. Il filtro sostituirà questo testo:

[get_alias node/add/contatti]

per questo:

http://miodominio.it/contattaci

Creare il nuovo filtro

Tipo: get_alias

Nome: get alias

Descrizione: Returns absolute url alias from a given path

Tips: Returns absolute url alias from a given path. Example: [get_alias node/add/contact]

Creare una nuova regola

Nome: get alias

Pattern:

/\[get_alias (.*)]/i

Selezionare PHP code

Replacement text:

$result = url($matches[1], array('absolute' => TRUE));

Attivare il nuovo filtro nel formato di testo

Andare su admin/config/content/formats e fare clic su configura nel formato di testo che stiamo utilizzando. Dopo di che, selezionare il filtro che abbiamo appena creato e salvare.

Configurazione di un formato di testo

Creare un filtro per inserire immagini nel contenuto

In questo esempio faremo lavorare un filtro di Custom filter insieme al modulo insert. L’idea è utilizzare il modulo insert modificando però il codice che inserisce dentro il campo di testo per poi processarlo con un filtro personalizzato.

In questo modo evitiamo di inserire i percorsi assoluti all’immagini direttamente nel contenuto, utilizzando invece il suo URI.

Creare un nuovo filtro

Tipo: image

Nome: Image

Descrizione: Insert images…

Creare una regola

Nome: Image

Pattern:

/\[image (.*)\|(.*)\|(.*)?\]/i

Selezionare PHP code

Replacement text:

$img_style = $matches[1];
$img_uri = $matches[2];
$img_title = $matches[3];

if (empty($img_title) || $img_title == "__title__") {
  $img_title = "";
}

if (!file_exists($img_uri)) {
  // image not found
  $result = "";
} else {
  $img_path = image_style_url($img_style, $img_uri);
  $img_colorbox_path = image_style_url('colorbox', $img_uri);

  $class = "img-{$img_style}";
  if (empty($img_title)) {
    // without title, without link, without caption
    $caption = "";
  } else {
    $class .= " thumbnail";
    $caption = "<div class=\"caption\"><p>{$img_title}</p></div>";
  }
  $img_html = "<img src=\"{$img_path}\" class=\"img-responsive\"/>";
  $result = "<div class=\"{$class}\">";
  if (!empty($img_title)) {
    $result .= "<a title=\"$img_title\" class=\"open-colorbox\" href=\"{$img_colorbox_path}\">{$img_html}</a>";
  } else {
    $result .= "{$img_html}";
  }
  $result .= "{$caption}</div>";
}

Attivare il nuovo filtro nel formato di testo

Andare su admin/config/content/formats e fare clic su configura nel formato di testo che stiamo utilizzando. Dopo di che, selezionare il filtro che abbiamo appena creato e salvare.

Modificare il codice html inserito dal modulo Insert

Per modificare il codice HTML inserito dentro il campo di testo lungo dal modulo insert, dobbiamo creare un file di nome image-insert-image.tpl.php dentro la corrispondente cartella del theme attivo. Questo file sostituirà l’originale fornito dal modulo Insert, che si trova nella cartella modules/insert/templates.

image-insert-image.tpl.php

<?php

/**
 * @file
 * Template file for Image module content inserted via the Insert module.
 *
 * Available variables:
 * - $item: The complete item being inserted.
 * - $url: The URL to the image.
 * - $class: A set of classes assigned to this image (if any).
 * - $width: The width of the image (if known).
 * - $height: The height of the image (if known).
 * - $style_name: The Image style being used.
 *
 * Note that ALT and Title fields should not be filled in here, instead they
 * should use placeholders that will be updated through JavaScript when the
 * image is inserted.
 *
 * Available placeholders:
 * - __alt__: The ALT text, intended for use in the <img> tag.
 * - __title__: The Title text, intended for use in the <img> tag.
 * - __description__: A description of the image, sometimes used as a caption.
 * - __filename__: The file name.
 * - __[token]_or_filename__: Any of the above tokens if available, otherwise
 *   use the file's name. i.e. __title_or_filename__.
 */

print "[¡mage {$style_name}|{$item['uri']}|__title__]";

Dopo di che, andare su admin/config/development/performance per svuotare la cache.

In questo modo, il modulo Insert aggiungerà al campo di testo il codice “[image ....]” che sarà processato dal filtro image.

Il fatto di poter utilizzare uno script PHP per generare il testo di sostituzione nelle regole dei filtri rende Custom filter un modulo senza limiti.

to be continued...