Planète

Industrialisation et multi-sites avec Drupal

Porte usine

Créer une usine à sites ou pouvoir industrialiser la création d'un site Internet est une problématique souvent rencontrée pour développer sa présence Internet. Drupal permet d'industrialiser la production de sites internet et nous offre comme d'habitude plusieurs solutions pour y parvenir. Faisons un tour d'horizon des principaux moyens de mettre en place une présence en ligne massive avec Drupal, et quels sont les avantages et inconvénients de chacune des architectures possibles.

Thème 
Industrialisation
Drupal
multi-site
usine à site

Par Artusamak
Julien Dubois

Inclure du javascript en Drupal 8

Inclure du javascript en Drupal 8

Drupal 8 continue son avancée et les questions se font de plus en plus pressantes quant à son utilisation.

Des pistes de réponse existent et plus récemment Bluespark a mis en ligne le status du top 100 des modules qui permet de se rendre compte de la situation de la contribution.

Le rapport avec javascript vous me direz ? Et bien, il se trouve que pas mal de modules servant à intégrer des librairies tierces sont absents (Views slideshow, Lightbox, Superfish, jCarousel). Alors comment s'en servir quand même dans Drupal 8 ?

Pour l'exemple j'ai voulu utiliser Masonry sur une vue.

Comme précisé dans notre liste des changements en Drupal 8, la solution de remplacement à drupal_add_js est "d'attacher" son fichier à un render array.

Mais on peut aussi passer par la déclaration d'une librairie en créant un fichier <mondulename>.libraries.yml à la racine de son module.

jquery.masonry: # the machine name of library.
  version: 2.1 # the version of the library.
  js:
    /libraries/masonry/jquery.masonry.min.js: {} # path to js the source with additional parameters.
  dependencies:
    - core/jquery # required dependencies.

Ensuite il suffit "d'attacher" la librairie à un render array de la page (ici celui de la vue).

function happyculture_views_pre_render($view) {
  if ($view->storage->id == 'realisations') {
    $view->element['#attached']['library'][] = 'happyculture/jquery.masonry';
    $view->element['#attached']['library'][] = 'happyculture/happyculture.masonry';
  }
}

Cela à l'avantage de permettre la déclaration de dépendances et facilite une inclusion plus fine des librairies dans les pages nécessaires. De plus, cela rend plus simple la suppression de l'injection d'une librairie en cas de besoin.

Ensuite, on peut faire de même avec son code javascript en rajoutant son fichier custom dans le fichier <mondulename>.libraries.yml.

happyculture.masonry:
  version: 1.0
  js:
    happyculture.masonry.js: {}
  dependencies:
    - happyculture/jquery.masonry

Et le code en fonction de la librairie dans le fichier déclaré, ici happyculture.masonry.js qui sera placé à la racine de mon module.

(function ($) {
  "use strict";
  Drupal.behaviors.masonViews = {
    attach: function (context) {
      $('.view-realisations .view-content').masonry({
        itemSelector : '.views-row'
      });
    }
  };
})(jQuery);

Pour plus d'informations voir la doc officielle sur : https://www.drupal.org/node/2274843 et le change record associé https://www.drupal.org/node/2169605

Par Kgaut
Kevin Gautreau

À la découverte de Drupal 8 - #4 - Kint, ou le var_dump sous stéroides !

Si vous êtes développeur Drupal 7, vous connaissez certainement la librairie Krumo, qui permet d'afficher le contenu d'une variable de manière beaucoup plus pratique que le traditionnel var_dump, cette fonction n'étant pas native, mais fournie par le module Devel.

Rendu de Krumo

Rendu de Krumo

La librairie krumo n'étant plus maintenue, il a été proposé de la remplacer pour Drupal 8 par Kint.

Kint fonctionne de la même manière que krumo, mais propose de nouvelles fonctionnalitées bien utiles.

Il est toujours compris dans le module devel, au sein du sous-module "kint".

Une fois le module activé, on appelle la fonction en lui passant en paramètre la variable dont on veut afficher le contenu :

kint($form);

Voici ce que cela donne :

Rendu de kint

Et c'est pas fini! kint propose aussi la documentation des objets instanciés que l'on croise ainsi que leurs méthodes :

Affichage d'informations sur l'objet

Bref, un outil bien utile pour le développement !

