• Quoi de neuf dans Drupal World? Semaine #25 Spécial DrupalDevDays

    Le gros évenement de la semaine dernière était bien entendu les Drupal Dev days de Barcelone : mais peu de tweets durant celui-ci, ne vous inquiétez pas je vous ai quand même dégoté quelques liens intéressants !

    Nouvelle version de Commerce Kickstart

    Les CommerceGuys ont lancé la version 2 de leur profil d'installation Drupal Commerce, la nouvelle interface plaira sûrement lors des démos client http://commerceguys.com/blog/sneak-preview-commerce-kickstart-v2

    Sessions des DrupalDev days Barcelona

    Voici les slides des différentes sessions, il faudra muscler votre anglais cependant :

    WSCCI et les Web Services

    Un sprint à Paris s'est déroulé au début du mois sur les Web Services dans Drupal 8, voici le résumé par @Crell. Ceci présente comment vous allez coder avec les futures entités dans D8 et quels protocoles sont en discussion pour fournir des Web Services dans Drupal http://groups.drupal.org/node/237443

    Twig dans le core D8

    Twig a été récemment committé dans le core de Drupal 8 http://drupalcode.org/project/drupal.git/commit/07e217036136e0bc3369c276...

    Nouvelle interface pour la traduction de chaîne committée

    L'issue a été finalement poussée dans la branche 8.x, félicitations à ceux qui y ont participé ! Une démo en a été faite par @GaborHojtsy durant les dev days, et le moins que l'on puisse dire c'est que c'est plus pratique qu'en D7 http://drupal.org/node/1452188

    Architecture de plugins dans Drupal 8

    Un brouillon d'architecture de plugins dans D8 est en cours par @EclipseGc http://drupal.org/node/1637614

    Un energy drink Drupal aperçu

    drupal energy drink
    "So that you can code harder, better, faster, stronger..."

  • Quoi de neuf dans Drupal World ? Semaine #24

    Voici la suite de mon billet de la semaine dernière, où je vous rapporte les dernières nouvelles du monde Drupal :

    Nouvelle gestion des 404 et 403

    Dans l'un des derniers patch, les fonctions drupal_not_found() et drupal_access_denied() ont été remplacées par des exceptions Symphony http://drupal.org/node/1616360
    Suivez @Drupal8changes pour ce genre de mises à jour.

    Installer Apache Solr sur Mac OS X

    Un billet clair sur comment installer Solr sur Mac http://ramlev.dk/blog/2012/06/02/install-apache-solr-on-your-mac/

    Encore un drupal showcase

    Toujours bon de faire de la pub http://www.withdrupal.com/

    Drupal 8 au Symphony Live

    C'est la grosse nouvelle de cette semaine, @Crell a donné une présentation au Symphony Live sur Drupal 8 core et Symphony. Pour rappel, D8 utilisera (pour l'instant) 6 composants de Symphony :

    • HttpFoundation
    • HttpKernel
    • EventDispatcher
    • ClassLoader
    • DependencyInjection
    • Yaml

    http://garfieldtech.com/presentations/sfl2012-drupal8/index.html http://lockerz.com/s/215044232

    Le Drupal Association Store

    La Drupal Association a ouvert une section sur leur site pour vendre des T-Shirt, on espère en voir un peu plus. C'est construit avec Ubercart pour le moment, et sera sûrement réécrit avec Commerce dans la version D7 de drupal.org https://association.drupal.org/store

    Views dans Drupal Core, la tournée

    Si vous avez manquez ça, deux semaines plus tôt, Earl Miles a annoncé que D8 aura Views dans son cœur dans un billet, maintenant qu'il a levé un peu de fonds pour travailler dessus avec quelques autres, il est temps de planifier els différents voyages pour y travailler pendant les Drupal events et autres code sprint ! http://www.angrydonuts.com/chaos-world-tour-12

    Pour plus d'infos, Earl a répondu a quelques interviews, voici 2 podcasts ou il apparait http://www.lullabot.com/podcasts/podcast-103-views-core et http://modulesunraveled.com/podcast/023-earl-miles-and-getting-views-in-...

    D7 a un support total du language pour les entités

    Un autre changement dans Drupal core, mais celui-ci a été "backporté" dans Drupal 7, en savoir plus sur http://groups.drupal.org/node/236548

    Drupal & responsive

    Et enfin petite exception française pour ce billet, je vous invite à consulter les slides de Nicolas Viot (@nikovitto) qui expliquent très bien l'état de Drupal dans le milieu du responsive design http://www.slideshare.net/nikovitto/drupal-responsive

  • Quoi de neuf dans Drupal World ? Semaine #23

    J'essaie de faire un autre type de billet de blog, assez court et indiquant simplement ce qui s'est passé la semaine dernière dans le monde Drupal. Ces nouvelles proviennent principalement de Twitter, et correspondent aux liens qui sont très mentionnés ou retweetés par la communauté.

    Prototype des fonctions d'édition dans Spark

    @Dries a fait un billet de blog à propos de la distribution Spark et sa fonction attendue, l'édition en ligne. Découvrez la vidéo de @webchick http://youtu.be/a53Wcq31LmY

    Dries et la baguette

    Dries était à Paris en fin de semaine dernière, pour voir les gens de Radio France et leurs locaux, et donner quelques interviews à plusieurs magazines high-tech, parmi lesquels Le Journal du Net, voici l'article http://www.journaldunet.com/developpeur/php/drupal-8-0512.shtml

    Olivier Friesse, responsable technique à Radio France, a parlé de leur module de gestion des médias : ScalD, qui vient de sortir en Drupal 7.

    L'état de Drupal 8 par @webchick : hook_future_alter()

    Angie a fait un diaporama pour les gens qui veulent en savoir plus ou parler de D8 : http://webchick.net/drupal-8-slides

    Le Code de conduite Drupal

    Au cours de la dernière DrupalCon des "booth babes" ont été repérées dans les stands, ceci a provoqué un débat sur twitter, et a abouti à la création d'un code de conduite DrupalCon : http://groups.drupal.org/node/232633

    Un nouveau visage pour le site DrupalCommerce

    La page d'accueil du projet Drupal Commerce est de retour avec un nouveau thème et un nouveau support utilisateur http://www.drupalcommerce.org

    "Le noyau a atterri"

    @Crell (Larry Garfield) a annoncé que le HttpKernel de la Symphonie est maintenant dans Drupal 8 http://www.garfieldtech.com/blog/wscci-kernel-merge

    Les entités sont maintenant des objets classés avec une interface

    La POO est en train d'intégrer Drupal 8 à vitesse rapide ! http://groups.drupal.org/node/235193

    Voilà, à la semaine prochaine pour d'autres news !

  • 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.

Pages

S'abonner à Le blog de SebCorbin RSS