Using PHP-fpm is a way to push PHP execution outside of Apache, one of the main reasons to use it is freeing memory usage of PHP in the apache processes and allowing usage of a threaded Apache server.
Using PHP-fpm is a way to push PHP execution outside of Apache, one of the main reasons to use it is freeing memory usage of PHP in the apache processes and allowing usage of a threaded Apache server.
Ca y est l’événement Drupal européen de l’année est passé et il faudra maintenant attendre un an pour retrouver autant de Drupaleur réunis en un seul et même endroit en Europe.
Cette conférence à Londres m’a permis de découvrir cette charmante capitale et au passage, on a eu le droit à une visite en règle. Nous avons eu le plaisir de goûter à la pluie londonienne, enfin à ce stade là, ce n’était plus de la pluie mais des trombes d’eau qui déferlaient du ciel… (je comprends pourquoi les parapluies ne sont pas chers dans les boutiques pour touristes
Alors cette conférence ?
Ce qu’il y a de bien pendant une Drupalcon c’est qu’il y en a pour tout le monde, les développeurs, les thémeurs, les sites builders et même pour les chefs de projet, ainsi que pour tous les niveaux. Avec plus de 25 sessions par jour, sans compter les BoFs, difficile de ne pas trouver son bonheur.
Néanmoins j’ai trouvé que certaines sessions n’étaient pas assez avancées, enfin pas autant que je l’esperais. Mon impression est aussi celle de quelques autres développeurs qui comme moi, sont restés sur leur faim pour quelques unes d’entre elles. A côté de cela, les sessions «core» (qui parlent du corps de Drupal, souvent de Drupal8 et où l’on trouve toutes les rock-stars) étaient intéressantes.
Je ne sais pas si vous avez suivi la keynote d’ouverture, mais celle-ci ne m’a pas emballée. Le message que j’ai capté est que maintenant, Drupal est un produit qu’il faut vendre et qu’il va falloir faire du marketing pour le rendre encore plus populaire. C’est bien me direz-vous, que ce soit pour Drupal ou pour son écosystème, mais le problème est qu’actuellement, on (les entreprises qui font du Drupal) n’arrive déjà pas à répondre à la demande et que l’on (toujours les drupal factories) n’arrive pas à embaucher des personnes qualifiées alors pourquoi faire du marketing au risque de refuser des projets. Quelque chose m’échappe et ça me chagrine. Lors de cette keynote on a aussi eu le droit à plein de slides avec des chiffres comme s’il y avait quelque chose à justifier… D’ailleurs je n’ai pas compris la slide sur le fait qu’il a fallut 12 mois pour avoir 100.000 sites en Drupal 6 alors qu’il n’en a fallut que 6 pour atteindre le même chiffre sur Drupal 7. Sur quoi sont basés ces stats ? Le nombre de sites en ligne ? Le nombre de téléchargement sur drupal.org ? Bref, c’était pas la keynote la plus emballante de l’histoire.
Bon n’allez pas croire, après la lecture de ce précédent paragraphe que ça n’en valait pas le coup, c’était super chouette et il y avait quelques sessions qui valaient le déplacement:
N’ayant pu assister qu’à une seule session par créneau horaire (non je ne fais pas encore dans la projection astrale), il faut que je regarde les sessions que j’ai loupées. N’hésitez donc pas à compléter la liste ci-dessus.
Mention spéciale à l’équipe organisatrice qui, dès le lendemain des sessions, mettait en ligne les vidéos des conférences. Bravo pour l’efficacité!
Mais comme tout Drupaleur qui va à une Drupalcon, on n’y va pas uniquement pour les sessions, on y va aussi pour rencontrer des personnes de qualité qui ont des étoiles qui brillent dans les yeux quand on discute de technos… Bref, ça a été l’occasion de faire de chouettes rencontres et de revoir des gens que l’on n’avait pas vu depuis un moment.
Nous étions quand plus de 1700 participants, dont 80 Français. Pas mal, non ? On s’aperçoit que l’on était bien à une conférence info lorsqu’on voit le stats de bande passante utilisée, de mails échangés et de messages twitter envoyés. Affolants ces geeks… Avec un si grand nombre de participants, je comprends qu’il était difficile de faire la Drupalcon dans Londres. Heureusement que les transports Londoniens sont très efficaces, cela nous a permis de pas mettre trop de temps pour rentrer de Croydon au centre de Londres. Par contre c’est dommage qu’il y ait eu autant de distance entre les sessions, les bofs et les conférences core, mais bon je pense qu’ils n’ont pas pu faire autrement avec autant de participants.
La Drupalcon est un excellent booster, je rentre chez moi avec un bon souvenir, plein de motivation et l’intention de tester de nouvelles choses ! Merci à Ideia de m’avoir donné la chance d’aller à cette Drupalcon et merci aux organisateurs pour avoir organisé cette conférence annuelle.
Et vous qui étiez là-bas ou à distance, qu’avez vous pensé de cette conférence ?
La prochaine c’est où et c’est pour quand ?
Pendant que j’y suis et pour une fois qu’il ne s’agit pas d’un post technique, j’en profite pour rappeler que la prochaine Drupalcon Européenne aura lieu à Munich du 20 au 23 août 2012 et promet aux vues des organisateurs d’être encore meilleure que celle-ci. Bon courage à l’équipe organisatrice!
Ca y est l’événement Drupal européen de l’année est passé et il faudra maintenant attendre un an pour retrouver autant de Drupaleur réunis en un seul et même endroit en Europe.
Cette conférence à Londres m’a permis de découvrir cette charmante capitale et au passage, on a eu le droit à une visite en règle. Nous avons eu le plaisir de goûter à la pluie londonienne, enfin à ce stade là, ce n’était plus de la pluie mais des trombes d’eau qui déferlaient du ciel… (je comprends pourquoi les parapluies ne sont pas chers dans les boutiques pour touristes :)
Alors cette conférence ?
Ce qu’il y a de bien pendant une Drupalcon c’est qu’il y en a pour tout le monde, les développeurs, les thémeurs, les sites builders et même pour les chefs de projet, ainsi que pour tous les niveaux. Avec plus de 25 sessions par jour, sans compter les BoFs, difficile de ne pas trouver son bonheur.
Néanmoins j’ai trouvé que certaines sessions n’étaient pas assez avancées, enfin pas autant que je l’esperais. Mon impression est aussi celle de quelques autres développeurs qui comme moi, sont restés sur leur faim pour quelques unes d’entre elles. A côté de cela, les sessions «core» (qui parlent du corps de Drupal, souvent de Drupal8 et où l’on trouve toutes les rock-stars) étaient intéressantes.
Je ne sais pas si vous avez suivi la keynote d’ouverture, mais celle-ci ne m’a pas emballée. Le message que j’ai capté est que maintenant, Drupal est un produit qu’il faut vendre et qu’il va falloir faire du marketing pour le rendre encore plus populaire. C’est bien me direz-vous, que ce soit pour Drupal ou pour son écosystème, mais le problème est qu’actuellement, on (les entreprises qui font du Drupal) n’arrive déjà pas à répondre à la demande et que l’on (toujours les drupal factories) n’arrive pas à embaucher des personnes qualifiées alors pourquoi faire du marketing au risque de refuser des projets. Quelque chose m’échappe et ça me chagrine. Lors de cette keynote on a aussi eu le droit à plein de slides avec des chiffres comme s’il y avait quelque chose à justifier… D’ailleurs je n’ai pas compris la slide sur le fait qu’il a fallut 12 mois pour avoir 100.000 sites en Drupal 6 alors qu’il n’en a fallut que 6 pour atteindre le même chiffre sur Drupal 7. Sur quoi sont basés ces stats ? Le nombre de sites en ligne ? Le nombre de téléchargement sur drupal.org ? Bref, c’était pas la keynote la plus emballante de l’histoire.
Bon n’allez pas croire, après la lecture de ce précédent paragraphe que ça n’en valait pas le coup, c’était super chouette et il y avait quelques sessions qui valaient le déplacement:
N’ayant pu assister qu’à une seule session par créneau horaire (non je ne fais pas encore dans la projection astrale), il faut que je regarde les sessions que j’ai loupées. N’hésitez donc pas à compléter la liste ci-dessus.
Mention spéciale à l’équipe organisatrice qui, dès le lendemain des sessions, mettait en ligne les vidéos des conférences. Bravo pour l’efficacité!
Mais comme tout Drupaleur qui va à une Drupalcon, on n’y va pas uniquement pour les sessions, on y va aussi pour rencontrer des personnes de qualité qui ont des étoiles qui brillent dans les yeux quand on discute de technos… Bref, ça a été l’occasion de faire de chouettes rencontres et de revoir des gens que l’on n’avait pas vu depuis un moment.
Nous étions quand plus de 1700 participants, dont 80 Français. Pas mal, non ? On s’aperçoit que l’on était bien à une conférence info lorsqu’on voit le stats de bande passante utilisée, de mails échangés et de messages twitter envoyés. Affolants ces geeks… Avec un si grand nombre de participants, je comprends qu’il était difficile de faire la Drupalcon dans Londres. Heureusement que les transports Londoniens sont très efficaces, cela nous a permis de pas mettre trop de temps pour rentrer de Croydon au centre de Londres. Par contre c’est dommage qu’il y ait eu autant de distance entre les sessions, les bofs et les conférences core, mais bon je pense qu’ils n’ont pas pu faire autrement avec autant de participants.
La Drupalcon est un excellent booster, je rentre chez moi avec un bon souvenir, plein de motivation et l’intention de tester de nouvelles choses ! Merci à Ideia de m’avoir donné la chance d’aller à cette Drupalcon et merci aux organisateurs pour avoir organisé cette conférence annuelle.
Et vous qui étiez là-bas ou à distance, qu’avez vous pensé de cette conférence ?
La prochaine c’est où et c’est pour quand ?
Pendant que j’y suis et pour une fois qu’il ne s’agit pas d’un post technique, j’en profite pour rappeler que la prochaine Drupalcon Européenne aura lieu à Munich du 20 au 23 août 2012 et promet aux vues des organisateurs d’être encore meilleure que celle-ci. Bon courage à l’équipe organisatrice!
Most coders are familiar with Drush Make. So I'll skip that part for now. Suffice to say that a .make file is a list of projects, modules, features and even profiles that will be fetched and installed when you use the drush make yourMakefile.make pathToDir command.
Most coders are familiar with Drush Make. So I'll skip that part for now. Suffice to say that a .make file is a list of projects, modules, features and even profiles that will be fetched and installed when you use the drush make yourMakefile.make pathToDir command.
Bien que cela puisse paraître compliqué de l’extérieur, créer et modifier des contenus Drupal sans l’aide de l’interface d’administration est une chose relativement simple lorsque l’on s’est déjà confronté au problème. Néanmoins il faut être prudent avec ce que vous voulez sauvegarder, puisqu’en outrepassant le système naturel de création de contenus via l’interface d’admin vous avez la possibilité de faire tout et n’importe quoi et d’empêcher les autres modules de fonctionner correctement.
Voici donc un poste très simple sur la création de nodes via la programmation.
1.1 Initialisation de l’objet node
123456789101112
<span class='line'><span class="nv">$node</span> <span class="o">=</span> <span class="k">new</span> <span class="k">stdClass</span><span class="p">();</span> <span class="c1">// Création d’un nouvel objet</span> </span><span class='line'><span class="nv">$node</span><span class="o">-></span><span class="na">type</span> <span class="o">=</span> <span class="s2">"article"</span><span class="p">;</span> <span class="c1">// Spécification du type de contenu à créer</span> </span><span class='line'><span class="nv">$node</span><span class="o">-></span><span class="na">title</span> <span class="o">=</span> <span class="s2">"Le titre de votre nouveau node"</span><span class="p">;</span> </span><span class='line'><span class="nv">$node</span><span class="o">-></span><span class="na">language</span> <span class="o">=</span> <span class="nx">LANGUAGE_NONE</span><span class="p">;</span> <span class="c1">// Définition de la langue du contenu.</span> </span><span class='line'><span class="nv">$node</span><span class="o">-></span><span class="na">path</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span><span class="s1">'alias'</span> <span class="o">=></span> <span class="s1">'article/chuck-norris-is-a-jedi'</span><span class="p">);</span> <span class="c1">// Ajout de l’url du contenu</span> </span><span class='line'><span class="nx">node_object_prepare</span><span class="p">(</span><span class="nv">$node</span><span class="p">);</span> <span class="c1">// Création des valeurs par défaut.</span> </span><span class='line'><span class="nv">$node</span><span class="o">-></span><span class="na">uid</span> <span class="o">=</span> <span class="mi">14</span><span class="p">;</span> <span class="c1">// Ajout de l’auteur du node si vous souhaitez qu'il soit différent de l'utilisateur en cours</span> </span><span class='line'> </span><span class='line'><span class="c1">// Do your stuff</span> </span><span class='line'> </span><span class='line'><span class="nv">$node</span> <span class="o">=</span> <span class="nx">node_submit</span><span class="p">(</span><span class="nv">$node</span><span class="p">);</span> <span class="c1">// Prépare le node avant l’enregistrement (date + auteur) si les champs sont vides.</span> </span><span class='line'><span class="nx">node_save</span><span class="p">(</span><span class="nv">$node</span><span class="p">);</span> <span class="c1">// Enregistrement du node.</span> </span>
Notes :
* Définition de la langue : Si le module Locale n’est pas activé sur votre site, utilisez la constante LANGUAGE_NONE afin de ne pas spécifier de langue en particulier à votre contenu, sinon insérez la langue désirée.
* Node_object_prepare() : remplit par défaut certaines valeurs telles que le statut, la promotion en page d’accueil, les commentaires ou encore le sticky.
1.2 Ajout du champ body
Au passage, depuis cette dernière version le champ body n’est plus obligatoire et peut être supprimé/caché depuis l’interface de gestion des champs.
1234
<span class='line'><span class="nv">$body_text</span> <span class="o">=</span> <span class="s1">'Chuck Norris donne fréquemment du sang à la Croix-Rouge. Mais jamais le sien.'</span><span class="p">;</span> </span><span class='line'><span class="nv">$node</span><span class="o">-></span><span class="na">body</span><span class="p">[</span><span class="nv">$node</span><span class="o">-></span><span class="na">language</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s1">'value'</span><span class="p">]</span> <span class="o">=</span> <span class="nv">$body_text</span><span class="p">;</span> <span class="c1">// Votre texte</span> </span><span class='line'><span class="nv">$node</span><span class="o">-></span><span class="na">body</span><span class="p">[</span><span class="nv">$node</span><span class="o">-></span><span class="na">language</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s1">'summary'</span><span class="p">]</span> <span class="o">=</span> <span class="nx">text_summary</span><span class="p">(</span><span class="nv">$body_text</span><span class="p">);</span> <span class="c1">// Résumé de votre champ body si vous en voulez un.</span> </span><span class='line'><span class="nv">$node</span><span class="o">-></span><span class="na">body</span><span class="p">[</span><span class="nv">$node</span><span class="o">-></span><span class="na">language</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s1">'format'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'filtered_html'</span><span class="p">;</span> <span class="c1">// Format d’entrée du champ.</span> </span>
Notez ici la réutilisation du champ $node->language défini à l’étape précédente, cette variable vous servira souvent pour récupérer les informations de vos champs.
1.3 Remplissez vos champs
Rien de compliqué puisque la manip’ est la même que pour le champ body, il suffit d’ajouter la valeur désirée dans le champ voulu.
Par contre certain champ ont besoin de plus d’informations comme le champ texte à qui il faut renseigner le format d’entrée.
12
<span class='line'><span class="nv">$node</span><span class="o">-></span><span class="na">field_custom_name</span><span class="p">[</span><span class="nv">$node</span><span class="o">-></span><span class="na">language</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s1">'value'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'Texte dans mon champ custom'</span><span class="p">;</span> </span><span class='line'><span class="nv">$node</span><span class="o">-></span><span class="na">field_custom_name</span><span class="p">[</span><span class="nv">$node</span><span class="o">-></span><span class="na">language</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s1">'format'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'text_format'</span><span class="p">;</span> <span class="c1">// Si votre champ à un format d’entrée n’oubliez pas de le renseigner.</span> </span>
1.4 Renseigner un champ nodereference
Si vous utilisez le module nodereference pour lier vos contenus, il vous suffit simplement d’indiquer le nid du node dans le champ pour que cela fonctionne.
Le nouveau système de fichier mérite un post à lui tout seul pour bien le comprendre et s’en servir, du coup je vous livre toute faite la solution pour ajouter un fichier déjà présent sur votre site à votre contenu.
12345678910
<span class='line'><span class="nv">$filepath</span> <span class="o">=</span> <span class="nx">drupal_realpath</span><span class="p">(</span><span class="s1">'misc/druplicon.png'</span><span class="p">);</span> <span class="c1">// Création du chemin du fichier</span> </span><span class='line'><span class="c1">// Création de l’objet contenant les propriétés du fichier.</span> </span><span class='line'><span class="nv">$file</span> <span class="o">=</span> <span class="p">(</span><span class="nx">object</span><span class="p">)</span> <span class="k">array</span><span class="p">(</span> </span><span class='line'> <span class="s1">'uid'</span> <span class="o">=></span> <span class="mi">1</span><span class="p">,</span> </span><span class='line'> <span class="s1">'uri'</span> <span class="o">=></span> <span class="nv">$filepath</span><span class="p">,</span> </span><span class='line'> <span class="s1">'filemime'</span> <span class="o">=></span> <span class="nx">file_get_mimetype</span><span class="p">(</span><span class="nv">$filepath</span><span class="p">),</span> </span><span class='line'> <span class="s1">'status'</span> <span class="o">=></span> <span class="mi">1</span><span class="p">,</span> </span><span class='line'><span class="p">);</span> </span><span class='line'><span class="nv">$file</span> <span class="o">=</span> <span class="nx">file_copy</span><span class="p">(</span><span class="nv">$file</span><span class="p">,</span> <span class="s1">'public://'</span><span class="p">);</span> <span class="c1">// On déplace le fichier à la racine du système de fichiers</span> </span><span class='line'><span class="nv">$node</span><span class="o">-></span><span class="na">field_image</span><span class="p">[</span><span class="nx">LANGUAGE_NONE</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="k">array</span><span class="p">)</span><span class="nv">$file</span><span class="p">;</span> <span class="c1">// On assigne le fichier au champ</span> </span>
On charge le node avec un id, on met à jour le champ qui nous intéresse et on le sauvegarde. Si vous avez plusieurs nodes à mettre à jour, utilisez la fonction node_load_multiple() qui vous évitera de faire plusieurs requêtes sur la base de données.
Voilà, j’espère que cet article et les quelques liens ci-dessous vous permettront de vous aider. Il y a pas mal de modules qui font de la création de nodes comme ça. En trouver un et le décortiquer reste la meilleure solution pour apprendre. Si toutefois vous avez plus d’informations, je suis preneur :)
Voici les quelques sources qui m’ont aidées à comprendre les changements de cette nouvelle version:
Voilà un billet d’un style un peu différent, plus court qu’à l’habitude, à propos d’une information bête au sujet des fonctions de validation qui m’a fait perdre une heure hier et qui aurait pu être évitée.
Si vous vous retrouvez dans la situation où vous ajoutez une fonction de validation sur un formulaire mais que cette fonction n’est pas exécutée (et que bien sûr vous avez vérifié par trois fois la syntaxe de votre code), prenez le temps de regarder le détail du formulaire.
En fait il faut savoir que lorsque vous cliquez sur un élément de formulaire de type bouton, ses fonctions de validation et d’exécution sont exécutée et seulement celles de ce bouton. Ce qui au final est logique car cela vous permet d’avoir un comportement différent par bouton sans avoir de risque d’interférences entre les fonctions de validation / exécution de votre bouton et celles du formulaire global. Le détail des mécanismes de ces fonctions à exécuter se trouve dans la fonction form_execute_handlers().
A noter également qu’il existe un attribut du Form API qui a été introduit dans Drupal 7 qui permet de limiter les valeurs à contrôler lors de la soumission du formulaire, il s’agit de l’attribut #limit_validation_errors. Cet attribut prends un tableau comme valeur avec la liste des entrées du $form_state['values'] qui doivent être validées. Pratique pour contourner un champ obligatoire lorsque l’on a un bouton qui supprime un noeud par exemple.
Je ne sais pas si vous avez déjà voulu ajouter une classe sur la balise body en Drupal 6 mais ce n’était pas le truc le plus évident à faire. La meilleure solution se résumait à modifier le fichier template.php, à implémenter le hook template_preprocess() et à ajouter ses valeurs au tableau $vars[‘body_classes’], bref, par rapport au besoin c’était un poil compliqué.
Drupal 7 permet maintenant de faire ça plus facilement et directement dans un .module. Pour cela il faut utiliser le hook : hook_preprocess_HOOK() qui permet aux modules d’intervenir sur sur n’importe quel preprocess de thème.
Puisque la construction html de la page et donc la génération des classes pour le body est faite lors du template_preprocess_html il nous faut implémenter le hook_preprocess_html. Dans l’exemple ci-dessus j’ai juste ajouté une nouvelle classe à mon body mais vous pouvez faire tout ce que vous voulez lors de cette étape vous avez entre les mains toutes les infos permettant la construction de la structure html de la page.
Alors, la vie n’est pas plus simple avec Drupal 7 ? :)
Afin d'ordonner les modules Drupal pour choisir l'ordre de chargement de ceux-ci, il suffit d'implémenter le hook install du module et de changer le poids associé.
Pour être plus clair, il faut créer un fichier nom_module.install ayant pour contenu ceci :
function NOM_MODULE_install(){ db_query("UPDATE {system} SET weight = '-1' WHERE name = 'NOM_MODULE' AND type = 'module'"); }