Module summary avec requetes SQL

En PJ, le module summary0 (à renommer en zip et dézipper) a 3 fichiers.
Le fichier summary0.module.depart n'a pas encore de SQL.
summary0.module affiche un tableau HTML (avec des balises h3, donc thème à créer) avec le nombre de nodes par type de contenu (publié).
La page de résumé est à /summary0 ; la page de configuration à admin/config/system/summary0

requetes sql 1 : afficher le nb de nodes publiés

Modifiez la fin de la fonction summary_content() ainsi :

// Number of nodes.
$query = 'SELECT count(*) FROM {node} WHERE status = 1';
$summary_node_count = db_query($query)->fetchField();
$summary_node_count = t('<h3>Number of nodes</h3>') . $summary_node_count;
 
$display = variable_get('summary_display', array()); 
$output = '';
if ($display['module'])
$output .= $summary_module_list ; 
if ($display['vocabulary']) 
$output .= $summary_vocabularies_list; 
if (array_key_exists('content_type', $display) && $display['content_type'])
$output .= $summary_node_types_list;
$output .= $summary_node_count; 
 
return $output; 

La fonction : db_query prend en paramètre la requête SQL et retourne un objet. Une méthode de cet objet est fetchField qui retourne le résultat de la requête.
Il y a des {} autour de node (voir SELECT) car drupal peux utiliser des préfixes de tables (ex: cv_ ).

requetes sql 2 : afficher le nb de nodes publiés par type (sur x lignes)

SELECT type, count(*) AS "Nombre nodes"
FROM node
GROUP BY type

Dans le module summary, la requête devient donc :  //Number of nodes per type
$query = 'SELECT type, count(*) FROM {node} GROUP BY type';

L'objet retourné par db_query (de type DatabaseStatementBase) permet d'exécuter plusieurs méthodes :
rowCount nb lignes retournées par requete
fecthAssoc Retourne une ligne du résultat de la requête sous forme de tableau (nom colonne - valeur). Au prochain appel de la fonction, la ligne suivante est retournée
fetchAllKeyed Retourne l'ensemble des résultats sous forme de tableau. La clé des éléments est la première colonne de la requête
fetchAllAssoc Retourne l'ensemble des résultats sous forme de tableau. La colonne devant servir de clé est passée en paramètre.
getQueryString Retourne la requête SQL de l'objet
fetchCol Retourne tous les éléments d'une colonne. Le numéro de la colonne est passé en paramètre.
fetchField Retourne la première colonne de la première ligne.

Il y a donc plusieurs solutions possibles pour arriver au même résultat.

Requête avec variables

Par exemple une requête qui sélectionne le titre des nodes publiées de type article :  $query = 'SELECT title FROM {node} WHERE type="article" AND status=1'; $result = db_query($query);

Imaginez maintenant que vous avez deux variables $type et $status contenant respectivement le type et le statut des nodes à afficher, la requête devient alors :

$query = 'SELECT title FROM {node} WHERE type = :type AND status = :status';
$result = db_query($query, array( ':type' => $type, ':status' => $status));

Il faut donc utiliser des "jokers" (:type, :status), leurs valeurs sont ensuite remplacées lors de l'exécution de la fonction db_query. Celle-ci prend un tableau en deuxième argument qui contient la liste des valeurs et des jokers.

Requête avec le constructeur de requêtes db_select

La requête précédente est une requête simple, mais le système des jokers peut vite devenir confus si votre requête comporte un grand nombre de paramètres. Drupal propose alors tout un système de construction de requêtes via PHP.
Voici par exemple ce que deviendrait la requête précédente :

$query = db_select(node, n);
$query
  ->fields('n', array('title'))
  ->condition('type', $type)
  ->condition('status', $status);
$result = $query->execute();

L'idée est donc de commencer par créer un objet de type SelectQuery en appelant la fonction db_select et ensuite de le modifier en lui ajoutant des directives SQL. Lorsque celle-ci est construite, il faut lancer la méthode execute() pour récupérer le résultat de la requête.
La fonction db_select prend en premier argument le nom de la table à utiliser (node) et en deuxième argument un alias (n). C'est cet alias qui sera utilisé dans les autres directives SQL (fields('n', array('title')).

Cette méthode permet de construire une requête tout au long d'un script PHP sans avoir à manipuler de longues chaînes de caractères pour former une requête SQL valide.

- SelectQuery possède quelques dizaines de méthodes correspondant à des directives SQL. Vous pouvez retrouver la liste de ces méthodes sur la page SelectQuery
- Vous pouvez utiliser les méthodes DeleteQuery, InsertQuery et UpdateQuery pour des requêtes SQL delete, insert et update.

Doc tek: 
Fichier attachéTaille
Plain text icon summary0sql.zip_.txt3.31 Ko