Tags: 

Par Kgaut
Kevin Gautreau

À la découverte de Drupal 8 - #3 - Populer une entitée lors de l'installation

Le HOOK_install existe encore dans drupal 8, et il est donc possible d'en profiter pour populer automatiquement notre type d'entité lorsque l'on install le module qui la contient.

Toujours dans mon projet de site de pronostics, j'ai un type d'entité "Sport" qui contiendra l'ensemble des sports qui pourront caractériser une compétition.

Sachant que ces sports ne varient pas vraiment, je peux les créer dès l'installation.

Pour cela dans mon module mespronos_sports, je crée un fichier mespronos_sports.install avec à l'intérieur :

function mespronos_sports_install() {
  $entity = entity_create('sport', array(
    'created' => time(),
    'changed' => time(),
    'user_id' => 1,
    'name' => 'Football'
  ));
  $entity->save();

  $entity = entity_create('sport', array(
    'created' => time(),
    'changed' => time(),
    'user_id' => 1,
    'name' => 'Rugby'
  ));
  $entity->save();
}

On donne le nom du type d'entité que l'on veut créer et ensuite on passe un tableau avec l'ensemble des attributs de l'entité que l'on veut créer.

Et une fois le module installé :

Les sports sont créés !

Les sports sont créés !

Ainsi, plus besoin à chaque réinstallation de module, de re-créer les contenu, ce qui peut rapidement devenir long en cours de développement.

L'ensemble du code de mes modules est sur Github : https://github.com/kgaut/mespronos, le module ici en question est directement accessible là : https://github.com/kgaut/mespronos/tree/master/mespronos/custom/mesprono....

Résumé des épisodes précédents :

Tags: 

Par Kgaut
Kevin Gautreau

À la découverte de Drupal 8 - #2 : Création d'une entité avec fields

Suite de l'episode 1 : À la découverte de drupal 8 - #1 : Ma première entité

Aujourd'hui, nous continuons notre découverte de Drupal 8. Le but du jeu aujourd'hui est de créer une entité avec un champ personnalisé qui sera créé automatiquement lors de l'installation, via une grande nouveauté de Drupal 8, la gestion de la configuration.

Je continue mon site de pronostics pour l'occasion, c'est que l'euro 2016 arrive à grands pas ! Après l'entité League de l'épisode 1, nous allons cette fois gérer les équipes.Pourquoi je définie une équipe comme une entité et non pas un type de contenu ? Bonne question, pas vraiment de bonne réponse, c'est surtout car j'ai envie de jouer avec les entités !

Alors, comment est structurée une équipe ?

  • Id => La clé primaire
  • name => Le nom de l'équipe
  • logo => Le logo du club

Rien de bien compliqué pour les deux premiers attributs, ce seront des propriétés de base de mon entité. Le logo sera quand à lui un field, semblable à celui que l'on peut créer via l'interface d'administration, dans un type de contenu.

Création de l'entité

Comme dans l'épisode précédent, on va utiliser Console pour générer le module et l'entité.

On commence d'abord par vérifier s'il n'y a pas de mise à jours pour Console, on utilise pour ça composer. Via un terminal, à la racine de l'installation de Drupal :

composer update drupal/console
Mise à jour de console via composer

Mise à jour de console via composer

On génère maintenant le module mespronos_teams qui contiendra l'entité

bin/console generate:module
  • Nom du module : Mespronos Teams
  • Nom machine : mespronos_teams
  • Description : Gestion des équipes
  • Pas de contrôleur (on verra ça plus tard)

On génère maintenant l'entité

bin/console generate:entity:content
  • Nom de l'entité : Team
  • Nom machine : team

On active le module via l'administration.

Activation du module

Activation du module

Création du Champs

On peut maintenant ajouter des champs à notre entité via la field API (anciennement CCK dans Drupal 6, et dans le core depuis Drupal 7)

Via Gérer > Structure > Team Settings > Gérér les champs on créer un champ de type « image » dont le nom machine sera field_logo.

Field logo dans l'administration

Field logo dans l'administration

La configuration (CMI en action)

C'est super, on peut maintenant créer des équipes et leur affecter un logo. Par contre le soucis ici, c'est que si jamais je désactive mon module, je perds le champs que je viens de créer. Aussi, je ne peux pas en versionner la configuration, si jamais je viens la modifier plus tard. Mais heureusement pour nous l'initiative CMI « Configuration Management Initiative » a pensé à nous dans Drupal 8.

