Translate a Drupal 7 custom module via l10n_update

It is really a big deal to manage translations of custom module in Drupal 7 expecially if you have a multisite installation.

Problem

We want use a .po file to translate a custom module programmatically, i.e. without forcing a redactor to do dangerous manual operations.

Furthermore we want have our module always accompained by its translations.

Solution

First of all we need to have l10n_update module installed.

Than we can declare the hook “l10n_update_projects_alter” which allow to set a remote path where the .po file is hosted.

Normally the path should be a remote, indipendent one, but in most cases we would like to have the .po file inside the website itself (i.e. not a separeted environment).

Take a look to the code below in which I declare a .po file that is in the module folder, in particular in “translations” subfolder.

As you can see the file name contains the parameter %language. In this case the filename would be ModuleName.LanguageCode.po.

Furthermore with the following snippet, I have manually (i.e. programmatically) forced the module to update its translations.

The .po files have been extracted thanks to Translation Template Extractor.

Drupal 8 views ajax manual refreshing does not work properly

Interviewer: Drupal 8 is amazing … isn’t it? 

Angry me: No, it’s not!

One of the problems we have spent lot’s of energies on is related to Drupal 8 views.
As you probably know the contrib module views has been integrated as a core module in this version 8 of Drupal.

Eventough there’s a nice page with documentation on D8 views, as a Drupal developers we know we can not fully rely on it to get rid of problems.

The problem

When a view is printed into a webpage as block or in a shape different of “page” display type, you can not have ajax features working properly on it, furthermore you are also not able to manually (via javascript) refresh it (triggering “RefreshView”).

If you watch what happen in a standard views with page as display type, and then start to playing “find the difference” with the other display types, you will (soon or later) notice that lot’s Javascript files views-ajax related, are not even included into the DOM!

But, what is happening?

For some reason, after hours, we have understand that even if you flag the checkbox to “use ajax” you are not able to get 

in browser console and neither, of course, the ajax views behavior.

The solution

When you are invoking the view do not forget to invoke “preview” method too, because it is responsible to prepare the view as desired.

We found no documentation on the web, so we assume this article will be useful for some Drupal information thirsty developer.

Thanks to Luca Rossi that achieved the solution.

With the right people

Get the right people. Then no matter what all else you might do wrong after that, the people will save you. That’s what management is all about.
 
Tom DeMarco

Patteggiamento senza pensiero

Quasi ovunque, e spesso anche per questioni squisitamente tecniche, il fatto di prendere partito, di prendere posizione pro o contro, ha sostituito il fatto di pensare. È una peste che si è originata nel contesto politico e si è diffusa a tutto il paese, alla quasi totalità del pensiero.

Simone Weil

Leonard Lawrence

In questo grande mondo
non c’è spazio per tutti.
Pensieri chiusi in taniche
di cui io surfo i flutti.

La linea verticale balla,
lo zenit è molto basso,
devi comunque stare a galla,
anche se sei un sasso.

Cosa si è perso?
E cosa è diventato?
Uomini nuovi
senza più passato.

Da domanda a risposta,
biblica purezza,
uomini alla prova
ed esseri in provetta.
tutti a far rumore,
tutti sulla piazza,
affollan l’aria che respiro
e tiran pugni in faccia.

Passi tu? Passo io?
Torna qui, “torna mio”.
Amore dato via
e odio verso Dio.

Ma,
io sono fuori dai giochi,
mi alimento d’altro,
anche se non so ancor di cosa
o se cercherò una sposa.
Ma,
io sono diverso
e uguale a tutti gli altri,
un’anima di passaggio,
vera come un miraggio.

Eppure sono qui,
e ne sento l’olezzo
di questo posto putrido
e pure di me stesso.

Consumato dal tempo
e dal suo vagare
un marinaio senza porto,
che non sa dove approdare.

Sono fermo, così in un momento,
in cerca di quell’attimo di cui sarei contento.
Come un aquilone, io mi illudo di volare,
ma son legato a terra con un filo che fa male.
Sono superiore o son solo distante?
Le cose sono ‘sì piccole,
o da me lontane?

Allora aberrami
fraintendimi
son qui, debellami!

Sono un’interferenza,
sovrastami,
cancellami!

Taglia via quel filo,
fammi decollare,
anche se mi perdo
senza più tornare.

Dicono sia nato sotto lo scorpione…
io sono un’ariete,
è solo un’impressione!
E sfondo porte aperte,
non invento nulla,
attingo dal passato
e dalla mia intuizione.

“Mi ricordi uno,
uno che conosco…
un tipo un poco strano,
ma un ragazzo apposto”
che cosa divertente,
nel pensare e ripensare,
non avevo poi capito
di non essere speciale.

Ma se non rido e se non piango,
non è perché son forte,
mi ha istruito Hartman
io sono Leonard Lawrence.

