Le blog de Seb

Quoi de neuf dans Drush 5 ?

Durant la DrupalCon Denver cette semaine a eu lieu une conférence par Moshe Weitzman, Jonathan Hedstrom, Owen Barton et Mark Sonnabaum. À l'issue de celle-ci devait être releasée la version 5 stable de Drush (je suis peut-être un peu en avance sur ceci).

Drush est votre ami, si vous êtes un développeur, vous devez forcément l'avoir installé, et je vais donc partir du principe que vous avez utilisé la version 4. Je vais vous présenter dans cet article les nouvelles fonctionnalités de la version 5.

Emplacement de configuration

Les configurations, au travers de fichiers drushrc.php, peuvent maintenant être placées à plusieurs endroits :

  • Relatif à l'utilisateur unix : ~/.drush/drushrc.php
  • Relatif au site Drupal : sites/{default|example.com}/drushrc.php
  • Relatif au système/serveur : /etc/drush/drushrc.php

Alias shell

Vous pouvez maintenant fournir vos propres alias de commandes Drush dans la configuration, exemple :

1
2
3
4
$options['shell-aliases'] => array(
  'pull' => '!git pull',
  'pulldb' => '!git pull && drush updatedb',
);

Vous pouvez donc renseigner des commandes drush mais aussi des commandes système tel que git ou rm.

Gestion des options

Les options non reconnues renvoient maintenant une erreur, plus de "Mais pourquoi ma commande n'a pas marché ?", les erreurs de syntaxe sont ainsi plus facilement évitées.

L'aide des commandes Drush a adopté uniformément une syntaxe pour les paramètres des options :

  • --option=<valeur> pour les paramètres obligatoires
  • --option=[valeur] pour les paramètres optionnels

Compatibilité Windows

Enfin ! Oui, ils ont fait du bon boulot... Sponsorisés par Microsoft en personne, un installer est maintenant dispo, et plus (forcément) besoin de cygwin.

Tracking

Il est maintenant possible de garder un log des commandes utilisées, celles-ci peuvent être anonymisées et envoyées à MongoLab (sponsor des développeurs de Drush) pour faire évoluer Drush dans la bonne voie.
Ceci peut également être utilisé par les sysadmins pour garder un œil sur ce que font les développeurs.
Cette option est désactivée par défaut.

Drush make

Le célèbre gestionnaire de paquet s'invite dans le core de Drush, il est dès à présent possible de créer ses fichiers .make out-of-the-box pour installer ses modules et thèmes préférés toujours plus vite.
Ce n'est pas tout, les différents téléchargements sont maintenant réalisés en parallèle (4 processus par défaut), pour toujours plus de rapidité !
D'ailleurs si vous ne le saviez pas, il existe un cache dans Drush qui permet de récupérer les tarball déjà dans le système au lieu de toujours aller les chercher sur le réseau.

Autocomplétion

Oui, mesdames et messieurs ! L'autocomplétion des alias de sites, des commandes, des alias de shell, des options et des modules est maintenant disponible. Une gestion des contextes permet de ne pas être surchargés par toutes les possibilités. Je vous invite à le tester à l'usage ou à regarder la vidéo pour en savoir plus.
Pour l'activer il suffit de copier/coller drush.complete.sh vers /etc/bash_completion.d, ou, si vous n'avez pas les droits, il suffit d'inclure un petit bout de code dans votre ~/.bashrc

Certaines options vous permettent même de vous passer du mot-clé drush en début de commande, exemple :
@monsite dl views

Built-in WebServer

Drush propose maintenant un serveur HTTP léger afin d'exécuter vos sites Drupal. "À quoi cela sert" me direz-vous, et bien si vous voulez tester une configuration Drupal sans vous embêter avec les VHosts d'Apache, cette commande est très utile. Outre le fait d'afficher les logs d'accès aux pages, elle affiche également les messages watchdog.
Ainsi, la commande drush run-server :8889/ ouvrira une page dans votre navigateur vers le site Drupal courant. Ceci requiert php-cgi et PHP 5.3

