Module summary

Source: http://php.developpez.com/tutoriels/drupal/atelier-drupal7/?page=creatio...

Ce module aura une page à l'URL /summary, qui affichera la liste des modules activés, les vocabulaires de taxonomy, et les types de contenus. Une page de configuration du module permettra de sélectionner les sections à afficher et de modifier les titres de celles-ci.

Création du module summary

La base: Le module est nommé summary, en PJ le .info et summary.module. Le hook_help crée une page d'aide. Puis implémentation de hook_menu() pour créer une page associée à une URL. A ce stade, on peux activer le module, mais il n'affiche pas grand chose.

les fonctions utilisées: module_list()

Faire par ex dans un bloc "execute php": dpr(module_list());  ou  dpr(module_list()); (cf fonctions de débugage du module devel)
implode  Rassemble les éléments d'un tableau en une chaîne. Syntaxestring implode ( string $glue , array $pieces )  où  glue par défaut, une chaine vide ; pieces le tableau de chaine à rassembler.

module_list() retourne donc un tableau (Array) contenant la liste des modules activés.
Ex avec implode() <?php
$array = array('lastname', 'email', 'phone'); $comma_separated = implode(",", $array); echo $comma_separated; // lastname,email,phone // Chaîne vide lors de l'emploi d'un tableau vide : var_dump(implode('hello', array()));
?>

taxonomy_get_vocabularies retourne donc un tableau d'objets (stdClass). Chacun de ces objets décrit un vocabulaire. Le nom du vocabulaire est dans la propriété name des objets. Il faut donc parcourir chaque élément du tableau et récupérer le nom du vocabulaire (à ajouter dans la fonction summary_content)  :

$summary_vocabularies = taxonomy_get_vocabularies();
$summary_vocabularies_list='';
foreach ($summary_vocabularies as $vocab){
  $summary_vocabularies_list .= $vocab->name . ',';
}
$summary_vocabularies_list = t('<h3>Vocabularies</h3>') . $summary_vocabularies_list;
$output .= $summary_vocabularies_list;

Tester dpm(node_type_get_types()); 

// List of node types.
$summary_node_types = node_type_get_types();
$summary_node_types_list = array();
foreach ($summary_node_types as $node_type) {
  $summary_node_types_list[] = $node_type->name;
}
$summary_node_types_list = t('<h3>Node types</h3>') . implode($summary_node_types_list, ', ');
$output .= $summary_node_types_list;

En PJ, le module summary0 : renommer en .zip -> la page /summary0 affiche les modules, vocabulaire et types de contenu.

La page de configuration du module, function summary_menu

La page de configuration du module summary sera accessible à partir de l'URL admin/config/system/summary. Il faut donc ajouter un élément au tableau de la hook_menu.

L'URL de la page (admin/config/system/summary) permet d'ajouter un lien dans la page de configuration (config) à la section système (system). Le lien Menu item du bloc Devel permet de connaître les informations des différentes pages.
Cette page de configuration sera en fait un formulaire HTML. Pour composer un formulaire, Drupal propose une API bien particulière qui sera décrite plus tard.

'page_callback' Ici, on appelle une fonction Drupal (drupal_get_form) qui construira le formulaire.
'page arguments' Liste des arguments à passer à la fonction callback.
'access argument' Vérifie que l'utilisateur a les droits d'administration du site avant d'afficher la page.
'type' Nom de la fonction qui sera appelée pour retourner le contenu.

Le but est de créer un formulaire, Drupal propose pour cela la fonction drupal_get_form. Cette fonction prend en argument le nom d'une autre fonction qui décrit les éléments qui composeront le formulaire.
La fonction qui décrira le formulaire s'appellera summary_admin_settings, donc hook_menu appellera drupal_get_form(summary_admin_settings) lorsque la page devra s'afficher.

Création du formulaire : function summary_admin_settings()

La page d'administration proposera une case à cocher pour chaque section de summary permettant à l'administrateur de choisir si la section doit s'afficher ou non.

/**
 * Define the admin form.
 */
function summary_admin_settings(){
  $form['summary_display'] = array(
    '#type' => 'checkboxes',
    '#title' => t('Sections of the summary'),
    '#description' => t('Check the sections to show in the summary page'),
    '#options' => array('module' => t('Module list'), 'vocabulary' => t('Vocabulary list'), 'content_type' => t('Content types')),
  );
  return $form;
}

Un tableau $form est donc créé, chaque élément de ce tableau est un élément du formulaire et peut se paramétrer grâce à des propriétés. Voici la liste des propriétés utilisées :

'#type' Type de widget à utiliser. Ici des cases à cocher.
'#title' Titre à afficher au-dessus du widget.
'#description' Texte d'aide en dessous du widget.
'#options' Propriété propre aux cases à cocher, tableau listant les cases à cocher à afficher et leurs étiquettes.

Une description de tous les éléments pouvant être insérés dans un formulaire est disponible à la page : http://api.drupal.org/api/drupal/developer-topics--forms_api_reference.html.
Le lien Hook_elements() du bloc Devel affiche la liste des éléments disponibles.

Il manque le bouton de sauvegarde à votre formulaire. Il serait possible d'en créer un en ajoutant un nouvel élément de #type submit au tableau $form, mais il est préférable d'utiliser la fonction system_settings_form qui ajoute les boutons nécessaires par défaut des formulaires de configuration. Remplacer dans summary_admin_settings() le return $form;  par  return system_settings_form($form);

variable_get : sauvegarder des données dans la table variable

Modifier le code tq:

function summary_admin_settings(){
  $form['summary_display'] = array(
    '#type' => 'checkboxes',
    '#title' => t('Things to show for the summary'),
    '#description' => t('Check the things to show in the summary page'),
    '#options' => array('module' => t('Module list'), 'vocabulary' => t('Vocabulary list'), 'content_type' => t('Content types')),
    '#default_value' => variable_get('summary_display', array('module', 'vocabulary')),
  );
  return system_settings_form($form);
}

La fonction variable_get permet de récupérer des variables enregistrées dans le tableau de variables globales $conf, lui-même stocké dans la table variables de la base de données de Drupal. Elle prend deux paramètres, le premier, obligatoire, est le nom de la variable à récupérer, le second, optionnel, est la valeur que retourne variable_get si aucune variable n'est trouvée dans $conf.
Ici, on initialise donc le formulaire avec des valeurs par défaut qui seront, soit prises dans le tableau $conf si elles sont présentes, soit prises dans le second paramètre qui indique que les cases module et vocabulary sont cochées par défaut.

Pour afficher ce que contient $conf, vous pouvez exécuter le code suivant dans le bloc Execute PHP du module Devel :
global $conf;
dpm($conf);

Dernière question ; comment sont sauvegardées ces valeurs ? Eh bien c'est la fonction system_settings_form qui s'occupe de tout !
Pour que la fonction system_settings_form sauvegarde automatiquement les paramètres, il faut veiller à ce que le nom de l'élément de formulaire - $form['summary_display'] - soit identique à celui du premier paramètre de variable_get - variable_get('summary_display').

Perso les titres: ajout d'éléments textfield et fieldset

requetes sql

theming du contenu

Utiliser code_review.

Utiliser le module

Aller à la page d'administration du module:  admin/config/system/summary