Bienvenu sur mon site
Dans ce site vous trouverez mes sites réalisés sur Drupal, un blog dans lequel je mets quelques snippets et pleins d'autres petites choses.
Qui suis je ?
Ines WALLON
31 ans
Développeuse Drupal à temps plein
Autodidacte, Ines a créée sa première page web en 1999 avec un <body bgcolor="red">. Après un bref passages sur quelques CMS (Wordpress, Joomla), elle découvre Drupal 7 en 2014 à l'université de LIlle1. Aujourd'hui elle travaille au seins d'un service web à l'université de Lille dans lequel elle développe des sites pour l'université...
Blog
Présentation de GrumPHP
Quand on travaille à plusieurs sur un projet, il peut être intéressant de mettre en place des outils de qualité de code afin d’harmoniser le code source que vous souhaitez mettre en place sur votre projet (linter, CodeSniffer et tests) mais pour cela, il faudra alors s'assurer que tous les collaborateurs les utilisent afin d'en tirer réellement partie et c'est là que GrumPHP rentre en jeux.
Convertir un texte long en texte long formaté
Pour convertir un champ texte long (ici: field_communiques_texte_wysiwig) en texte log formaté, il suffit de créer un .install dans un module contenant l'exemple ci-dessous :
Ré indexer Search API par le code
Ré indexer tout Search API
use Drupal\search_api\Utility\CommandHelper;
$command_helper = new CommandHelper(\Drupal::entityTypeManager(),
Comment créer ou mettre à jours une entité Field Collection
Création
Pour ajouter du contenu dans un Field Collection, nous allons utiliser la classe Drupal\field_collection\Entity\FieldCollectionItem :
Utiliser les injections de dépendances
Pour éviter la redondance de \drupal::service('monservice') dans nos classes, nous allons utiliser les injections de dépendances
Astuce pour optimiser Composer dans vos containers Docker
Partager le dossier de cache
Lorsque vous lancé Composer celui ci va télécharger la liste des packages au format JSON pour les stocker dans un dossier de cache.
Quand vous lancé votre container celui ci est vide, donc vous perdez 30s à chaque fois que vous le lancer.
L'idée ici est d'aller chercher votre dossier de cache local pour le monter sous forme de volume
Supprimer les configurations d'un module à l'aide d'un hook_uninstall
Placer le hook_unistall dans le fichier .install de votre module
Ajouter des alias à la commande git
Pour ajouter des alias à votre commande git, modifier le fichier .gitconfig qui se trouve à la racine de votre HOMEDIR
et rajouter la section alias. Exemple :
Mise en place d'une architecture Docker + Drupal 8
Sa y est, j'ai enfin franchi le cap. j'ai migré tout mon site sur une architecture full Docker en dev, test et prod.
Je vais vous expliquer dans cet article, comment j'ai réussi à mettre tout ça en place
Mon environement de dev
Depuis que j'ai réinstallé mon poste (sous Fedora), j'ai décidé de travailler exclusivement avec Docker pour des questions de performance, de simplicité et de RAM (même si j'ai 16Go de ram sur mon environnement de dev).
Tout les sites que je développe sont basé sur une version de drupal-composer/drupal-project. dont voici l'exemple d'une hiérarchie

Dans cette hiérarchie, nous allons trouver un fichier docker-composer.yml qui va contenir tous les containers de notre projet :
version: "3.3"
services:
web:
image: libert/drupal_php_apache_dev:php-7.0
labels:
- "traefik.enable=true"
- "traefik.frontend.rule=Host:${DRUPAL_TRAEFIK_FRONTEND_RULE_HOSTNAME:-www.famillewallon.localhost}"
depends_on:
- mysql
- redis
- mail
volumes:
- .:/project
- ./config/php/php.ini:/usr/local/etc/php/php.ini
- ./config/httpd/extra/httpd-vhosts.conf:/etc/apache2/sites-enabled/httpd-vhosts.conf
mysql:
image: mysql:5.7
environment:
MYSQL_USER: drupal
MYSQL_PASSWORD: drupal
MYSQL_DATABASE: drupal
MYSQL_ROOT_PASSWORD: drupal
volumes:
- ./config/mysql:/etc/mysql/conf.d
- ./data/db:/var/lib/mysql
redis:
image: redis:4.0-alpine
volumes:
- ./config/redis/redis.conf:/usr/local/etc/redis/redis.conf
entrypoint:
- docker-entrypoint.sh
- /usr/local/etc/redis/redis.conf
mail:
image: djfarrelly/maildev
labels:
- "traefik.enable=true"
- "traefik.frontend.rule=Host:${DRUPAL_TRAEFIK_MAIL_RULE_HOSTNAME:-mail.famillewallon.localhost}"
- "traefik.port=80"
Ici, nous allons retrouver 4 images
- libert/drupal_php_apache_dev:php-7.0 : Une image apache + PHP 7.0 en mod_php sous debian avec drush, Drupal console et une conf pour reverse proxy Traefik
- mysql:5.7 : Notre serveur MySQL
- redis:4.0-alpine : Un serveur de cache Redis
- djfarrelly/maildev : Un container qui simule une boite mail
Chose assez basique, pour celles et ceux qui travaillent sur Docker
L'environnement de Test et de Prod
L'historique
Historiquement, j'avais 2 containers Lxc, le souci que l'on rencontre généralement dans ce cas là (valable également pour les VMs) :
- Problème de version de PHP entre les différents environnement
- Conf différentes
- Distributions différentes
- Lourdeur des containers Lxc ou VMs
C'est pour toutes ces raisons que je suis partie sur docker dans mes environnements de test et de prod.
Mon Architecture

Pour mes environnements de test et de prod, je me suis basé sur un hyperviseur Proxmox.
Dans le schéma ci dessus, les requêtes web arrive sur un Reverse proxy Nginx "Central" pour renvoyer toutes les requêtes du site de prod et de test sur un reverse proxy Traefik
Le Reverse Proxy Traefik
Le Reverse Proxy Traefik va pouvoir éviter de renseigner un port pour les différentes machines web docker, ainsi on peut démarrer autant de container que l'on veut en même temps
Dans mon cas, il sera externe à mes docker-compose de test et de prod
root@vsrv2:/var/lib/vz/docker/traefik# cat docker-compose.yml
version: '2'
services:
traefik:
image: traefik:1.6-alpine
ports:
- 80:80
network_mode: host
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./traefik.toml:/etc/traefik/traefik.toml
root@vsrv2:/var/lib/vz/docker/traefik# cat traefik.toml
logLevel = "WARNING"
[entryPoints]
[entryPoints.http]
address = ":80"
[docker]
Exemple avec l'environement de Prod
root@vsrv2:/var/lib/vz/docker/site_famillewallon# cat docker-compose.yml
version: "3.3"
services:
web:
image: libert/drupal_php_apache_dev:php-7.0
labels:
- "traefik.enable=true"
- "traefik.frontend.rule=Host:${DRUPAL_TRAEFIK_FRONTEND_RULE_HOSTNAME:-www.famillewallon.com}"
depends_on:
- redis
volumes:
- .:/project
- ./config/php/php.ini:/usr/local/etc/php/php.ini
- ./config/ssmtp/ssmtp.conf:/etc/ssmtp/ssmtp.conf
- ./config/httpd/extra/httpd-vhosts.conf:/etc/apache2/sites-enabled/httpd-vhosts.conf
redis:
image: redis:4.0-alpine
restart: always
volumes:
- ./config/redis/redis.conf:/usr/local/etc/redis/redis.conf
entrypoint:
- docker-entrypoint.sh
- /usr/local/etc/redis/redis.conf
webhook:
image: libert/docker-gitlab-webhook:latest
ports:
- 8081:80
volumes:
- .:/app
- /var/run/docker.sock:/var/run/docker.sock:ro
- /root/.ssh:/root/.ssh
environment:
REPOSITORY: drupal-composer
TOKEN: my_token
BRANCH: master
COMPOSE_PROJECT_NAME: site_famillewallon
POST_SCRIPT: docker-compose exec -T web /project/scripts/update.sh
Ici, nous allons retrouver 3 images
- libert/drupal_php_apache_dev:php-7.0 : Une image apache + PHP7 en mod_php sous debian avec drush, Drupal console et une conf pour reverse proxy Traefik
- redis:4.0-alpine : Un serveur de cache Redis
- libert/docker-gitlab-webhook:latest : Un container qui intègre un webhook gitlab en python pour gérer automatiquement les pulls git et ensuite lancer la commande update.sh (composer install, drush updatedb...) dans mon container web
Pour des raisons de manque de Ram sur mon serveur, Mysql est externalisé sur une VM mutualisé
Et une UI pour gerer les containers ?
Pour gérer mes containers de manière graphique (visualisation des logs , utilisation de la RAM par container...), j'utilise Portainer.io


Et enfin comment démarrer tout ce petit monde au boot du serveur physique
Pour faire démarrer tout ce petit monde au boot, je me suis créée un petit script systemd
[Unit]
Description=%i service with docker compose
Requires=docker.service
After=docker.service
[Service]
Restart=always
WorkingDirectory=/var/lib/vz/docker/%i
# Remove old containers, images and volumes
ExecStartPre=/usr/bin/docker-compose down -v
ExecStartPre=/usr/bin/docker-compose rm -fv
# Compose up
ExecStart=/usr/bin/docker-compose up
# Compose down, remove containers and volumes
ExecStop=/usr/bin/docker-compose down -v
[Install]
WantedBy=multi-user.target
Enfin il me restait plus qu'à démarrer les services et à les activer au boot
Récupérer une liste d'entité custom dans une select box
Comment récupérer une liste d'entité custom dans une select box :
Ici je vais récupérer les informations via la méthode getentity