L'objectif de cette initiative est donc de pouvoir exporter toute la partie « configuration » de Drupal dans des fichiers YAML.

Via le fichier settings.php, on peut définir là où l'on veut stocker l'ensemble des fichiers YAML qui contiendront la configuration de drupal. Par défaut c'est dans un dossier dont le nom est généré aléatoirement dans le dossier /sites/monsites. Personnellement je préfère que ces éléments ne soient pas accessible sur internet, même si normalement le risque est minime. Pour cela à la fin du fichier settings.php je dé-commente et modifie les lignes suivantes :

$config_directories['active'] = '../config/active';
$config_directories['staging'] = '../config/staging';

On peut exporter d'un coup l'ensemble de la configuration de notre site via drush avec la commande config-export :

drush @monsite config-export

Fichiers de configuration

Fichiers de configuration

Revenons à nos moutons, nous allons donc chercher la configuration de notre field et l'intégré à notre module. Afin que lors de l'installation du module, le field soit automatiquement créé. La configuration du champs est répartie dans deux champs :

field.field.team.team.field_logo.yml
field.storage.team.field_logo.yml

Pour que ces fichiers soient pris en compte lors de l'installation il faut les placer dans un dossier config/install dans notre module :

Structure du module

Structure du module

On test en désinstallant notre module et le réinstallant, c'est ok, notre champs existe !

Field logo dans l'administration
Youpi Youhou !

C'est fini pour aujourd'hui, comme la dernière fois vous pouvez trouver l'ensemble de mes modules sur github à l'adresse suivante : https://github.com/kgaut/mespronos

N'hésitez-pas si vous avez des remarques ou des questions !

Tags: 

Créer un bloc Drupal 8 en quelques secondes

Photo d'un pic rocheux

Nous continuons d'explorer les possibilités offertes par le module Console et allons découvrir comment générer un bloc Drupal 8 en très peu de temps, puis à le personnaliser selon nos besoins.

Thème 
Drupal 8
Développement

Par Artusamak
Julien Dubois

Drupal et Scrum depuis les tranchées - Gérer le backlog du sprint

Drupal et Scrum depuis les tranchées - Gérer le backlog du sprint

Votre backlog de sprint est prêt, l'équipe s'est engagée à livrer le périmètre convenu et n'attend plus qu'une chose, poser les mains sur son clavier pour coder ! Lâchez les fauves, l'heure est venue de les laisser s'exprimer.

La prochaine grande étape du projet va résider dans le pilotage des deux ou trois semaines qui composent le sprint. L'équipe va passer beaucoup de temps avec le backlog du sprint, il doit respirer au rythme des commits et des échanges entre les équipiers. Une des valeurs importantes des méthodes agiles est l'auto-gestion, chaque personne doit être pro-active pour s'attribuer du travail et lever les obstacles qu'elle rencontre lors de la réalisation des stories techniques ou fonctionnelles. Il est capital qu'à chaque fois qu'une story est démarrée, change d'état pour être envoyée en testing ou se termine, le backlog du sprint soit mis à jour en conséquence. Le backlog permet d'un simple coup d'oeil de savoir qui travaille sur quoi et de suivre l'état d'avancement du sprint sans avoir à solliciter une personne.

Pour les gens pressés : TL;DR.

Identifier les goulots d'étranglement

Parfois l'équipe a beau se montrer concernée, elle a le sentiment de faire du sur place. Il y a 6 ou 7 stories qui n'arrivent pas à démarrer. Comment comprendre ce qui bloque ? Les stories pourront-elles vraiment être traitées dans ce sprint ? Pour répondre à ces questions, gardez le numéro de votre marabout préféré dans votre poche, on va plutôt chercher à répondre à cela de façon analytique.
Deux outils (au moins) sont à notre disposition pour mesurer notre activité, le burndown chart et le cumulative flow chart.

Le premier est une courbe illustrée ci-dessous sur laquelle on rapporte le nombre de jours écoulés en abscisse et le nombre de points de complexité en ordonnée. Chaque jour nous allons rapporter le nombre de points de complexité restant à faire. On démarre au premier jour à 120 si c'est la valeur de l'engagement de l'équipe et on soustrait tous les jours le nombre de points de complexité que l'équipe a réussi à fermer. Le but du jeu étant d'arriver à 0 avant le dernier jour du sprint. Cette courbe s'appelle un burdown si vous partez de 120 pour aller à 0, elle s'appelle un burnup si vous partez de 0 pour aller à 120 avant le dernier jour. On représente souvent le rythme idéal sur la courbe pour comparer la vitesse de progression réelle.

Crédits images : I8abug CC BY-SA 3.0 / Clarios Technologie

Oui mais voilà, le burndown ne montre pas tout, comment se rendre compte si de nombreuses stories sont coincées en attente de tests ou en attente de réponse ? Dans ce cas là nous devons nous appuyer sur un autre outil, le cumulative flow chart. Qu'est ce que c'est ? Ne faites pas cette tête, c'est très simple. Il s'agit un graphique qui représente le cumul des points de complexité pour toutes les stories du sprint. De cette façon vous savez si vous avez un grand écart entre le nombre de stories en cours de développement, de test ou en attente de réponse. Cela permet de repérer les goulots d'étranglement. Une image valant mille mots, en voici un exemple.


Crédit image : Clarios Technologie

Dans l'exemple présenté, on ne voit à aucun moment une masse prendre le dessus sur l'autre, s'il y avait une prédominance du testing on demanderait à l'équipe de donner un coup de main en testing afin de fermer des stories avant d'en commencer d'autres. Le but étant je vous le rappelle de livrer le plus de valeur ajoutée possible. Avoir des stories commencées mais non terminées ne nous avancerait pas.

Quel flux de travail pour mes stories ?

Un point important pour que l'équipe avance sans à-coups est qu'elle connaisse le flux de travail que les stories doivent suivent. Il n'y a pas UN flux de travail à suivre, c'est à vous de l'adapter au projet et à l'équipe mais je vais vous présenter les états qui composent celui que l'on suit chez Happyculture.

  • A faire : Etat par défaut d'une story.
  • En cours : Utilisé dès qu'un développeur choisi de travailler sur une story.
  • Résolu : Sert à indiquer que les développements sont terminés mais pas encore disponibles pour être testés, la story reste assignée au développeur tant qu'elle n'est pas prête à être testée. Cela nous sert principalement à cause de la revue de code, une fonctionnalité n'est pas disponible sur les environnements de test tant qu'elle n'a pas été intégrée au dépôt principal.
  • Besoin d'informations : Un développeur a une question sur un point précis ou le product owner pendant ses tests veut vérifier quelque chose. La personne qui se voit assignée la tache est celle qui doit répondre à la question.
  • A tester : La story est prête à être testée, le lien vers la page précise et les instructions pour clore la tache sont précisées en même temps que la story est assignée au product owner.
  • Fermé : Tout le monde a bien fait son travail, la story fonctionne comme prévu.

Comment gérer les demandes à côté ?

Il peut arriver au cours des tests de stories que le / la product owner tombe sur un bug d'intégration ou sur une phrase à reformuler. Pour gérer ces demandes particulières nous ne ré-ouvrons pas des stories qui auraient pu être candidates à recevoir ces demandes, on s'appuie plutôt sur une story particulière qui se promène de sprint en sprint et qui est un agrégat de toutes les petits demandes du genre. L'équipe y consacre quelques points de complexité à chaque sprint selon les priorités. Si certaines taches sont plus grosses, on ouvre une story dédiée qui sera intégrée au sprint suivant si nécessaire.

Au final, le backlog du sprint est au cœur de l'activité, il permet de s'assurer que tout le monde avance sur ses stories et permet de constater qu'aucun goulot d'étranglement ne se forme, si tel est le cas il est de la responsabilité de l'équipe de trouver les solutions, le scrum quotidien est là pour ça.

TL;DR

  • Le backlog du sprint doit à tout moment résumer l'état réel du projet
  • C'est l'équipe qui met à jour le backlog
  • Le burndown ou burnup combiné au cumulative flow chart permet de contrôler finement le rythme d'avancée de l'équipe
  • Si des goulots d'étranglement apparaissent, l'équipe réagit
  • L'équipe connaît et suit un flux de travail clair
  • Si des demandes non prévues se présentent on les regroupe au sein d'une story spéciale
Par Kgaut
Kevin Gautreau

Installer drush sous linux via composer

Drush est un outil indispensable pour développer sous drupal, il permet de contrôler son instance de site via le terminal pour les taches quotidiennes sur un site : téléchargement, activation de modules, vidage de cache, mise à jours de modules ou du core... Une fois que l'on y a goûté, on ne peut plus s'en passer.

Il existe un tas de méthode pour installer drush et il est parfois difficile de s'y retrouver : via les dépôts, PEAR, installation manuelle... Mais maintenant le moyen de plus simple est d'utiliser composer.

Si vous n'avez pas composer d'installé :

curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer

Ensuite on peut installer Drush :

Pour la version 6 (compatible avec drupal 6 et 7) :

composer global require drush/drush:6.*

Pour la version 7-dev (compatible avec drupal 6, 7 et 8, mais en cours de développement) :

composer global require drush/drush:dev-master

Personnellement j'utilise la version 7 de drush (vu que je commence à faire mumuse avec la version 8 de drupal)

Quelques liens sur drush que je vous conseille :

Tags: 

Drupal SA-CORE-2014-005, mise en perspective et enseignements

photo d'un phare

Le mercredi 15 octobre 2014, la Drupal Security team a publié un avis de sécurité critique, sous la référence SA-CORE-2014-005 (CVE-2014-3704), concernant une vulnérabilité hautement critique permettant à un attaquant anonyme de compromettre n'importe quel site Drupal 7 par une attaque de type injection SQL. Faisons un petit retour sur la chronologie de l'évènement pour le mettre en perspective et essayer d'en dégager quelques enseignements.

Thème 
Drupal
Sécurité
Sécurité Drupal

Par Kgaut
Kevin Gautreau

À la découverte de drupal 8 - #1 : Ma première entité

Ayant l'envie de tester Drupal 8, sans prendre trop de risques, je me suis décidé à prendre comme prétexte la création d'un site de pronostics pour l'euro 2016 (oui je m'y prends tôt).

Un petit coup de modélisation de mon schéma de données, et hop c'est parti.

Pour info, je vais tenter de faire plusieurs notes comme celle là, et autant en faire profiter tout le monde, mon code sera sur Github, au fur et à mesure, car cela évitera d'avoir des posts de 4km de long, l'adresse du projet sur Github : https://github.com/kgaut/mespronos

Le contexte

Installation du Drupal, je suis parti sur la beta 2.

Petites modifications dans le fichier settings.php pour sortir les dossiers de configurations de Drupal en dehors du docroot (donc non accessible via le web) :

$config_directories['active'] = '../config/active';
$config_directories['staging'] = '../config/staging';

Ensuite on rentre dans le vif du sujet avec la création de ma première entité drupal 8.

Je vous présente l'entité "League" qui contiendra les différentes compétitions de sport sur lesquelles des concours de pronostics seront organisés.

  • lid : Clé primaire
  • name : le nom de la compétition. Ex : "Ligue 1 2014-2015"
  • classement : doit-on calculer le classement pour ce concours ? (oui pour un championnat, non pour un mondial ou un euro)
  • status : archivé, en cours, terminé...

Mon entité sera contenue dans un module qui s’appellera "mespronos_leagues", car j'aime bien avoir un module par fonctionnalité.

Let's generate !

Pour la génération du module ainsi que de l'entité j'ai utilisé le super projet "console", que j'ai installé via composer. Je vous invite à découvrir l'installation et l'utilisation de ce module via ce tutoriel à l'adresse suivante : Créer un module Drupal 8 en 30 secondes | Flocon de toile.

J'ai donc crée mon module à l'aide de la commande suivantes

bin/console generate:module

une fois le module généré, il est temps de créer l'entité, toujours avec console, via la commande suivante : 

bin/console generate:entity:content

et là c'est magique, le contrôleur, les routes, l'entité, l'arborescence des dossiers... tout est généré automatiquement :

Encore une fois, sur la génération d'entités, tout est encore superbement expliqué sur ce site : Créer une entité Drupal 8 en 10 secondes top chrono | Flocon de toile

arborescence-entite-drupal8.png
 

il ne reste plus qu'à personnaliser selon nos besoins.

Ajout de propriétés

