Skip to content

Instantly share code, notes, and snippets.

@jcisio
Last active August 29, 2015 14:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jcisio/025f91e626f13665a9bd to your computer and use it in GitHub Desktop.
Save jcisio/025f91e626f13665a9bd to your computer and use it in GitHub Desktop.
Convention

Projet xxx

Structure des répertoires

/-- conf
 -- drush
 -- patches
 -- scripts
 -- sql
 -- src
 -- www
 composer.json
 composer.lock
 .editorconfig
 .gitignore

En général, tous les fichiers sont versionnés, saut /conf/drupal/local.php qui contient des paramètres spécifiques au poste de développement (mysql etc.).

Desfois, dans /www/ se trouve des répertoires comme /www/static/media, /www/static/pdf etc. Le /static/ permet de gérer plus facilement les confs au niveaux http.

Config

Le répertoire config contient tous les fichiers de configuration de Drupal, serveur Web, Varnish, cron..., souvent partiels. Ces fichiers sont appelé depuis les fichiers principaux (www/sites/default/settings.php, /etc/apache2/apache2.conf ou symlink depuis /etc/apache2/sites-enables/xxx, etc.)

Même si on n'utilise pas, par exemple pour des raisons de sécurité, par exemple un fichier conf Varnish, on garde dans ce répertoire une copie à jour.

Le fichier .gitignore en racine et les fichiers de conf Apache permet de ne pas toucher les fichiers .gitignore, .htaccess et robots.txt du core.

Config Drupal

Le fichier conf de Drupal se situant à www/sites/default/settings.php, est versionné et ne change jamais (qui permet de garder le répertoire www/sites/default en mode lecture seule -- ce que fait Drupal) ne contient de deux lignes :

<?php
require __DIR__ . '/default.settings.php';
require __DIR__ . '/../../../../conf/drupal/settings.php';

Le fichier /conf/drupal/settings.php contient des configs globaux et inclut aussi local.php. Les configs globaux peuvent ẽtre divisés en plusieurs fichiers en fonction de besoin.

/-- conf
    -- inc
       autoload.php
       devel.php
       localize.php
       rewrite.php
    settings.php
    local.php

settings.php peut inclure les paramètres de prod (memcache etc. sauf les clés/mots de passe). Ces paramètres, versionnés, sont "annulés" par devel.php. On dispose alors une historique des modifications/optimisations des paramètres de prod.

devel.php contient des paramètres "locaux communs" pour le poste de dev. Il n'est pas inclu par settings.php mais peut ẽtre inclu par local.php. Il est là juste pour des convenients. Par exemple on y met l'url pour stage_file_proxy, unset l'option de memcache ou mettre l'accès Solr en lecture seule.

localize.php contient les customisations de la langue par défaut.

rewrite.php contient les redirects de bas niveau (sans avoir à bootstrapper Drupal en mode full). Dans Drupal 6, c'est l'endroit pour mettre les fonctions comme custom_url_rewrite_inbound.

Les variables qu'on veut garder sous les yeux et qu'on n'a pas besoin de modifier par UI, on les met dans un fichier de conf au lieu d'exporter avec Strongarm.

Le fichier autoload.php est un class loader custom, qui autoload les composants ows, xxx et inclut le class loader de Composer dans /src/vendor/autoload.php. Il pourrait aussi autoload les classes dans sites/all/modules/custom suivante une convention (@todo à définir). Un exemple d'autoload :

<?php

/**
 * PSR-0 autoloader to load classes in src/OWS/*.
 */
spl_autoload_register(function($class) {
  if (file_exists($filename = '../src/' . preg_replace('#\\\|_(?!.+\\\)#', '/', $class) . '.php')) {
    include $filename;
  }
  else {
    return FALSE;
  }
});

// Composer autoloader.
require __DIR__ . '/../../src/vendor/autoload.php';

Drush

Ce répertoire contient drushrc.php et des fichiers de commande foobar.drush.inc.

/www/sites/all/drush/drushrc.php contient une seule ligne :

<?php
require __DIR__ . '/../../../../drush/drushrc.php';

/drush/drushrc.php contient des options, et particulièrement cette ligne :

$options['include'] = array(__DIR__);

Composants

 -- src
    -- ows
    -- xxx
    -- vendor
       -- guzzle
       -- etc.

Chaque composant est une bibliothèque indépendante de Drupal, ou au moins de la version de Drupal.

ows contient les composants qu'on veut utiliser dans plusieurs projets. Par exemple \OWS\Utility\Text::implode(array('a', 'b', 'c')) retourne "a, b et c".

Modules

Ils sont dans sites/all/modules forcément. On a comme hiérachie :

-- www/sites/all/modules
   -- contrib
   -- custom
   -- devel

Tous les modules contribs, patchés ou non, se trouvent dans contrib/. Les patches sont dans /patches/ et préfixés par le nom de module.

Les modules dans devel sont ajoutés à la volonté. Par défaut ils ne sont pas activés en prod. Exemples des modules dans devel/ : admin_menu, backup_migrate, coder, devel, stage_file_proxy.

Les modules customs sont préfixés par xxx_. On trouve toujours dans un projet ces modules :

  • xxx_common : les hook_update_N pour l'intégration continue, les blocs et les alters communs du site. Y se trouve aussi l'export des variables de base.
  • xxx_backoffice

En règle générale, on essaye de garder les fichiers .module petits et rend les opérations unitaires en les mettant comme méthodes statiques d'une classe. Cela permet de tester plus facilement une opération. Par exemple, pour chaque bloc, on crée une classe avec comme méthodes : info() (pour hook_block_info()), view() (pour hook_block_view()) et les implémentations de hook Drupal ne sont que des "wrapper" qui appellent ces méthodes.

Dans un module, les classes sont organisées selon la norme PSR-4 :

-- xxx_foo
   -- src
      -- Block
         Author.php
   xxx_foo.info
   xxx_foo.module

Author.php correspond à la class \Drupal\xxx_foo\Block\Author.

Features

Il n'y a pas d'instinction entre une feature et un module custom. Généralement, il y a une feature par type de contenu, sauf s'il y a un lien étroit (deux CT de "product display" et des types de produit Commerce, ou 3 CT différents de ressource).

Dans une feature se trouve les hooks, les blocs et les alters concernant celle-ci.

Coding standards

Ne jamais coder en dur les ID (tid, role id etc.). Utiliser une constante, ou mieux, une constante d'une classe.

Themes

RAS en l'état. On préfère SASS avec Compass et utilise au maximum les variables, mixins et @extend pour faciliter la maintenance.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment