Planète

Par Kgaut
Adhérent
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: 

Par flocondetoile
Adhérent

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
mer, 29/10/2014 - 21:11
Artusamak

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.

Image retirée. Image retirée.

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 suivre. 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
Adhérent
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: 

Par flocondetoile
Adhérent

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
Adhérent
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
Adhérent
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: 

Par flocondetoile
Adhérent

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 : 
Par flocondetoile
Adhérent

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: 

Par flocondetoile
Adhérent

Manipuler les menus de Drupal 8 (le retour)







Dans un précédent billet, nous avions pu voir que l'API Drupal 8 pour manipuler les menus avait assez peu changé. Mais c'était encore avec une version alpha, et les choses ont quelque peu évolué depuis...et notamment la sortie de la première version bêta de Drupal 8. Repassons en revue quelques techniques pour pouvoir intervenir sur un menu sous Drupal 8.

Thème 
Menu
Thème
Drupal 8

Par juliendubreuil
julien dubreuil
Depuis 2009 maintenant, je développe avec le CMS/CMF Drupal. J’étais à la recherche d’un framework capable de remplacer un projet et je n’ai jamais arrêté de m’en servir depuis ce moment.

Liste des modules pour Drupal Commerce

Liste de module pour Drupal Commerce

Que vous soyez à la recherche d’un module pour un but précis, ou simplement à la recherche de nouvelles fonctionnalités pour votre site e-commerce il n’est pas simple de s’y retrouver dans tous ces modules. Ainsi chercher un module peu vite s’avérer long et fastidieux. Voici donc une petite liste de modules qui vous permettront de trouver votre chemin.

Comme avec le guide des modules pour Drupal 7, j’ai reparti les modules dédiés au e-commerce en différentes sections. Cette liste est une liste collaborative, ainsi, n’hésitez pas à commenter si vous trouvez des modules à ajouter !

E-commerce

Drupal Commerce est une suite de modules dédié au e-commerce qui s’est imposée sur Drupal.

Commerce VAT et Commerce EU VAT pour gérer les taxes en fonction du pays de votre client. Pensez à ne pas utiliser le module Taxe si vous utilisez ces deux modules. Ils sont bien maintenus et prennent en comptes les changements de lois.

Address book pour simplifier la vie de vos clients en leur permettant de créer un carnet d’adresse de façon ce qu’ils réutilisent leurs adresses dans le tunnel d’achat.

Shipping fourni un système de calcul de prix de frais de port. Ce module est un framework que vous devrez utiliser avec les modules de livraisons de votre transporteur préféré.

Commerce billy et Commerce billy mail pour générer des factures depuis votre site au format PDF afin que vos clients puissent les télécharger.

Commerce search api couplé à Search api vous permettra d’indexer les entités Drupal Commerce dans un moteur de recherche. Vous pourrez alors construire vos pages de catalogues robustes et performantes.

Search API ranges pour donner à vos visiteurs la possibilité de réduire les résultats entre deux prix.

Commerce backoffice afin d’avoir une meilleure expérience utilisateur dans la gestion et l’administration de votre boutique. Si vous avez déjà installé Commerce Kickstart v2 vous avez pu noter que le backoffice était plus beau que la version précédente et c’est principalement grâce à ce module.

Commerce reports permet aux marchands d’avoir une idée de ce qu’il se passe sur leur site. Ce module fourni un dashboard de statistiques sur l’évolution des commandes, clients…

Google analytics pour Commerce couplé à Google analytics vous permettra de traquer vos ventes en plus de vos statistiques de visites depuis le dashboard Google Analytics.

Cart and Checkout

Commerce checkout redirect redirige vos utilisateurs non connectés vers une page de création de compte ou de login avant de rentrer dans le tunnel d’achat. Notez que forcer les utilisateurs à créer un compte peut être source d’abandon de paniers.

Commerce checkout complete registration offre la possibilité aux clients de compléter le tunnel d’achat en anonyme et de créer un compte après le paiement s’ils le souhaitent.