Ce n'est pas tout, on peut maintenant faire du Drupal jetable avec la commande quick-drupal. C'est parfait si vous voulez épater Marcel et son site Joomla en quelques secondes :
cd /tmp
drush quick-drupal

Cela télécharge un Drupal 7, crée une base SQLite (donc dans un fichier), et installe le profil d'installation standard. Vous pouvez ensuite jouer avec les très nombreuses options :
drush qd "Ma boutique" --core=commerce_kickstart --profile=commerce_kickstart --yes --watchdog (Marcel va avoir une attaque après celle-ci)

Si vous n'en avez plus besoin, rm -r du dossier, au revoir.

Je l'avoue, j'ai applaudi tout seul chez moi là...

Queue API

Il semblerait que le fonctionnement de la nouvelle Queue API de Drupal 7 soit un peu trop cachée et éxécutable dans le cron, Drush résout maintenant ce problème avec deux commandes :

  • drush queue-list liste toutes les queues recensées par les modules
  • drush queue-run exécute ces queues

Multisites

Pour les gens qui bossent sur les multisites, il peut être frustrant de ne pas exécuter la commande dans le bon site ou même que celle-ci s'exécute dans sites/default, Drush 5 fournit les commandes drush site-set et drush site-reset pour que ce paramètre devienne persistant.

Beaucoup de nouveautés, et de taille ! Un conseil personnel, pour bénéficier des dernières fonctionnalités de Drush au jour le jour, clonez le dépôt directement. Celles-ci présentent encore quelques bugs et ils semblerait que les développeurs n'ont pas pu sortir la version stable à temps. Bravo à eux quand même !

"We'll see you on the command line" — Moshe Weitzman

La vidéo de la présentation est disponible ici.

Proof of Concept: Agrégateur Twitter pour Drupal avec Drupal

Bonne année ! Ah zut on est en Février déjà...

Bon comme c'est un peu les vacances pour moi (semestre à Dublin, 10h de cours par semaine, toussa...) j'ai le temps de tester des petits trucs.

Concept

J'ai donc monté un petit agrégateur de tweets concernant Drupal, en ne récupérant que ceux qui contiennent des liens (recherche Twitter). Il enregistre donc tous ces tweets, mais comme les nœuds sont pas très manipulables pour les statistiques, j'ai décidé de faire mon propre module et de ne pas utiliser l'Aggregator du Core. Quatre tables et c'est parti, on enregistre les tweets, les liens et leurs auteurs dans un hook_cron() :

  • agreg_tweets(id, author, text, date)
  • agreg_authors(id, name)
  • agreg_links(id, link)
  • agreg_links_tweets(link, tweet)

Statistiques

Ça, c'est bien, mais il faut en faire quelque chose maintenant... Donc c'est parti pour un hook_menu pour faire quelques pages de statistiques :

  • Une pour le temps pour voir quand les drupaliens twittent le plus, et donc quand faire de la veille
  • Une pour les trendings tweets et donc voir ce qui se passe et qu'est qui est intéressant ces temps-ci

C'est là que des nœuds m'auraient bien embêté, faire des requêtes GROUP BY et ROLLUP sur des jointures à foison, non merci !
La librairie highcharts.js pour faire joli, des petits tableaux et une requête ajax pour voir quels tweets parlent d'un lien (ajouter un peu de contexte) et voilou : un bel agrégateur Twitter

Twitter bootstrap

Ce thème tout frais (donc en dev) a quelques bugs dus à l'intégration Drupal et aux problèmes de différence de licences open source mais en quelques modifications c'est résolu. On a donc accès à des classes pour faire de beaux tableaux ainsi que quelques outils JS pour faire des fenêtres modales (j'ai rajouté bootbox.js pour plus de simplicité, merci @FGRibreau). On obtient donc en résultat une interface épurée idéale pour ce genre de proof of concept ou de projet court.

Drupal, un vrai framework

La recette se prépare donc en quelques 350 lignes de codes grâce aux fonctions et aux hooks de Drupal. Parmi ceux et celles utilisés :

  • hook_menu() et hook_cron()
  • db_merge()
  • variable_get() et variable_set(), juste indispensables
  • l(), truncate_utf8(), theme_table() pour le rendu
  • curl pour les requêtes HTTP

Je vais maintenant pouvoir vous twitter des liens plus pertinents concernant Drupal, pour cela n'hésitez pas à me suivre !

Live templates Drupal pour PHPStorm

L'ami Djebbz a attiré mon attention il y a peu sur IRC. Il a récemment mis en ligne un repository GitHub contenant un moyen de faire des Live templates en masse à partir du code de Drupal.

Explications

Il s'agit d'un script perl qui va parser les fichiers de l'api des hooks (contenus majoritairement dans le module examples et dans les fichiers *.api.php des modules contrib).

Utilisation

Avant toute chose, fermez PHPStorm car celui-ci écrase les fichiers lors de sa fermeture.
Les hooks basiques sont déjà disponibles dans le user.xml du repository, sous Mac il suffit de faire :
cd ~/Library/Preferences/WebIDE10/templates
curl -O -# https://raw.github.com/DjebbZ/Drupal-PHPStorm-Live-Templates/master/user.xml

Puis démarrez PHPStorm et dans votre code tapez h_menu<TAB> pour insérer un hook_menu.
Notez que taper h_menu<TAB> insérera la totalité de la documentation du hook.

PHPStorm Live template example

Mais encore

Le script est disponible dans le repository si vous souhaitez ajouter des hooks provenant d'autres modules contrib. Pour l'exécuter :
cd /path/to/drupal
find . -name \*.php | xargs grep -l '^function hook_' | xargs /path/to/parse_drupal_api.pl > ~/Library/Preferences/config/templates/user.xml

Enjoy !

Trier une View par longueur de chaîne

On continue dans les bouts de code pratiques. Voici, en 4 lignes, comment trier les résultats d'une view selon la longueur de chaîne du titre.

1
2
3
4
5
6
7
8
9
10
11
<?php
 
/**
 * Implements hook_query_TAG_alter().
 *
 * @param SelectQuery $query
 */
function glossaire_query_views_export_alter(SelectQuery $query) {
  $query->addExpression('LENGTH(node.title)', 'title_length');
  $query->orderBy('title_length', 'DESC');
}

Ce code provient du module personnalisé du glossaire de traduction française et a été construit depuis la documentation disponible sur drupal.org.

Forcer le téléchargement d'un fichier sous Drupal 7

Nouveau billet rapide pour vous partager une fonctionnalité.

Pour forcer le téléchargement d'un fichier, comme d'habitude avec Drupal, il y a un module pour ça. Dans ce cas précis il y en a même deux : Download file et File force. Mais bon comme d'habitude, la flemme d'installer un module pour une si petite fonctionnalité ! Alors voici la solution en quelques lignes de code :

Voici un bout de code se basant sur la File API. Il est plus sécurisé par rapport au deuxième mais ne fonctionnera que pour les fichiers gérés par Drupal (quelque soit la méthode de téléchargement) : je le recommande donc.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
/**
 * Implementation of hook_menu()
 */
function mymodule_menu() {
  $items['download/%file'] = array(
    'page callback' => 'mymodule_download_file',
    'access arguments' => array('administer site configuration'),
    'type' => MENU_CALLBACK,
  );
  return $items;
}
 
/**
 * Page callback for forcing a file to download
 */
function mymodule_download_file($file) {
  if($file) {
    file_transfer($file->uri, array('Content-disposition', 'attachment; filename='.$file->filename));
  }
  else {
    return drupal_access_denied();
  }
}

Il suffira d'appeler le fichier sous la forme http://mysite.com/download/123 où 123 est l'identifiant fid du fichier à télécharger.

Ce deuxième bout de code présente un danger pour la sécurité ! Il est recommandé de l'utiliser en dernier recours lorsque les fichiers ne sont pas gérés par Drupal. Pour accroître la sécurité on proposera cette fonctionnalité seulement aux administrateurs, et on filtrera les extensions autorisées au téléchargement.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
/**
 * Implementation of hook_menu()
 */
function mymodule_menu() {
  $items['download'] = array(
    'page callback' => 'mymodule_download_file',
    'access arguments' => array('administer site configuration'),
    'type' => MENU_CALLBACK,
  );
  return $items;
}
 
/**
 * Page callback for forcing a file to download
 */
function mymodule_download_file() {
  if (!isset($_GET['file']) || !file_exists($_GET['file'])) {
    return drupal_not_found();
  }
  $filepath = $_GET['file'];
  $realpath = realpath($path);
  $filename = basename($filepath);
  $extension = pathinfo($filepath, PATHINFO_EXTENSION);
  // Vérification de l'extension et restriction aux fichiers dans DRUPAL_ROOT
  if(in_array($extension, array('jpg', 'png', 'gif', 'mp4')) && substr($path, 0, strlen(DRUPAL_ROOT)) === DRUPAL_ROOT) {
    drupal_add_http_header('Content-disposition', 'attachment; filename=' . $filename);
    readfile($filepath);
  }
  else {
    return drupal_access_denied();
  }
}

Il vous suffira ensuite de créer votre lien sous la forme http://mysite.com/download?file=sites/default/files/monimage.png

Ceci ne fonctionne que pour la méthode de téléchargement publique mais c'est la plus répandue.

Twitter Pull, comment créer un bloc Drupal des derniers tweets

Rapide article pour vous montrer comment créer, via l'API de Drupal, un bloc qui récupère les derniers tweets.

Twitter Pull

Ce module va vous permettre de récupérer via l'API twitter les derniers tweets d'un compte ou d'une recherche, il est téléchargeable ici : Twitter Pull

Création du bloc

Dans votre module Drupal 7 (si vous n'en avez pas encore créé, veuillez d'abord lire ce tutorial de Yoran Brault), ajoutez un hook_block_info() :

1
2
3
4
5
6
7
8
9
10
11
<?php
/**
 * Implements hook_block_info().
 */
function monmodule_block_info() {
  $blocks['last_tweets'] = array(
    'info' => "Derniers tweets",
    'cache' => DRUPAL_NO_CACHE,
  );
  return $blocks;
}

Ici on désactive le cache pour pouvoir le gérer directement dans notre bloc. Puis on s'occupe du rendu de notre bloc via le hook_block_view() :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
/**
 * Implements hook_block_view().
 */
function monmodule_block_view($delta) {
  $block = array();
  switch ($delta) {
    case 'last_tweets':
      $block['subject'] = "Derniers tweets";
      // Vérification des données en cache de 1 heure maximum
      if ($cache = cache_get('monmodule_last_tweets') && REQUEST_TIME - $cache->created < 3600) {
        // Le cache est déjà présent, on l'affiche
        $block['content'] = $cache->data;
      }
      else {
        // Récupération des tweets
        $tweets = twitter_pull_retrieve('@momuser', 10);
        $items = array();
        foreach ($tweets as $tweet) {
          // Affichage des tweets avec les URL parsées en liens
          $class = strtolower($tweet->username);
          $items[] = '<span class="' . $class . '">' . _filter_url($tweet->text, NULL) . '</span>';
        }
        $block['content'] = theme('item_list', array('items' => $items));
        cache_set('monmodule_last_tweets', $block['content'], 'cache', REQUEST_TIME + 3600);
      }
  }
  return $block;
}

Il ne vous reste plus qu'à activer votre module et placer votre bloc dans une région pour que la magie opère !

Personnalisation

Il vous est possible de régler le nombre de tweets que vous souhaitez récupérer en changeant le deuxième argument de twitter_pull_retrieve() (maximum 200 tweets). Il n'est cependant possible de récupérer qu'une seule série de tweets à la fois, pour en récupérer depuis plusieurs utilisateurs il vous faudra faire plusieurs requêtes et les trier sur $tweet->timestamp via uasort.

Vous pouvez par exemple créer un fil déroulant tel que sur www.macifcourseaularge.com à l'aide d'un plugin jQuery liScroll.

Alternative

Vous pouvez également utiliser le widget Twitter (que vous pouvez voir dans la sidebar de mon blog) mais il est moins personnalisable, et ralentira le temps de chargement de votre page côté client.

[Livre] Drupal 7, concevoir et administrer vos sites web par Christophe Aubry

Voilà un moment maintenant que Christophe Aubry m'a contacté pour que je lise son livre "Drupal 7, concevoir et administrer vos sites web". Le temps que je reçoive le livre et que je le lise, les vacances sont passées par là (non pas que je me sois doré au soleil), je m'excuse de l'énorme retard auprès de Christophe blush.

Alors donc, pour commencer, ce livre s'adresse aux non initiés de Drupal, il vous guidera à travers l'installation et l'utilisation de celui-ci. Il ne vous apprendra pas à développer en tant que tel mais plutôt cliquer. C'est par là que nous avons tous débuté wink. Il est bourré de captures d'écran donc si vous vous perdez en suivant ses conseils, c'est que vous êtes loin d'être attentifs !

Le sommaire

  • Le CMS Drupal
  • L'installation de Drupal
  • L'interface d'administration
  • La configuration du site
  • La gestion des utilisateurs
  • La taxinomie
  • La structure des pages
  • Les articles et les pages
  • Créer des types de contenu
  • Gérer le contenu du site
  • La gestion des commentaires
  • Créer des affichages avec les vues
  • Ajouter des fonctions avec les modules
  • L'apparence du site avec les thèmes

L'installation

On commence bien sûr par le commencement : installer un serveur Web en local. Pour ceux qui n'y ont jamais touché, c'est très bien expliqué (tout OS confondu), pour les autres, passez à l'étape suivante. On installe ensuite la dernière version de Drupal (à l'époque de la sortie du livre c'était Drupal 7.0). Au terme de ce chapitre, il est peu probable que vous n'arriviez pas à l'écran d'accueil tant les étapes d'installation sont clairement expliquées, et puis sinon pour tout le reste il y a MasterCard Google.

Petit bémol cependant, la traduction en français est réalisée post-installation, je tiens à préciser qu'on peut installer Drupal en français directement, il vous suffit de suivre les instructions de cette page. A la sortie de Drupal 7.0, quelques chaînes n’étaient pas encore traduites et cela se voit bien sûr sur les captures d’écran du livre. On excusera l’auteur sur ce point, le retard venant de l’équipe de traduction (dont je fais partie depuis peu).

La configuration du site

Au fur et à mesure de la lecture, on voit que l'on survole les possibilités de Drupal, le but étant ici de créer un site vitrine, ou même un blog, en tout cas peu de chance de créer un site avancé : les explications sont trop détaillées, il faudrait multiplier le nombre de pages par 3 de toute façon.

Les types de contenus et la Taxinomie

"Taxinomie", la première fois que j'ai vu ce mot, j'ai cru qu'il y avait une faute : trop habitué à la version la plus proche de l'anglais (taxonomie). Passé ça, je trouve que l'avoir placé 4 chapitres avant la création de type de contenus est bien téméraire, en effet la taxonomie est maintenant un champ dans Drupal 7, cela peut donc perdre les utilisateurs d'en parler avant de l'utiliser.

Structure des pages

Ce chapitre regroupe l’utilisation des menus et des blocs, il décrit entre autres comment créer des menus, ajouter des liens à ceux-ci ainsi que les droits associés.

Les articles et les pages

On rentre ensuite dans le cœur de la gestion de contenu : les types de contenu. A commencer par les deux types qui sont déjà présents avec le profil d’installation «Standard» : Article et Page.

C’est avec ces deux types que l’on aborde la notion de champs, comment les modifier et les déplacer. On ajoute ensuite notre premier champ : signature.

Créer des types de contenu

On attaque ici la vrai notion de modularité de Drupal : les types de contenu personnalisés. L’exemple pris est la création d’un type de contenu «Destination» pour la gestion de voyages.

Je reprocherais à ce chapitre d’être assez court et de ne pas exposer le fait que cette partie de l’installation de Drupal est la base d’un site : toute la conception se fait ici. Plusieurs exemples de types de contenu réalisables aurait aidé à la compréhension des lecteurs sur l’importance de structurer ses données.

Il permet cependant d’aborder la plupart des types de champs proposés par défaut dans Drupal, l’exemple de «Destination» est très bien exploité.

La disposition du contenu (build-modes) ainsi que le module Book sont rapidement abordés à la fin du chapitre.

La gestion du contenu

Dans ce chapitre très complet, on apprendra à créer, éditer, supprimer, publier son contenu.

La gestion des commentaires

Ce chapitre porte sur la gestion des commentaires et explique également comment installer un module de CAPTCHA pour éviter le spam.

Créer des affichages avec des vues

Il est quasiment impossible de créer un site Drupal sans parler de Views, ce module est très difficile à appréhender de part sa complexité mais l’auteur reste sur des exemples de listes simples, tout en abordant les fonctionnalités les plus utiles de Views (page vide, header, footer) : cela permet de ne pas perdre le lecteur. Les affichages en mode page et bloc y sont expliqués.

Une fois ce chapitre passé, on a pu voir les possibilités du cœur de Drupal avec le profil d’installation «Standard» couplé avec quelques modules. L’auteur expose ensuite quelques modules à activer ou installer pour arriver à un vrai site de type blog : le module Contact, les flux RSS, la date de publication des contenus avec Scheduler, twitter automatiquement ses nouvelles publications avec Twitter.

 

Conclusion

En conclusion la lecture de ce livre est très utile pour les débutants pour découvrir et utiliser les modules les plus utilisés du cœur : Fields, Node, User, Taxonomy, Block, Contact, Comment, Menu... Mais cela ne s'arrête pas là, en effet bien que dans la version 7 de Drupal on puisse accomplir de plus en plus de choses rien qu'avec le cœur, l'auteur aborde également les modules les plus utilisés : Token, Pathauto, Views, Scheduler, CAPTCHA...

Je le recommande donc à ceux qui veulent s'initier à Drupal pour créer un site simple. Pour ma part, mon prochain achat sera sûrement "The definitive guide to Drupal 7", réputée comme la bible de cette version de Drupal.

 

Vous pouvez dès maintenant l'acheter sur Amazon ou sur le site des Edition ENI.

Changer le mot de passe administrateur Drupal

Lorsque vous récupérez des installations Drupal sans autres informations (nom d'utilisateur et mot de passe de l'administrateur par exemple), vous devez d'abord de réinitialiser avant de pouvoir commencer à travailler. Pour cela il suffit de le modifier en base de données.

Sous Drupal 6, c'était simple, il suffisait de récupérer le hash MD5 de votre mot de passe (en passant par exemple par un service en ligne) et ensuite de l'insérer dans votre base via phpMyAdmin par exemple via une requête SQL maison :

1
        UPDATE users SET pass = 'votre hash ici' WHERE uid = 1;

Cependant, MD5 devenant de plus en plus utilisé, des dictionnaires sont apparus en permettent parfois de retrouver un mot de passe à partir d'un hash. Quelqu'un qui aurait accès à votre base de données serait alors capable de faire tout ce qu'il veut.

Drupal 7 a mis en place une sécurité accrue grâce à un mot de passe salted (salé) : on rajoute en fait une chaîne aléatoire avant de hasher le tout avec un algorithme plus récent : SHA512. La méthode de réinitialisation devient donc un poil plus compliquée. Le moyen le plus simple est de créer un fichier .php à la racine de votre installation Drupal et d'y coller le code ci dessous. Il suffit de modifier les variables de mot de passe et d'uid à votre convenance et de visiter cette page dans votre navigateur. N'oubliez pas de supprimer le fichier après cette opération !

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$pwd = 'admin';
$uid = 1;
 
define('DRUPAL_ROOT', getcwd());
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc');
drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE);
 