Une entité est "fieldable" c'est à dire que l'on peut très bien lui ajouter des champs via l'interface d'administration, comme l'on ferai avec un type de contenu. Mais comme vous le savez sûrement l'ajout d'un champ entraîne la création de deux tables (une pour la valeur, et une pour les révisions) ainsi une baisse de performance lors de l'affichage de notre contenu car cela génère forcement des jointures.

Une autre possibilité offerte par les entités est de définir des propriétés, c'est à dire des attributs qui seront présents directement dans la même table que notre entité.

Il faut pour cela modifier la méthode baseFieldDefinitions de notre entité (dans le fichier src/Entity/League.php)

Voici un exemple de code pour ajouter mon attribut "classement", qui est un booléen non affiché en front, mais présent sur le formulaire d'administration.

$fields['classement'] = BaseFieldDefinition::create('boolean')
  ->setLabel(t('Classement activé'))
  ->setDescription(t('Doit-on calculer le classement entre les équipes pour cette competitions'))
  ->setDisplayConfigurable('form', TRUE)
  ->setDisplayConfigurable('view', TRUE)
  ->setDefaultValue(TRUE)
  ->setDisplayOptions('form', array(
    'type' => 'boolean_checkbox',
    'settings' => array(
      'display_label' => TRUE,
    )
  ))
  ->setDisplayOptions('view', array(
    'type' => 'hidden',
  ));

Pour voir l'intégralité de mes modifications, vous pouvez consulter le fichier sur github : https://github.com/kgaut/mespronos/blob/master/modules/custom/mespronos_...

Personnalisation des routes et du menu

Dernier point que je souhaiter modifier, les routes et le menu. Dans drupal 8 le HOOK_menu n'existe plus, tout à été remplacé par de la configuration dans des fichiers YAML (welcome Symfony)

Les routes sont les chemins d'accès, et sont défini dans le fichier mespronos_leagues.routing.yml.

Les éléments de menu sont eux dispatchés dans plusieurs fichiers suivant leur type :

drupal7menutodrupal8.png

drupal7menutodrupal8.png, par https://www.drupal.org/node/2118147

Dans l'admin dans la partie contenu, je voulais un onglet menant à la liste de tous mes compétitions, comme cela :

Onglet dans drupal 8
 

J'ai donc pour cela modifié le fichier mespronos_leagues.routing.yml et ajouté les lignes suivantes :

league.list:
  title: 'Compétitions'
  route_name: league.list
  description: 'Liste de toutes les compétitions'
  base_route: system.admin_content

C'est tout pour aujourd'hui, n'hésitez pas à consulter mon code sur github, j'ai mis l'intégralité de ce module, et j'ajouterai au fur et à mesure la suite. Si vous voyez des erreurs, des améliorations, n'hésitez-pas à me faire des push-request.

Le projet sur github : https://github.com/kgaut/mespronos

Quelques liens qui m'ont beaucoup servis :

Tags: 

Par Kgaut
Kevin Gautreau

Drupal 8 > le thème d'administration Adminimal est disponible

Je fais un petit peu joujou avec la version 8 de Drupal (la seconde version beta est sortie il y a quelques jours).

Et pour info la version 8 du superbe thème d'administration "Adminimal" est disponible. J'avais déjà rapidement présenté le thème ici. Alors même si toutes les customisations de la version 7 ne sont pas encore disponible, son utilisation améliore encore l'experience d'administration de Drupal 8.

Plus d'information sur la page du projet : https://www.drupal.org/project/adminimal_theme

 

Tags: 

Créer une entité Drupal 8 en 10 secondes top chrono

Compteur vitesse voiture

Dans un précédent billet, nous avons découvert le projet Console qui permet d'automatiser la création de modules Drupal 8 et d'autres taches récurrentes. Découvrons ensemble quelques autres fonctionnalités très intéressantes, au travers notamment de la génération d'une entité Drupal 8 sur mesure.

Thème 
Drupal 8
Modules
Développement

Par Simon Georges
Simon Georges

Drupal, tous des experts ?

Comment faire du Drupal ? Faut-il utiliser ce module ou préférer le coder ? Mon budget permet-il de réaliser ces développements ? Ne vous posez plus ces questions et venez vous former avec des experts !

Par admin

Forum PHP - Montrouge 23-24 octobre 2014

