SlideShare ist ein Scribd-Unternehmen logo
1 von 54
Downloaden Sie, um offline zu lesen
Theming	
  :	
  c’est	
  compliqué
mais	
  on	
  vous	
  explique
Romain	
  JARRAUD
DrupalCamp Paris 2013
Romain JARRAUD
Formateur/consultant
Trained People - drupalfrance.com
@romainjarraud
DrupalCamp Paris 2013
DrupalCamp Paris 2013
Qu’est-ce que le
theming ?
DrupalCamp Paris 2013
Theming ?
Fonctionnel Présentation
Drupal et modules Thème
DrupalCamp Paris 2013
Theming ?
• Produire le code html de chaque page.
• Habiller les balises de styles : tailles,
couleurs, images...
• Ajouter des effets à l’aide de javascript.
DrupalCamp Paris 2013
Moteur de thème
PHPTemplate
• Drupal 7 utilise le moteur de thème
PHPTemplate.
• PHPTemplate a été créé par Adrian Rossouw.
• Il offre un système de templates
(template.tpl.php) et de fonctions de thème
(theme_function()) pour générer le code HTML.
• La partie dynamique est obtenue grâce à du
code php inséré dans le HTML.
DrupalCamp Paris 2013
Principe de base
DrupalCamp Paris 2013
Thème
Principe
Navigateur CSS
Templates
Drupal et
modules Contenu
HTML
Page Web
Requête
DrupalCamp Paris 2013
CSS
DrupalCamp Paris 2013
CSS
• Les fichiers CSS peuvent provenir de 3
sources :
• Coeur de Drupal
• Modules contrib
• Thème
• L’ordre de chargement de ces fichiers est
primordial; le thème doit pouvoir surcharger
tous les styles et ainsi reprendre la main.
DrupalCamp Paris 2013
CSS - chargement
// Fichier mon_theme.info.
stylesheets[all][] = messtyles.css
// Fonction drupal_add_css().
$data = drupal_get_file(‘theme’, ‘mon_theme’) . ‘/messtyles.css’;
$options = array(
‘group‘ => CSS_THEME,
‘weight‘ => ’12’,
‘media‘ => ‘all’,
‘preprocess’ => FALSE,
‘every_page’ => FALSE,
‘browser‘ => array(‘IE’ => TRUE, ‘!IE’ => FALSE),
);
drupal_add_css($data, $options);
DrupalCamp Paris 2013
Intercepter les CSSs
function mon_theme_css_alter(&$css) {
// Afficher le contenu de $css.
dpm($css);
// Ne pas charger le fichier file.css du module nom_du_module.
unset($css[drupal_get_path(‘module’, ‘nom_du_module’) . ‘/file.css’]);
}
DrupalCamp Paris 2013
Javascript
DrupalCamp Paris 2013
Javascript
• Les fichiers JS peuvent provenir de 3 sources :
• Coeur de Drupal
• Modules contrib
• Thème
• L’ordre de chargement de ces fichiers est
primordial; par exemple le thème ne peut
utiliser une librairies qu’à partir du moment où
elle a déjà été chargée.
DrupalCamp Paris 2013
Javascript
// Fichier mon_theme.info.
scripts[] = monscript.js
// Fonction drupal_add_js().
$data = drupal_get_file(‘theme’, ‘mon_theme’) . ‘/monscript.js’;
$options = array(
‘group‘ => JS_THEME,
‘weight‘ => ’12’,
‘defer‘ => TRUE,
‘preprocess’ => FALSE,
‘every_page’ => FALSE,
‘scope‘ => ‘footer’,
);
drupal_add_js($data, $options);
DrupalCamp Paris 2013
Intercepter les JSs
function mon_theme_js_alter(&$js) {
// Afficher le contenu de $js.
dpm($js);
// Ne pas charger le fichier file.js du module nom_du_module.
unset($js[drupal_get_path(‘module’, ‘nom_du_module’) . ‘/file.js’]);
}
DrupalCamp Paris 2013
Templates et fonctions
de thème
DrupalCamp Paris 2013
Formatage HTML
• Drupal propose deux emplacements pour formater le code
HTML :
• fonction de thème
• template
• Les fonctions de thème sont plus performantes, mais restent
souvent moins lisibles et plus complexes que les fichiers de
template.
• Dans les deux cas, on invoque un hook de thème avec la fonction
theme() : theme(‘hook_de_theme’, $variables).
• Cette fonction permet de mettre en oeuvre le mécanisme de
surcharge du thème.
DrupalCamp Paris 2013
Fonction de thème
• Toutes les fonctions de thème sont de la
forme :
theme_hook_de_theme($variables).
• $variables est un tableau associatif
contenant les données à formater.
• Une fonction de thème doit retourner du
code HTML.
DrupalCamp Paris 2013
Fonction theme_image()
function theme_image($variables) {
$attributes = $variables['attributes'];
$attributes['src'] = file_create_url($variables['path']);
foreach (array('width', 'height', 'alt', 'title') as $key) {
if (isset($variables[$key])) {
$attributes[$key] = $variables[$key];
}
}
return '<img' . drupal_attributes($attributes) . ' />';
}
DrupalCamp Paris 2013
Template
• Tous les templates ont l’extension .tpl.php.
• Chaque fichier de template reçoit, non pas le tableau
$variables, mais autant de variables que le tableau
$variables contient de clés. Ex. : si $variables =
array(‘data1’ => $data_1,‘data2’ => $data_2) est
passé au template, ce dernier reçoit $data1 et
$data2.
• Un template contient le code HTML avec du php
qui principalement affiche le contenu des variables.
DrupalCamp Paris 2013
Template block.tpl.php
<div id="<?php print $block_html_id; ?>" class="<?php print $classes; ?>"<?php print
$attributes; ?>>
<?php print render($title_prefix); ?>
<?php if ($block->subject): ?>
<h2<?php print $title_attributes; ?>><?php print $block->subject ?></h2>
<?php endif;?>
<?php print render($title_suffix); ?>
<div class="content"<?php print $content_attributes; ?>>
<?php print $content ?>
</div>
</div>
DrupalCamp Paris 2013
Fonctions de
preprocess et de
process
DrupalCamp Paris 2013
Fonction de preprocess
Template
Preprocess par
défaut
$variables
Preprocess de
theme
$variables
Preprocess de
module
$variables
DrupalCamp Paris 2013
Fonctions template_preprocess()
et template_preprocess_HOOK()
• Initialisation de $variables.
• $variables['classes_array'] : contient un nom
de classe correspondant au nom du hook
de thème invoqué.
• $variables['theme_hook_suggestions'] : liste
des noms de hook dérivés.
DrupalCamp Paris 2013
Fonction
template_preprocess()
• Cette fonction de preprocess n'est pas
utilisée dans le cas d'une fonction de
thème.
• C’est donc au développeur/themeur de
définir ses propres variables.
DrupalCamp Paris 2013
Fonction de process
• Les fonctions de process interviennent après celles de
preprocess et permettent de finaliser le formattage des
données avant de les passer aux fonctions de thème/
templates.
• Il s’agit essentiellement de transformer des tableaux en chaine :
• $variables[‘classes_array’] => $variables[‘classes’]
• $variables[‘attributes_array’] => $variables[‘attributes’]
• $variables[‘title_attributes_array’] => $variables[‘title_attributes’]
• Ces fonctions peuvent être étendues, comme celles de
preprocess.
DrupalCamp Paris 2013
Surcharge
DrupalCamp Paris 2013
Surcharge
• L'un des rôles du thème est de surcharger le
formatage par défaut afin de l'adapter aux besoins.
• Drupal propose un mécanisme de surcharge, aussi
bien pour les fonctions de thème que pour les
templates.
• Dès qu’un hook de thème est invoqué, le thème
est sollicité en premier. Dans le cas où aucune
surcharge n’est proposée, c’est l’élément par défaut
qui est appelé.
DrupalCamp Paris 2013
Surcharge
• Fonction de thème
• Copier le code de la fonction originale dans le fichier template.php.
• Renommer cette dernière : theme_hookdetheme() =>
mon_theme_hookdetheme().
• Vider le registre du thème.
• Template
• Copier le fichier original dans le dossier de son thème.
• Vider le registre du thème.
DrupalCamp Paris 2013
Templates dérivés
DrupalCamp Paris 2013
Templates dérivés
• Par défaut chaque fois qu'un hook de thème
est invoqué, le candidat de base est appelé.
• Il est possible d'appeler d'autres candidats
proposant un formatage adapté au contexte.
• Par exemple pour afficher un nœud, le template
utilisé par défaut est node.tpl.php. Si ce
nœud est de type article, Drupal peut
potentiellement utiliser le template node--
article.tpl.php (s’il existe!).
DrupalCamp Paris 2013
Déterminer le candidat
• La liste des candidats pour un hook de thème donné
est définie par les fonctions de preprocess.
• Le tableau $variables['theme_hook_suggestions']
contient la liste des noms des candidats potentiels.
• Drupal définit dans ses diverses fonctions de preprocess
(template_preprocess_HOOK()) des suggestions par
défaut, qui peuvent être modifiées ou étendues.
• Les derniers éléments ajoutés au tableau
$variables['theme_hook_suggestions'] sont appelés en
premier : FILO.
DrupalCamp Paris 2013
Exemple : node.tpl.php
// Fonction template_preprocess_node().
...
$variables[‘theme_hook_suggestions’][] = ‘node__’ . $node->type;
$variables[‘theme_hook_suggestions’][] = ‘node__’ . $node->nid;
...
DrupalCamp Paris 2013
Exemple : page.tpl.php
// Fonction template_preprocess_page().
...
if ($suggestions = theme_get_suggestions(arg(), ‘page’) {
$variables[‘theme_hook_suggestions’] = $suggestions;
}
...
// Fonction mon_theme_preprocess_page().
...
if ($node = menu_get_object()) {
$node_type = $variables[‘node’]->type;
$variables[‘theme_hook_suggestions’][] = ‘page__node_’ . $node_type;
}
...
DrupalCamp Paris 2013
Registre de thème
DrupalCamp Paris 2013
Registre du thème
• Le registre du thème est un cache local au thème.
• Pour une page il peut y avoir des dizaines de fonctions
de thème et de templates qui sont impliqués.
• Pour chaque hook de thème Drupal doit détermier les
candidats appropriés.
• Ce processus est extrêmement coûteux en
ressources.
• La liste de tous les fichiers et fonctions à utiliser est
donc mise en cache.
DrupalCamp Paris 2013
Registre du thème
• Fonctions possibles pour un hook de thème donné :
• template_preprocess()
• template_preprocess_HOOK()
• MODULE_preprocess()
• MODULE_preprocess_ HOOK()
• THEME_preprocess()
• THEME_preprocess_ HOOK()
• template_process()
• template_process_ HOOK()
• MODULE_process()
• MODULE_process_ HOOK()
• THEME_process()
• THEME_process_ HOOK()
DrupalCamp Paris 2013
Registre du thème
• Ce que contient le registre :
• Pour chaque hook de thème : template ou fonction ?
• Liste des fonctions de preprocess.
• Liste des fonctions de process.
• Chemins vers les fichiers de template.
• Noms des fonctions de thème.
• Liste des variables passées à la fonction theme().
• Liste des éléments à rendre (le cas échéant) à la fonction
theme().
DrupalCamp Paris 2013
Hooks de thème
DrupalCamp Paris 2013
Déclarer un hook de
thème
• Un hook de thème entraîne l'utilisation soit d'une
fonction de thème soit d'un template.
• C'est à vous de décider.
• Pour chaque hook de thème que vous déclarer,
Drupal utilise potentiellement la fonction de
preprocess associée :
template_preprocess_hook_de_theme().
• Cette dernière peut également être étendue.
DrupalCamp Paris 2013
Déclarer une fonction de
thème
// Fichier template.php
function mon_theme_theme($existing, $type, $theme, $path) {
return array(
´mon_theme´ => array(
´variables´ => array(‘data’ => NULL),
),
);
}
function theme_mon_theme($variables) {
$data = $variables[‘data’];
$output = ‘<p>’ . $data . ‘</p>’;
return $output;
}
DrupalCamp Paris 2013
Déclarer un template
// Fichier template.php
function mon_theme_theme() {
return array(
´mon_theme´ => array(
´variables´ => array(‘data’ => NULL),
´template´ => ‘mon-theme’,
),
);
}
// Fichier mon-theme.tpl.php
<p><?php print $data; ?></p>
DrupalCamp Paris 2013
Intégrer un plugin
DrupalCamp Paris 2013
Ce qu'il nous faut
• Charger les fichiers nécessaires, CSS et
Javascript.
• Formater le code HTML comme attendu
par le plugin.
• Déclencher l'effet.
DrupalCamp Paris 2013
Exemple - Nivo Slider
// Fichier .info
stylesheets[all][] = nivo-slider.css
scripts[] = jquery.nivo.slider.js
scripts[] = script.js
// Fichier de template
<div id=“slider“>
<img src=“image1.jpg“ />
<img src=“image2.jpg“ />
<img src=“image3.jpg“ />
</div>
// Fichier script.js
$(“#slider“).nivoSlider();
DrupalCamp Paris 2013
Configuration
Backoffice
DrupalCamp Paris 2013
Configuration Backoffice
• Comment paramétrer le thème depuis le backoffice de Drupal ?
• Il existe une page avec un formulaire par défaut pour chaque
thème.
• On peut le modifier avec hook_form_system_theme_settings_alter() en
utilisant la Form API.
• En pratique il faut :
• Créer le fichier theme-settings.php à la racine du thème.
• Dans ce fichier ajouter la fonction
mon_theme_form_system_theme_settings_alter().
• Dans le fichier mon_theme.info ajouter
settings[‘mon_theme_mon_champ’] = 1 afin d’initialiser le champ.
DrupalCamp Paris 2013
Exemple
• Notre thème doit permettre d’afficher/masquer une
région depuis l’interface d’administration de Drupal.
• Il faut :
• Déclarer une région et un réglage (à initialiser) dans
le fichier mon_theme.info.
• Insérer une nouvelle case à cocher dans le formulaire
de configuration du thème (admin/appearance/settings/
mon_theme).
• Adapter le template de page (page.tpl.php) afin que la
région ne soit affichée que sous conditions.
DrupalCamp Paris 2013
Exemple
// Fichier mon_theme.info
...
regions[ma_region] = My region
settings[toggle_mon_theme_ma_region] = 1
...
// Fichier theme-settings.php
...
function mon_theme_form_system_settings_alter(&$form, $form_state) {
$form[‘theme_settings’][‘toggle_mon_theme_ma_region’] = array(
‘#type‘ => ‘checkbox’,
‘#title‘ => t(‘My region’),
‘#default_value’ => theme_get_setting(‘toggle_mon_theme_ma_region’),
);
}
...
DrupalCamp Paris 2013
Exemple
// Fichier page.tpl.php
...
<?php
if ($page['ma_region'] && theme_get_setting('toggle_mon_theme_ma_region')):
?>
<div id="ma-region">
<?php print render($page['ma_region']); ?>
</div>
<?php endif; ?>
...
DrupalCamp Paris 2013
Et Drupal 8 ?
• On oublie tout et on recommence...
• TWIG !
DrupalCamp Paris 2013
Merci à vous !
DrupalCamp Paris 2013
Questions ?

Weitere ähnliche Inhalte

Was ist angesagt?

Optimisez vos imports de données avec Migrate
Optimisez vos imports de données avec MigrateOptimisez vos imports de données avec Migrate
Optimisez vos imports de données avec Migrate
Matthieu Guillermin
 

Was ist angesagt? (20)

Initiation à Bootstrap
Initiation à BootstrapInitiation à Bootstrap
Initiation à Bootstrap
 
Présentation Symetris - Drupalcamp Montreal 2013 le diable est dans les détails
Présentation Symetris - Drupalcamp Montreal 2013 le diable est dans les détailsPrésentation Symetris - Drupalcamp Montreal 2013 le diable est dans les détails
Présentation Symetris - Drupalcamp Montreal 2013 le diable est dans les détails
 
Drupal 8
Drupal 8Drupal 8
Drupal 8
 
HTML5 - Sémantique, structure et nouveaux éléments
HTML5 - Sémantique, structure et nouveaux élémentsHTML5 - Sémantique, structure et nouveaux éléments
HTML5 - Sémantique, structure et nouveaux éléments
 
Architecture des types de contenu : ce qui a changé en Drupal 7
Architecture des types de contenu : ce qui a changé en Drupal 7Architecture des types de contenu : ce qui a changé en Drupal 7
Architecture des types de contenu : ce qui a changé en Drupal 7
 
Introduction à HTML 5
Introduction à HTML 5Introduction à HTML 5
Introduction à HTML 5
 
Présentation de Drupal
Présentation de DrupalPrésentation de Drupal
Présentation de Drupal
 
Cms et-creer-un-petit-site-avec-drupal-jdll-2012
Cms et-creer-un-petit-site-avec-drupal-jdll-2012Cms et-creer-un-petit-site-avec-drupal-jdll-2012
Cms et-creer-un-petit-site-avec-drupal-jdll-2012
 
Pourquoi Drupal ?
Pourquoi Drupal ?Pourquoi Drupal ?
Pourquoi Drupal ?
 
Drupagora linagora-20111110
Drupagora linagora-20111110Drupagora linagora-20111110
Drupagora linagora-20111110
 
Codedarmor 2012 - 06/03 - HTML5, CSS3 et Javascript
Codedarmor 2012 - 06/03 - HTML5, CSS3 et JavascriptCodedarmor 2012 - 06/03 - HTML5, CSS3 et Javascript
Codedarmor 2012 - 06/03 - HTML5, CSS3 et Javascript
 
Drupal7 - Bonnes Pratiques (Partie 1)
Drupal7 - Bonnes Pratiques (Partie 1)Drupal7 - Bonnes Pratiques (Partie 1)
Drupal7 - Bonnes Pratiques (Partie 1)
 
Optimisez vos imports de données avec Migrate
Optimisez vos imports de données avec MigrateOptimisez vos imports de données avec Migrate
Optimisez vos imports de données avec Migrate
 
Introduction à Drupal 8
Introduction à Drupal 8Introduction à Drupal 8
Introduction à Drupal 8
 
Présentation complète de l'HTML5
Présentation complète de l'HTML5Présentation complète de l'HTML5
Présentation complète de l'HTML5
 
Creation de-themes-wp
Creation de-themes-wpCreation de-themes-wp
Creation de-themes-wp
 
Conférence #nwxtech5 : Introduction à Backbone.js par Hugo Larcher
Conférence #nwxtech5 : Introduction à Backbone.js par Hugo LarcherConférence #nwxtech5 : Introduction à Backbone.js par Hugo Larcher
Conférence #nwxtech5 : Introduction à Backbone.js par Hugo Larcher
 
Optimiser les performances dans Wordpress
Optimiser les performances dans WordpressOptimiser les performances dans Wordpress
Optimiser les performances dans Wordpress
 
Drupal n'est pas seulement un CMS
Drupal n'est pas seulement un CMSDrupal n'est pas seulement un CMS
Drupal n'est pas seulement un CMS
 
Gestion de projet Drupal : quelques outils indispensables - OWS - Drupalcamp ...
Gestion de projet Drupal : quelques outils indispensables - OWS - Drupalcamp ...Gestion de projet Drupal : quelques outils indispensables - OWS - Drupalcamp ...
Gestion de projet Drupal : quelques outils indispensables - OWS - Drupalcamp ...
 

Andere mochten auch (6)

Linux
LinuxLinux
Linux
 
Indication aep périphériques
Indication aep périphériquesIndication aep périphériques
Indication aep périphériques
 
Lesson 5a
Lesson 5aLesson 5a
Lesson 5a
 
Gov doccollection
Gov doccollectionGov doccollection
Gov doccollection
 
échange_rive de gier_alpes_2011
échange_rive de gier_alpes_2011échange_rive de gier_alpes_2011
échange_rive de gier_alpes_2011
 
Cinema between art and industry
Cinema between art and industryCinema between art and industry
Cinema between art and industry
 

Ähnlich wie DrupalCamp Paris 2013 - Theming

Panels, une autre façon de construire. DrupalCamp Paris 2013
Panels, une autre façon de construire. DrupalCamp Paris 2013Panels, une autre façon de construire. DrupalCamp Paris 2013
Panels, une autre façon de construire. DrupalCamp Paris 2013
bellesmanieres
 
Meetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cache
Meetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cacheMeetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cache
Meetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cache
Aurelien Navarre
 
Traits : de la théorie à la pratique
Traits : de la théorie à la pratiqueTraits : de la théorie à la pratique
Traits : de la théorie à la pratique
Frederic Hardy
 
Introduction à AngularJS
Introduction à AngularJSIntroduction à AngularJS
Introduction à AngularJS
Abdoulaye Dieng
 
Cours j query-id1575
Cours j query-id1575Cours j query-id1575
Cours j query-id1575
kate2013
 
09 - creez-propres-modules-ansible-autimatisation
09 - creez-propres-modules-ansible-autimatisation09 - creez-propres-modules-ansible-autimatisation
09 - creez-propres-modules-ansible-autimatisation
bibouechristian
 
Introduction à Sinatra
Introduction à SinatraIntroduction à Sinatra
Introduction à Sinatra
Rémi Prévost
 

Ähnlich wie DrupalCamp Paris 2013 - Theming (20)

Outils front-end
Outils front-endOutils front-end
Outils front-end
 
Les blocs Drupal de drop.org à Drupal 8
Les blocs Drupal de drop.org à Drupal 8Les blocs Drupal de drop.org à Drupal 8
Les blocs Drupal de drop.org à Drupal 8
 
Panels, une autre façon de construire. DrupalCamp Paris 2013
Panels, une autre façon de construire. DrupalCamp Paris 2013Panels, une autre façon de construire. DrupalCamp Paris 2013
Panels, une autre façon de construire. DrupalCamp Paris 2013
 
Drupalcamp Nantes - Adapter Drupal
Drupalcamp Nantes - Adapter DrupalDrupalcamp Nantes - Adapter Drupal
Drupalcamp Nantes - Adapter Drupal
 
Meetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cache
Meetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cacheMeetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cache
Meetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cache
 
Traits : de la théorie à la pratique
Traits : de la théorie à la pratiqueTraits : de la théorie à la pratique
Traits : de la théorie à la pratique
 
Introduction à AngularJS
Introduction à AngularJSIntroduction à AngularJS
Introduction à AngularJS
 
Design Patterns
Design PatternsDesign Patterns
Design Patterns
 
Comment traduire ses bases de données sans douleur
Comment traduire ses bases de données sans douleurComment traduire ses bases de données sans douleur
Comment traduire ses bases de données sans douleur
 
Formation PHP avancé - Cake PHP
Formation PHP avancé - Cake PHPFormation PHP avancé - Cake PHP
Formation PHP avancé - Cake PHP
 
Présentation Drupal - Global Training Days
Présentation Drupal - Global Training DaysPrésentation Drupal - Global Training Days
Présentation Drupal - Global Training Days
 
Aperçu de RequireJS
Aperçu de RequireJSAperçu de RequireJS
Aperçu de RequireJS
 
Playing With PHP 5.3
Playing With PHP 5.3Playing With PHP 5.3
Playing With PHP 5.3
 
Des tests modernes pour Drupal
Des tests modernes pour DrupalDes tests modernes pour Drupal
Des tests modernes pour Drupal
 
Cours j query-id1575
Cours j query-id1575Cours j query-id1575
Cours j query-id1575
 
Rappels Modularisation application C/C++
Rappels Modularisation application C/C++Rappels Modularisation application C/C++
Rappels Modularisation application C/C++
 
Jquery - introduction au langage
Jquery - introduction au langageJquery - introduction au langage
Jquery - introduction au langage
 
Drupagora 2014 : Reprendre un projet avec Drupal quand on a des centaines de...
Drupagora 2014 :  Reprendre un projet avec Drupal quand on a des centaines de...Drupagora 2014 :  Reprendre un projet avec Drupal quand on a des centaines de...
Drupagora 2014 : Reprendre un projet avec Drupal quand on a des centaines de...
 
09 - creez-propres-modules-ansible-autimatisation
09 - creez-propres-modules-ansible-autimatisation09 - creez-propres-modules-ansible-autimatisation
09 - creez-propres-modules-ansible-autimatisation
 
Introduction à Sinatra
Introduction à SinatraIntroduction à Sinatra
Introduction à Sinatra
 

DrupalCamp Paris 2013 - Theming

  • 1. Theming  :  c’est  compliqué mais  on  vous  explique Romain  JARRAUD
  • 2. DrupalCamp Paris 2013 Romain JARRAUD Formateur/consultant Trained People - drupalfrance.com @romainjarraud DrupalCamp Paris 2013
  • 4. DrupalCamp Paris 2013 Theming ? Fonctionnel Présentation Drupal et modules Thème
  • 5. DrupalCamp Paris 2013 Theming ? • Produire le code html de chaque page. • Habiller les balises de styles : tailles, couleurs, images... • Ajouter des effets à l’aide de javascript.
  • 6. DrupalCamp Paris 2013 Moteur de thème PHPTemplate • Drupal 7 utilise le moteur de thème PHPTemplate. • PHPTemplate a été créé par Adrian Rossouw. • Il offre un système de templates (template.tpl.php) et de fonctions de thème (theme_function()) pour générer le code HTML. • La partie dynamique est obtenue grâce à du code php inséré dans le HTML.
  • 8. DrupalCamp Paris 2013 Thème Principe Navigateur CSS Templates Drupal et modules Contenu HTML Page Web Requête
  • 10. DrupalCamp Paris 2013 CSS • Les fichiers CSS peuvent provenir de 3 sources : • Coeur de Drupal • Modules contrib • Thème • L’ordre de chargement de ces fichiers est primordial; le thème doit pouvoir surcharger tous les styles et ainsi reprendre la main.
  • 11. DrupalCamp Paris 2013 CSS - chargement // Fichier mon_theme.info. stylesheets[all][] = messtyles.css // Fonction drupal_add_css(). $data = drupal_get_file(‘theme’, ‘mon_theme’) . ‘/messtyles.css’; $options = array( ‘group‘ => CSS_THEME, ‘weight‘ => ’12’, ‘media‘ => ‘all’, ‘preprocess’ => FALSE, ‘every_page’ => FALSE, ‘browser‘ => array(‘IE’ => TRUE, ‘!IE’ => FALSE), ); drupal_add_css($data, $options);
  • 12. DrupalCamp Paris 2013 Intercepter les CSSs function mon_theme_css_alter(&$css) { // Afficher le contenu de $css. dpm($css); // Ne pas charger le fichier file.css du module nom_du_module. unset($css[drupal_get_path(‘module’, ‘nom_du_module’) . ‘/file.css’]); }
  • 14. DrupalCamp Paris 2013 Javascript • Les fichiers JS peuvent provenir de 3 sources : • Coeur de Drupal • Modules contrib • Thème • L’ordre de chargement de ces fichiers est primordial; par exemple le thème ne peut utiliser une librairies qu’à partir du moment où elle a déjà été chargée.
  • 15. DrupalCamp Paris 2013 Javascript // Fichier mon_theme.info. scripts[] = monscript.js // Fonction drupal_add_js(). $data = drupal_get_file(‘theme’, ‘mon_theme’) . ‘/monscript.js’; $options = array( ‘group‘ => JS_THEME, ‘weight‘ => ’12’, ‘defer‘ => TRUE, ‘preprocess’ => FALSE, ‘every_page’ => FALSE, ‘scope‘ => ‘footer’, ); drupal_add_js($data, $options);
  • 16. DrupalCamp Paris 2013 Intercepter les JSs function mon_theme_js_alter(&$js) { // Afficher le contenu de $js. dpm($js); // Ne pas charger le fichier file.js du module nom_du_module. unset($js[drupal_get_path(‘module’, ‘nom_du_module’) . ‘/file.js’]); }
  • 17. DrupalCamp Paris 2013 Templates et fonctions de thème
  • 18. DrupalCamp Paris 2013 Formatage HTML • Drupal propose deux emplacements pour formater le code HTML : • fonction de thème • template • Les fonctions de thème sont plus performantes, mais restent souvent moins lisibles et plus complexes que les fichiers de template. • Dans les deux cas, on invoque un hook de thème avec la fonction theme() : theme(‘hook_de_theme’, $variables). • Cette fonction permet de mettre en oeuvre le mécanisme de surcharge du thème.
  • 19. DrupalCamp Paris 2013 Fonction de thème • Toutes les fonctions de thème sont de la forme : theme_hook_de_theme($variables). • $variables est un tableau associatif contenant les données à formater. • Une fonction de thème doit retourner du code HTML.
  • 20. DrupalCamp Paris 2013 Fonction theme_image() function theme_image($variables) { $attributes = $variables['attributes']; $attributes['src'] = file_create_url($variables['path']); foreach (array('width', 'height', 'alt', 'title') as $key) { if (isset($variables[$key])) { $attributes[$key] = $variables[$key]; } } return '<img' . drupal_attributes($attributes) . ' />'; }
  • 21. DrupalCamp Paris 2013 Template • Tous les templates ont l’extension .tpl.php. • Chaque fichier de template reçoit, non pas le tableau $variables, mais autant de variables que le tableau $variables contient de clés. Ex. : si $variables = array(‘data1’ => $data_1,‘data2’ => $data_2) est passé au template, ce dernier reçoit $data1 et $data2. • Un template contient le code HTML avec du php qui principalement affiche le contenu des variables.
  • 22. DrupalCamp Paris 2013 Template block.tpl.php <div id="<?php print $block_html_id; ?>" class="<?php print $classes; ?>"<?php print $attributes; ?>> <?php print render($title_prefix); ?> <?php if ($block->subject): ?> <h2<?php print $title_attributes; ?>><?php print $block->subject ?></h2> <?php endif;?> <?php print render($title_suffix); ?> <div class="content"<?php print $content_attributes; ?>> <?php print $content ?> </div> </div>
  • 23. DrupalCamp Paris 2013 Fonctions de preprocess et de process
  • 24. DrupalCamp Paris 2013 Fonction de preprocess Template Preprocess par défaut $variables Preprocess de theme $variables Preprocess de module $variables
  • 25. DrupalCamp Paris 2013 Fonctions template_preprocess() et template_preprocess_HOOK() • Initialisation de $variables. • $variables['classes_array'] : contient un nom de classe correspondant au nom du hook de thème invoqué. • $variables['theme_hook_suggestions'] : liste des noms de hook dérivés.
  • 26. DrupalCamp Paris 2013 Fonction template_preprocess() • Cette fonction de preprocess n'est pas utilisée dans le cas d'une fonction de thème. • C’est donc au développeur/themeur de définir ses propres variables.
  • 27. DrupalCamp Paris 2013 Fonction de process • Les fonctions de process interviennent après celles de preprocess et permettent de finaliser le formattage des données avant de les passer aux fonctions de thème/ templates. • Il s’agit essentiellement de transformer des tableaux en chaine : • $variables[‘classes_array’] => $variables[‘classes’] • $variables[‘attributes_array’] => $variables[‘attributes’] • $variables[‘title_attributes_array’] => $variables[‘title_attributes’] • Ces fonctions peuvent être étendues, comme celles de preprocess.
  • 29. DrupalCamp Paris 2013 Surcharge • L'un des rôles du thème est de surcharger le formatage par défaut afin de l'adapter aux besoins. • Drupal propose un mécanisme de surcharge, aussi bien pour les fonctions de thème que pour les templates. • Dès qu’un hook de thème est invoqué, le thème est sollicité en premier. Dans le cas où aucune surcharge n’est proposée, c’est l’élément par défaut qui est appelé.
  • 30. DrupalCamp Paris 2013 Surcharge • Fonction de thème • Copier le code de la fonction originale dans le fichier template.php. • Renommer cette dernière : theme_hookdetheme() => mon_theme_hookdetheme(). • Vider le registre du thème. • Template • Copier le fichier original dans le dossier de son thème. • Vider le registre du thème.
  • 32. DrupalCamp Paris 2013 Templates dérivés • Par défaut chaque fois qu'un hook de thème est invoqué, le candidat de base est appelé. • Il est possible d'appeler d'autres candidats proposant un formatage adapté au contexte. • Par exemple pour afficher un nœud, le template utilisé par défaut est node.tpl.php. Si ce nœud est de type article, Drupal peut potentiellement utiliser le template node-- article.tpl.php (s’il existe!).
  • 33. DrupalCamp Paris 2013 Déterminer le candidat • La liste des candidats pour un hook de thème donné est définie par les fonctions de preprocess. • Le tableau $variables['theme_hook_suggestions'] contient la liste des noms des candidats potentiels. • Drupal définit dans ses diverses fonctions de preprocess (template_preprocess_HOOK()) des suggestions par défaut, qui peuvent être modifiées ou étendues. • Les derniers éléments ajoutés au tableau $variables['theme_hook_suggestions'] sont appelés en premier : FILO.
  • 34. DrupalCamp Paris 2013 Exemple : node.tpl.php // Fonction template_preprocess_node(). ... $variables[‘theme_hook_suggestions’][] = ‘node__’ . $node->type; $variables[‘theme_hook_suggestions’][] = ‘node__’ . $node->nid; ...
  • 35. DrupalCamp Paris 2013 Exemple : page.tpl.php // Fonction template_preprocess_page(). ... if ($suggestions = theme_get_suggestions(arg(), ‘page’) { $variables[‘theme_hook_suggestions’] = $suggestions; } ... // Fonction mon_theme_preprocess_page(). ... if ($node = menu_get_object()) { $node_type = $variables[‘node’]->type; $variables[‘theme_hook_suggestions’][] = ‘page__node_’ . $node_type; } ...
  • 37. DrupalCamp Paris 2013 Registre du thème • Le registre du thème est un cache local au thème. • Pour une page il peut y avoir des dizaines de fonctions de thème et de templates qui sont impliqués. • Pour chaque hook de thème Drupal doit détermier les candidats appropriés. • Ce processus est extrêmement coûteux en ressources. • La liste de tous les fichiers et fonctions à utiliser est donc mise en cache.
  • 38. DrupalCamp Paris 2013 Registre du thème • Fonctions possibles pour un hook de thème donné : • template_preprocess() • template_preprocess_HOOK() • MODULE_preprocess() • MODULE_preprocess_ HOOK() • THEME_preprocess() • THEME_preprocess_ HOOK() • template_process() • template_process_ HOOK() • MODULE_process() • MODULE_process_ HOOK() • THEME_process() • THEME_process_ HOOK()
  • 39. DrupalCamp Paris 2013 Registre du thème • Ce que contient le registre : • Pour chaque hook de thème : template ou fonction ? • Liste des fonctions de preprocess. • Liste des fonctions de process. • Chemins vers les fichiers de template. • Noms des fonctions de thème. • Liste des variables passées à la fonction theme(). • Liste des éléments à rendre (le cas échéant) à la fonction theme().
  • 41. DrupalCamp Paris 2013 Déclarer un hook de thème • Un hook de thème entraîne l'utilisation soit d'une fonction de thème soit d'un template. • C'est à vous de décider. • Pour chaque hook de thème que vous déclarer, Drupal utilise potentiellement la fonction de preprocess associée : template_preprocess_hook_de_theme(). • Cette dernière peut également être étendue.
  • 42. DrupalCamp Paris 2013 Déclarer une fonction de thème // Fichier template.php function mon_theme_theme($existing, $type, $theme, $path) { return array( ´mon_theme´ => array( ´variables´ => array(‘data’ => NULL), ), ); } function theme_mon_theme($variables) { $data = $variables[‘data’]; $output = ‘<p>’ . $data . ‘</p>’; return $output; }
  • 43. DrupalCamp Paris 2013 Déclarer un template // Fichier template.php function mon_theme_theme() { return array( ´mon_theme´ => array( ´variables´ => array(‘data’ => NULL), ´template´ => ‘mon-theme’, ), ); } // Fichier mon-theme.tpl.php <p><?php print $data; ?></p>
  • 45. DrupalCamp Paris 2013 Ce qu'il nous faut • Charger les fichiers nécessaires, CSS et Javascript. • Formater le code HTML comme attendu par le plugin. • Déclencher l'effet.
  • 46. DrupalCamp Paris 2013 Exemple - Nivo Slider // Fichier .info stylesheets[all][] = nivo-slider.css scripts[] = jquery.nivo.slider.js scripts[] = script.js // Fichier de template <div id=“slider“> <img src=“image1.jpg“ /> <img src=“image2.jpg“ /> <img src=“image3.jpg“ /> </div> // Fichier script.js $(“#slider“).nivoSlider();
  • 48. DrupalCamp Paris 2013 Configuration Backoffice • Comment paramétrer le thème depuis le backoffice de Drupal ? • Il existe une page avec un formulaire par défaut pour chaque thème. • On peut le modifier avec hook_form_system_theme_settings_alter() en utilisant la Form API. • En pratique il faut : • Créer le fichier theme-settings.php à la racine du thème. • Dans ce fichier ajouter la fonction mon_theme_form_system_theme_settings_alter(). • Dans le fichier mon_theme.info ajouter settings[‘mon_theme_mon_champ’] = 1 afin d’initialiser le champ.
  • 49. DrupalCamp Paris 2013 Exemple • Notre thème doit permettre d’afficher/masquer une région depuis l’interface d’administration de Drupal. • Il faut : • Déclarer une région et un réglage (à initialiser) dans le fichier mon_theme.info. • Insérer une nouvelle case à cocher dans le formulaire de configuration du thème (admin/appearance/settings/ mon_theme). • Adapter le template de page (page.tpl.php) afin que la région ne soit affichée que sous conditions.
  • 50. DrupalCamp Paris 2013 Exemple // Fichier mon_theme.info ... regions[ma_region] = My region settings[toggle_mon_theme_ma_region] = 1 ... // Fichier theme-settings.php ... function mon_theme_form_system_settings_alter(&$form, $form_state) { $form[‘theme_settings’][‘toggle_mon_theme_ma_region’] = array( ‘#type‘ => ‘checkbox’, ‘#title‘ => t(‘My region’), ‘#default_value’ => theme_get_setting(‘toggle_mon_theme_ma_region’), ); } ...
  • 51. DrupalCamp Paris 2013 Exemple // Fichier page.tpl.php ... <?php if ($page['ma_region'] && theme_get_setting('toggle_mon_theme_ma_region')): ?> <div id="ma-region"> <?php print render($page['ma_region']); ?> </div> <?php endif; ?> ...
  • 52. DrupalCamp Paris 2013 Et Drupal 8 ? • On oublie tout et on recommence... • TWIG !