Sono lo stridente orgoglio del falcone,
bendato, soggiogato,
non se ne fa ragione.
Urlo a questo mondo
contro la mia prigione.

Più mi dimeno e più sprofondo.
in questa merda senza fine
dentro questo gorgo.

Brucio ancora dentro,
fino a sentir male,
sempre a denti stretti,
tanto da tremare.

Non ti amerò mai
come meriteresti
mia anima in pena,
occhi tristi.

Non ti sarò mai grato,
mascherato padrone,
sono un fiero condannato
alla tua prigione.

Attendo solo un cenno,
in questo limbo eterno,
pronto a sconfinare,
armato per l’inferno.

jQuery Once: Drupal 8 vs Drupal 7

 

Chi ha avuto modo di cimentarsi nella stesura di qualche riga di codice JS in Drupal 8 si sarà sicuramente imbattuto in un problema, quello di jQuery once che non funziona a dovere, o almeno così pare.

Cosa è successo?

In primis c’è da capire qual è la versione di jQuery utilizzata.

Drupal 7

In tal senso con il modulo contrib jQuery update di Drupal 7 era possibile passare dalla versione 1.4 di jQuery ad una versione superiore a scelta (oggi arrivata alla 1.10) e che il modulo non è più disponibile in Drupal 8.

In Drupal 7 avremmo fatto una cosa del genere:

Drupal 8

In Drupal 8 la versione di jQuery è la 3.2.1 (questo al 24/07/2018 quando è appena uscita l’alpha di Drupal 8.6.0-alpha1; vedi immagine).

Quindi molto più avanzata rispetto a quella di Drupal 7.

Questo ha fatto sì che il modo di invocare determinate funzioni (come il once) sia cambiato.

Come rilevato nel ticket aperto dalla community di Drupal c’è un problema di funzionamento con jQuery once che deve essere invocato in un altro modo, dopo che esso è stato aggiornato alla versione 2.0.

Ebbene tutto ciò è stato realizzato discusso, analizzato e risolto in un ticket sulla community, questo: https://www.drupal.org/node/2457769.

Per comodità riporto di seguito l’esempio ivi riportato:

Come è possibile vedere adesso il once si ottiene in maniera sequenziale, senza gli innesti che erano necessari qualche versione fa.

EDIT 08/01/2019

Per evitare che l’utente anonimo abbia problemi con jQuery Once è necessario includere quanto segue, tra le dipendenze di un modulo che usa jQuery Once.

Riferimento: https://www.drupal.org/project/ultimenu/issues/2562829

 

Drupal 7 campi condizionali nei form con gli states

Oggi voglio presentarvi gli states degli elementi di un form Drupal.

Il problema

Vogliamo per un motivo o per un altro nascondere selettivamente dei campi in determinate condizioni, senza scrivere dei JS da aggiungere al form, massimizzando la manutenibilità del codice.

Tutto questo è consentito dagli states degli elementi del form di Drupal che consentono di inserire una logica con stati e condizioni in grado ad esempio di nascondere un campo se una checkbox è flaggata oppure mostrare un campo e renderlo obbligatorio.

Esempio:

Poniamoci nel caso in cui abbiamo un modulo di inserimento (un form insomma) di richieste di supporto in cui abbiamo un campo di tipo select chiamato “Oggetto” con varie opzioni selezionabili. Una di queste opzioni è “Altro”, se “Altro” è selezionato allora bisogna mostrare un campo (normalmente nascosto) chiamato “oggetto altro”.

Un codice di questo tipo risolve assolve al compito:

Interessante analizzare la funzione drupal_process_states poiché essa mostra tutti gli stati e le condizioni possibili, che per comodità riporto qui sotto:

I possibili stati di un elemento (del form) sono:

  • enabled
  • disabled
  • required
  • optional
  • visible
  • invisible
  • checked
  • unchecked
  • expanded
  • collapsed

Le possibili condizioni (che su drupal.org chiama remote conditions) sono:

  • empty
  • filled
  • checked
  • unchecked
  • expanded
  • collapsed
  • value

Gli stati che seguono possono essere utilizzati sia come stati di un elemento (primo gruppo) sia come condizioni remote (secondo gruppo):

  • relevant
  • irrelevant
  • valid
  • invalid
  • touched
  • untouched
  • readwrite
  • readonly

Tuttavia il funzionamento di quest’ultimo gruppo di stati non è garantito in ogni scenario, poiché le funzionalità che ne derivano sono molto dipendenti dal browser dal quale vengono eseguite.

Dalla versione 7.14 di Drupal è anche possibile usare OR e XOR.

Spero di essere stato utile.

NOTA: Un discorso del tutto analogo può essere fatto per Drupal 8 che, sebbene abbia stravolto la maggior parte delle funzionalità di Drupal 7, implementa questa degli states degli elementi del form in maniera similare.