Commerce checkout progress affichera dans votre checkout une barre en haut de la page de façon à indiquer à vos clients à quelle étape du checkout ils sont.

Commerce cart expiration permet de définir une durée de validité pour un panier. Par défaut les paniers n’ont pas de limite de validité, or il peut être intéressant d’en définir une de façon à faire un peu de ménage tous les 15 jours. Ce module vous permettra de supprimer les paniers selon vos critères. Pensez à avertir vos clients qu’ils ont laissé un panier histoire de les relancer.

Commerce add to cart confirmation affichera une pop-in lors de l’ajout au panier d’un produit. Cette pop-in offrira à vos clients le choix de poursuivre leurs achats ou de commencer le tunnel d’achat.

Commerce ajax cart donnera à vos clients la possibilité d’avoir une idée de leur panier via un bloc en Ajax. Cette fonctionnalité est bien moins intrusive que la pop-in de confirmation.

Products

Commerce stock vous aidera à gérer vos stocks et ainsi les produits disponibles à la vente.

Commerce stock notification pour ne plus louper une vente lorsque vous êtes en rupture de stock ! En cas de rupture de produit, le champ stock de la fiche de produit sera remplacé par un formulaire afin que le client puisse soumettre son email afin d’être notifié lors du réapprovisionnement.

Retour de marchandises Il arrive des fois où tout ne se passe pas comme prévu dans la vente à distance. Ce module permettra à vos clients de faire une demande de retour de leurs produits directement depuis leur commande. Notez qu’avec la loi Hamon, vous devez permettre à vos clients de pouvoir faire une demande de retour via un formulaire sur votre site.

Wishlist est utile lorsque vous voulez permettre à vos visiteurs de créer des listes d’envies afin d’acheter plus tard. Un lien permettant d’ajouter le produit dans une liste de souhaits sera inséré sur chaque fiche produit. L’utilisateur pourra par la suite retrouver ses produits préférés depuis son compte.

Commerce productpopularity vous permettra d’afficher un bloc des produits les plus populaires sur votre site.

Commerce rec permet d’afficher une liste de produits que d’autres clients ont acheté en commandant ce produit. Pratique pour booster le panier moyen, cette fonctionnalité vous demandera d’avoir déjà réalisé un certain nombres de vente pour être efficace.

Marketing

Discounts et Coupon 2.x vous permettront de créer des offres spéciales pour vos clients. Vous pourrez alors faire des réductions sur des produits, des profils de clients avec ou sans limite dans le temps.

Imports / Exports

Si vous utilisez le module Features pour exporter la configuration de votre site, vous pourrez ajouter Commerce Features à votre projet pour exporter ce qui est relatif au module Commerce.

Deux solutions s’offrent à vous si vous voulez importer des données. La plus simple des solutions consiste à utiliser Feeds, Commerce Feeds, voir même Xpathparser pour Feeds. Simple et efficace vous pourrez créer un import pas trop compliqué.
Si vous souhaitez quelque chose de plus robuste je vous conseille d’utiliser le couple Migrate et Commerce Migrate. Plus compliqué à prendre en main vous pourrez néanmoins réaliser des imports/exports complexes.

Performances et développement

Commerce Devel et un module additionnel pour Devel qui vous aidera dans votre développement de tous les jours.

Commerce Entitycache vous permettra en complément de Entitycache d’améliorer les performances de votre site en ajoutant aux caches les entités Drupal Commerce.

Par LaboRouge

function drupal_map_assoc()

Fonction méconnue, drupal_map_assoc() permet de former un tableau associatif à partir d'un tableau linéaire.

&lt;?php<br />
$fruits = array('pommes', 'oranges');<br />
drupal_map_assoc($fruits);<br />
// $fruits est maintenant un tableau ('pommes' =&gt; 'pommes', 'oranges' =&gt; 'oranges')<br />
?&gt;

Trés pratique lorsque l'on veut assigner une clé | valeur de manière automatique. 


Drupal


Drupal API


Fonctions

Pages