$hash = user_hash_password($pwd);
echo db_query("UPDATE users SET pass = :hash WHERE uid = :uid", array(':hash'=> $hash, ':uid'=> $uid)) ? "Mot de passe change en '$pwd'" : 'Erreur lors du changement';
?>

EDIT: Astuce encore plus rapide qui m'a été reportée par Haza` si disposez d'un accès SSH et de drush, il suffit d'exécuter la commande drush upwd (ou drush user-password) pour modifier rapidement le mot de passe de n'importe quel utilisateur.

Traduire facilement l'interface Drupal avec l10n_client

A la mise en place d'un site Drupal, suivant les modules choisis pour répondre aux besoins, on se retrouve souvent avec des modules anglais non traduits. Pour plus de lisibilité ou même par demande du client (si c'est un site réalisé pour un client), il est nécessaire de traduire les chaînes dans les pages.

Là où ça devient barbant, c'est que la méthode par défaut de Drupal pour effectuer ceci est d'aller dans Construction > Traduction > Rechercher, de rechercher la chaîne à traduire et caetera et caetera. Résultat : 20 minutes pour traduire 10 pauvres expressions pour peu qu'on se rende compte qu'on a fait des fautes.

Une autre méthode est d'installer potx ou "Translation template extractor", qui vous téléchargera en fonction du module un petit fichier PO que pourrez compléter et réimporter avec l'outil Construction > Traduction > Importer. Des logiciels comme POEdit permettent de traduire simplement et efficacement les chaînes.