Le Forum PHP 2014, l'événement majeur de l'AFUP et la communauté PHP francophone depuis plus de 10 ans, aura lieu à Montrouge les 23 et 24 octobre.

Il s'agit d'un rendez-vous incontournable autour du langage PHP, avec cette année les grandes thématiques suivantes :

  • Retours d'expérience PHP à grande vitesse
  • Gagner du temps avec l'écosystème open-source PHP
  • Agile et Devops en PHP
  • Les solutions du développeur PHP rapide

et bien sur des têtes d'affiches célèbres, que vous retrouverez sur le programme de ce grand événement : http://afup.org/pages/forumphp2014/sessions.php

On y parlera de Drupal (Live coding : construisons ensemble notre premier site Drupal 8) ou d'outils intéressant Drupal et d'autres langages (platform.sh le PAAS qui résout le casse tête dev/staging/prod)

Les membres de l'association Drupal France et Francophonie, à jour de cotisation, peuvent bénéficier d'une remise sur le prix de l'entrée. Pour cela, il suffit d'envoyer un courriel au bureau (bureau [à] listes.drupalfr.org) pour que l'on vous communique le code "coupon".

Enfin, de nombreuses surprises vous attendent comme les ateliers pratiques, les cliniques co-organisés par les sponsors, une soirée communautaire, etc...

Taxonomy upgrade extras : 
En page d'accueil : 

Créer un module Drupal 8 en 30 secondes

Chronomètre

Avec l'intégration de composants de Symfony2, l'adoption du format YAML, la refonte complète de Drupal 8 vers la programmation orientée objet, etc. l'initialisation d'un module Drupal 8 est devenue plus complexe (au  sens chronophage) que sur Drupal 7 où il suffisait de déclarer son module (fichier .info) et de créer un fichier .module pour pouvoir commencer tout de suite à développer des fonctionnalités métier.

Thème 
Développement
Modules
Drupal 8

Par admin

Coupon de réduction pour Drupagora

L'association Drupal France et Francophonie (DrupalFR) est partenaire de Drupagora 2014. Il s'agit d'un événement dédié aux Chefs de Projets et DSI.

Pour l'édition 2014, un programme de qualité est proposé avec les thématiques suivantes :

  • Un cycle dédié à l’industrialisation
  • Un cycle dédié au e-commerce
  • Des conférences dédiées aux bonnes pratiques, au cloud et à la sécurité
  • De nombreux retours d’expérience

Drupagora

Enfin, grâce à l'association, vous pouvez bénéficier d'une remise sur le prix d'entrée de 50 % jusqu'au 24 octobre et après 30 %.
Ce coupon de réduction est disponible sur simple demande à bureau [ALT] listes [POINT] drupalfr [POINT] org, si vous êtes membre de l'association et à jour de votre cotisation

Le programme de Drupagora 2014
Site de l'événement Drupagora 2014

Par vincent59
Vincent Liefooghe

Récupérer un terme de taxonomie à partir d'un champ spécifique

Depuis Drupal7, on peut ajouter des champs à un terme de taxonomie.

Ceci peut être intéressant pour ajouter une image ou d'autres informations. Mais comment dans ce cas chercher un terme de taxonomie sur la base de ce champ spécifique ?
Imaginous que nous avons une taxonomie de type "Music Categories", sur laquelle nous ajoutons un champ spécifique, "music_code", qui est utilisé dans une interface avec une autre système.

Nous avons alors 2 options :

  •     utiliser la fonction taxonomy_get_tree et filtrer les résultats sur ce champ
  •     rechercher  directement sur ce champ, via EntityFieldQuery

Dans cet article, j'explique comme retrouver un terme, en se basant sur un champ spécifique, en utilisant EntityFieldQuery.

Cet example peut être lancé en ligne de commande, sans être inclus dans un module. Voyons le code :
 

<?php
$_SERVER['REMOTE_ADDR']='localhost';
// drupal bootstrap
$drupal_directory = "/var/www/drupal";
chdir($drupal_directory);
define('DRUPAL_ROOT', getcwd());
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

// Retrieve Vocabulary ID (VID)
$vocabulary_name='categories';
$vocab = taxonomy_vocabulary_machine_name_load($vocabulary_name);

