Il vecchio articolo sulla funzione l() non è più attuale, ecco quindi una versione aggiornata e riveduta per Drupal 11.
Un collegamento ipertestuale, oltre all’indirizzo di destinazione (href
) e al testo di ancoraggio, può includere attributi HTML come class
, id
, title
o rel
. Scrivere un link statico in HTML è semplice, ma se si lavora a un modulo o a un tema Drupal, conviene usare gli strumenti offerti dal sistema di rendering.
Dalla versione 8 in poi, Drupal non utilizza più la funzione l()
, ma si basa sull’uso di oggetti render array e oggetti Link
della classe \Drupal\Core\Link
, che garantiscono coerenza, sicurezza e flessibilità.
Link semplice
use Drupal\Core\Link;
use Drupal\Core\Url;
// Crea il link.
$link = Link::fromTextAndUrl(t('Testo di aggancio'), Url::fromRoute('entity.node.canonical', ['node' => $nid]));
$renderable = $link->toRenderable();
// Usa il servizio di rendering per ottenere l'HTML.
echo \Drupal::service('renderer')->renderPlain($renderable);
Link con attributi HTML
use Drupal\Core\Link;
use Drupal\Core\Url;
// Crea l'URL con attributi
$url = Url::fromRoute('entity.node.canonical', ['node' => $nid]);
$url->setOptions([
'attributes' => [
'class' => ['classe-css'],
'id' => 'id-link',
'rel' => 'nofollow',
],
]);
// Crea il link
$link = Link::fromTextAndUrl(t('Testo con attributi'), $url);
// Renderizza il link
echo \Drupal::service('renderer')->render($link->toRenderable());
Collegamento ad un'immagine
use Drupal\Core\Url;
// Imposta ID del nodo
$nid = 1;
// Imposta percorso del file
$file_path = '/path/to/image.jpg';
// Costruisci l'URL del link
$url = Url::fromRoute('entity.node.canonical', ['node' => $nid]);
$url->setOptions([
'attributes' => ['class' => ['image-link']],
]);
// Costruisci il render array del link con contenuto HTML (immagine)
$link_render_array = [
'#type' => 'link',
'#title' => [
'#markup' => '<img src="' . $file_path . '" alt="Descrizione">',
],
'#url' => $url,
'#options' => [
'html' => TRUE,
],
];
// Renderizza direttamente il render array
echo \Drupal::service('renderer')->render($link_render_array);
Link esterni o mailto
use Drupal\Core\Link;
use Drupal\Core\Url;
// Crea l'oggetto URL con attributi.
$url = Url::fromUri('mailto:email@example.com', [
'attributes' => ['class' => ['email-link']],
]);
// Crea il link come oggetto Link.
$link = Link::fromTextAndUrl('Scrivici', $url);
// Rende l'output HTML del link.
echo \Drupal::service('renderer')->render($link->toRenderable());
Esempio avanzato con Media e stili immagine
// Imposta gli ID del nodo e del media
$nid = 123;
$media_id = 456;
// Carica l'entità Media
$media = Media::load($media_id);
if ($media && $media->bundle() === 'image') {
// Carica l'immagine dal campo che la contiene
$image_field = $media->get('field_media_image');
if (!$image_field->isEmpty()) {
$file = $image_field->entity;
$uri = $file->getFileUri();
// Definisce lo stile da usare.
$style_url = ImageStyle::load('thumbnail')->buildUrl($uri);
// Crea l'array renderizzabile per l'immagine.
$image_render_array = [
'#theme' => 'image',
'#uri' => $style_url,
'#alt' => 'Miniatura',
];
// Crea il link.
$url = Url::fromRoute('entity.node.canonical', ['node' => $nid], [
'attributes' => ['class' => ['link-img']],
]);
// Renderizza l'immagine in una stringa.
$image_html = \Drupal::service('renderer')->renderPlain($image_render_array);
// Crea il link usando la stringa come testo.
$link = Link::fromTextAndUrl($image_html, $url);
// Stampa il link con l'immagine.
echo \Drupal::service('renderer')->render($link->toRenderable());
}
}