Eh bien pour optimiser tout ça, je vous propose aujourd'hui le module l10n_client, qui est un module léger, sans besoin d'espace en base de données. A l'activation, vous verrez apparaître si vous êtes en user 1 ou si vous avez donné les droits nécessaires une petite barre en bas de votre navigateur :

Lorsque vous cliquez dessus le panneau s'agrandit pour laisser voir 3 zones : une pour la liste des chaînes à traduire, une pour la traduction originale, et une pour la traduction de la langue active.

La recherche est assez rapide et propose toutes les chaînes qui ont été utilisées avec la méthode t() dans l'affichage de cette page.

Erreur 500 pendant la mise à jour Drupal 7

En mettant à jour ce blog vers Drupal 7 en suivant les instructions d'UPGRADE.txt, je suis tombé sur une erreur 500 sur la page update.php?op=info.

Imaginant que c'était une erreur due au fichier .htaccess, je l'ai renommé : pas de changement. Finalement j'ai mis le nez dans le code du fichier update.php pour trouver à la ligne 340 :

1
        ini_set('display_errors', FALSE);

Ceci cache l'affichage de toutes les erreurs et génère une page d'erreur 500. Donc à moins que vous n'utilisiez les fichiers de log pour stocker les erreurs php, vous pouvez pas voir ce qui ce passe. Je ne sais pas pourquoi a choisi de faire ça (il a l'air d'agir comme Steve Jobs ces jours-ci wink ) mais ce n'est pas très pratique et cela m'a pris une heure pour débogger ceci...

Vous avez juste à commenter cette ligne ou à mettre TRUE au lieu de FALSE et voilà, vous savez exactement quel est le problème. Pour moi c'était le module token qui définissait des doublons de fonctions avec le même nom, c'est facilement désactivable par un "drush sqlc" et :

1
        UPDATE system SET status = 0 WHERE name = 'token' AND type = 'module';

C'est aussi faisable avec PhpMyAdmin.

Bonne chance pour le passage de Drupal 6 à Drupal 7 !

Pages

Souscrire à RSS - Le blog de Seb