// bundle = Machine Name of the vocabulary
$query = new EntityFieldQuery();
$query
  --->entityCondition('entity_type', 'taxonomy_term')
  ->entityCondition('bundle', $vocabulary_name)
  ->propertyCondition('vid', $vocab->vid)
  ->fieldCondition('field_music_code', 'value', 'C042', '=');

$results = $query->execute();
if (!empty($results['taxonomy_term'])) {
  foreach($results['taxonomy_term'] as $tid) {
    $term = taxonomy_term_load($tid->tid);
    $name=$term->name;
    echo "Term ID = ",$term->tid," Name = ",$name,PHP_EOL;
    echo "Field Code Client Value = ",$term->field_music_code[LANGUAGE_NONE][0]['value'],PHP_EOL;
  }
}
else
{
  echo "No result for this code ! ",PHP_EOL;
}
?>

Les 7 premières lignes sont utilisées pour lancer le bootstrap Drupal puisque nous n'utilisons pas de module.
Ensuite, nous recherchons le Vocabulary ID, avec la fonction taxonomy_vocabulary_machine_name_load. Ceci nous donne le VID (vocabulary ID).
Nous construisons ensuite la requête Entity Query, avec plusieurs paramètres :

  •     Entity type : dans notre cas, c'est 'taxonomy_term' car nous travaillons sur les taxonomies
  •     Bundle : le nom machine du vocabulaire
  •     propertyCondition : l'ID du vocabulaire que nous utilisons pour la recherche des termes
  •     fieldCondition : la condition placée sur le champ spécifique.

Dans cet exemple, le code est C042, et nous cherchons tous les termes qui utilisent ce code dans leur champ spécifique.

Le résultat, dans notre cas, est  :

Term ID = 4 Name = Funk
Field Code Client Value = C042

 

Catégorie: 


Tag: 

Par vincent59
Vincent Liefooghe

Retrieve Taxonomy Term by a custom field

Starting with Drupal7, once can add fields to taxonomy terms.

This can be interesting to add images or other informations. But what if you want to search a taxonomy term on this custom field in a module ?

Imagine we have a list of Music Categories, and we add a custom field, "music_code", that is used to interface with one other system.

Then we have 2 options :

In this article, I explain how to retreive a term ID based on a custom field on a Drupal taxonomy.

This example can be run on the command line for testing, no need for a module.

 

<?php
$_SERVER['REMOTE_ADDR']='localhost';
// drupal bootstrap
$drupal_directory = "/var/www/drupal";
chdir($drupal_directory);
define('DRUPAL_ROOT', getcwd());
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

// Retrieve Vocabulary ID (VID)
$vocabulary_name='categories';
$vocab = taxonomy_vocabulary_machine_name_load($vocabulary_name);

// bundle = Machine Name of the vocabulary
$query = new EntityFieldQuery();
$query
  ->entityCondition('entity_type', 'taxonomy_term')
  ->entityCondition('bundle', $vocabulary_name)
  ->propertyCondition('vid', $vocab->vid)
  ->fieldCondition('field_music_code', 'value', 'C042', '=');

$results = $query->execute();
if (!empty($results['taxonomy_term'])) {
  foreach($results['taxonomy_term'] as $tid) {
    $term = taxonomy_term_load($tid->tid);
    $name=$term->name;
    echo "Term ID = ",$term->tid," Name = ",$name,PHP_EOL;
    echo "Field Code Client Value = ",$term->field_music_code[LANGUAGE_NONE][0]['value'],PHP_EOL;
  }
}
else
{
  echo "No result for this code ! ",PHP_EOL;
}
?>

The first lines are here only to bootstrap Drupal when you are not in a module.

Then we define the Vocabulary ID, with taxonomy_vocabulary_machine_name_load function. This gives us the vocabulary ID (we suppose it is created).

Then we build the Entity Query, with several parameters :

  • Entity type : in our case, it is 'taxonomy_term' because we are dealing with taxonomies
  • Bundle : the machine name of our vocabulary
  • propertyCondition : the vocabulary ID we use to identify the terms (belonging to this vocabulary)
  • fieldCondition : the condition placed on the custom field.

In this example, the code is C042, and we search all terms (well, there is only one) that is using this code.

The result in our case is :

Term ID = 4 Name = Funk
Field Code Client Value = C042

 

Catégorie: 


Tag: 

Pages