Funzioni Twig disponibili in Drupal

  • attach_library($library)
  • active_theme() ritorna il nome del tema corrente
  • active_theme_path() ritorna il path relativo del tema corrente
  • create_attribute($attributes) crea un oggetto Attribute
  • render_var($arg)
  • file_url($uri) trasforma il prametro in path relativo (verificare)
  • link($text, $uri, $attributes) ritorna un link
  • path($name, $parameters, $options) ritorna il path
  • url($name, $parameters, $options) ritorna l'url

Creare attributi con create_attribute()

Generare path e URL

Creare link verso route Drupal

Includere asset o file del tema

{% set my_attribute = create_attribute() %}
{%
  set my_classes = [
    'kittens',
    'llamas',
    'puppies',
  ]
%}
<div{{ my_attribute.addClass(my_classes).setAttribute('id', 'myUniqueId') }}>
  {{ content }}
</div>

<div{{ create_attribute({'class': ['region', 'region--header']}) }}>
  {{ content }}
</div>

{# Link alla frontpage view. #}
<a href="{{ path('view.frontpage.page_1') }}">{{ 'View all content'|t }}</a>

{# Link alla pagina dello user #}
<a href="{{ path('entity.user.canonical', {'user': user.id}) }}">{{ 'View user profile'|t }}</a>

{# Link alla pagina di un nodo #}
<a href="{{ path('entity.node.canonical', {'node': node.id}) }}">{{ 'View node page'|t }}</a>

{# Link ad un termine di tassonomia #}
<a href="{{ path('entity.taxonomy_term.canonical', {'taxonomy_term': term.id}) }}">{{ 'View taxonomy term'|t }}</a>

{# Aggiunge un query parameter. In questo esempio event_user_sync.registration è una rotta custom in un modulo #}
{% set redirect_path = path('event_user_sync.registration', {'node': node.id}) %}
<a href="{{ path('user.register',{},{'query':{'destination': redirect_path }}) }}">{{ 'Register'|t }}</a>

Genera un URL assoluto per l'URL corrente:
<a href="{{ url('<current>') }}">{{ 'Reload'|t }}</a>

Genera un URL assoluto per la pagina principale:
<a href="{{ url('<front>') }}">{{ 'Home'|t }}</a>

{# Link al tema corrente, in questo esempio il codice della SVG viene incluso nel button #}
<div class="menu-main-togglewrap">
  <button type="button" name="menu_toggle" class="menu-main-toggle" data-drupal-selector="menu-main-toggle" aria-label="Toggle the menu">{% include active_theme_path() ~ '/images/svg/menu-icon.svg' %}</button>
</div>

Traduzioni per siti multilingua

Il filtro t consente di tradurre le stringhe e dovrebbe essere utilizzato per tutte le stringhe aggiunte manualmente al template e visualizzate dagli utenti. Le stringhe statiche inserite manualmente nel template devono passare da |t o {% trans %}. Le variabili dinamiche non vanno tradotte direttamente con {{ var|t }}, se devono essere inserite in una frase traducibile, vanno usate come placeholder.

Tradurre stringhe nei template

In un file .html.twig:

<p>{{ 'Benvenuto nel nostro sito web!'|t }}</p>

<p>{{ 'Ciao, @nome!'|t({ '@nome': nome_utente }) }}</p>

{# usare sempre un filtro in modo che la variabile venga sanitizzata #}
{# il filtro placeholder oltre a sanitizzare racchiude il testo in un tag <em> #}
{% trans %}
Ciao {{ user.name | escape }}, la data di oggi è: {{ date|placeholder }}.
{% endtrans %}

{# all'interno di un blocco trans le variabili sono sanitizzate automaticamente #}
{% trans %}
C'è 1 commento.
{% plural count %}
Ci sono {{ count }} commenti.
{% endtrans %}

{# esempio sbagliato #}
<p>{{ 'Submitted by'|t }} {{ author_name }} {{ 'on'|t }} {{ date }}</p>

{# esempio corretto #}
<p>{{ 'Submitted by @author_name on @date' |t({'@author_name': author_name, '@date': date}) }}</p>

{# altro esempio corretto #}
<p>{% trans %}Submitted by {{ author_name }} on {{ date }}{% endtrans %}</p>

{# esempi sbagliati: non si deve stampare la variabile direttamente nel blocco ma si deve usare un segnaposto #}
{{ var1|t }}
{% trans %}{{ var1 }}{% endtrans %}

{# esempi corretti #}
{{ '@var1'|t({'@var1': var1}) }}

{% trans %}
{{ var1|escape }} // qui non è proprio correttissimo perchè non bisogna passare una variabile come stringa da tradurre
{% endtrans %}

Placeholder nelle traduzioni

Traduzioni in PHP

In un file .theme:

<?php

$messaggio = t('Benvenuto nel nostro sito web!');

$nome = 'Mario';
$saluto = t('Ciao, @nome!', ['@nome' => $nome]);

$variables['messaggio_tradotto'] = $saluto;

?>

Traduzioni in JavaScript

In un file JavaScript:

(function (Drupal) {
    Drupal.behaviors.nomeTemaTraduzione = {
        attach: function (context, settings) {
            
            var messaggio = Drupal.t('Benvenuto nel nostro sito web!');
            
            var nomeUtente = 'Luigi';
           // la @ applica l'escaping sicuro della stringa
            var saluto = Drupal.t('Ciao, @nome!', { '@nome': nomeUtente });
            
            console.log(saluto);
            
            //con il segnaposto % viene applicato l'escaping 
            //e il testo viene anche racchiuso in un tag <em>
            Drupal.t('Il file è stato salvato nel percorso %path.', {'%path': path_to_file});

            // il segnaposto con ! si usa per testo che non deve essere sanitizzato
            Drupal.t('Ciao <a href="!url">@name</a>', {
                '!url': 'http://example.com',
                 '@name': user.displayName
             });

           // nel caso specifico dell'url si può usare il segnaposto : in modo da evitare testo non sanitizzato
            Drupal.t('Ciao <a href=":url">@name</a>', {
                ':url': 'http://example.com',
                 '@name': user.displayName
             });
        }
    };
})(Drupal);