Voilà, voilà... Fin de l'aventure...

 

Fermeture de kolossaldrupal.org dans...


Bonjour tout le monde,

Drupal évolue, les versions changent et Kolossaldrupal.org était essentiellement consacré à la version 6 de Drupal.

Autant dire que les infos présentées ici commencent à dater...

Faute de temps, je ne peux plus garder le site Kolossaldrupal à jour...

Je vous aurais bien proposé de reprendre le flambeau mais... c'est tellement simple de nos jours de se faire son propre site à soi...Pourquoi s'embêter alors ? :-)

Ce site restera donc en l'état, tel qu'il était en 2011...

Ah la la ! Cela ne nous rajeunit pas !

Manuel Vila - Avril 2016

Générer le contenu du bloc

Référence en anglais sur drupal.org : 29 octobre 2010 - http://drupal.org/node/206759


Dans cette étape du tutoriel nous générerons le contenu du bloc. Ce qui implique d'accéder à la base de données de Drupal. Notre but est d'obtenir une liste du contenu créé une semaine auparavant (ce contenu est enregistré en tant que nodes dans la base de données). Plus précisément, nous voulons le contenu créé entre minuit et 23h59 il y a tout juste une semaine. Lorsqu'un node est créé, la date et l'heure de sa création sont enregistrés dans la base de données. Nous utiliserons ce champ de la base pour trouver nos données.

Pour indiquer à Drupal le contenu que nous voulons dans le bloc, nous utiliserons l'opération view de hook_block(). Nous devrons donc ajouter un peu de code à la fonction onthisdate_block() déclarée précédemment.

En premier lieu, nous devons calculer l'heure de minuit il y a une semaine et de 23h59 il y a une semaine, en secondes. Cette partie du code n'est pas spécifique à Drupal, reportez-vous à la documentation PHP pour plus d'informations.

<?php

/**
* Generate HTML for the onthisdate block
* @param op the operation from the URL
* @param delta offset
* @returns block HTML
*/
function onthisdate_block($op='list'$delta=0) {

  if (
$op == "list") {
    
// Generate listing of blocks from this module, for the admin/block page
    
$block[0]["info"] = t('On This Date');
  }
  else if (
$op == 'view') {

    
// Generate our block content

    // Date du jour
    
$today getdate();

    
// calculer minuit il y a une semaine
    
$start_time mktime(000,
       
$today['mon'], ($today['mday'] - 7), $today['year']);

    
// nous voulons les éléments survenus seulement le jour en question, aussi  
    // calcule d'une journée
    
$end_time $start_time 86400
    
// 60 * 60 * 24 = 86400 secondes dans une journée
   

   // davantage ultérieurement...
  
}
}

?>
Si votre site n'a pas de contenu pour le jour en question, vous pouvez changer la date de fin comme ci-dessous, afin d'avoir quelque chose dans le bloc :
$end_time = time(); // obtenir toutes les publications depuis la semaine passée jusqu'à aujourd'hui

L'étape suivante est l'écriture de la requête SQL qui récupérera dans la base de données le contenu que nous voulons afficher. Nous sélectionnons du contenu de la table node, qui est la table principale pour le contenu Drupal. Avec cette requête, nous obtiendrons des contenus de tous types : billets de blog, posts sur les forums, etc. C'est tolérable dans le cadre de ce tutoriel mais pour un vrai module vous devrez préciser la requête SQL pour ne sélectionner que certains types de contenus (en ajoutant une clause WHERE sur la colonne type).

Drupal utilise des fonctions qui vous assistent dans l'exécution des requêtes SQL. Vous n'aurez ainsi à vous soucier que de l'écriture de la requête sans avoir à vous préoccuper de la cuisine interne pour la connexion à la base proprement dite. Nous utiliserons db_query() avec notre requête pour récupérer les enregistrements :

<?php
  $query 
"SELECT nid, title, created FROM " .
     
"{node} WHERE created >= '%d' " .
     
" AND created <= '%d'";

  
$query_result =  db_query($query$start_time$end_time);
?>

Cet exemple montre comment créer une requête sûre dans Drupal : création de la requête avec des paramètres comme % et %s puis passage de variables à la fonction db_query() qui prendront la place de ces paramètres. Cette façon de faire prévient les attaques par injection SQL, notamment lorsque les requêtes utilisent du contenu fourni par les utilisateurs.

Une autre habitude Drupal à suivre pour les requêtes est d'entourer les noms de tables avec des accolades ouvrantes et fermantes, comme dans {node}. C'est indispensable pour que votre module tienne compte des préfixes des tables. Vous trouverez plus d'informations sur le site Drupal en lisant la page Table Prefix (and sharing tables across instances du manuel Drupal.

Pour finir, vous remarquerez que dans cet exemple, nous ne tenons pas compte des droits d'accès pour les nodes. Normalement, toute requête sur les nodes devrait utiliser la fonction db_rewrite_sql() qui s'assure que l'utilisateur qui lit la page a les droits pour voir chaque node retourné, mais cela dépasse la portée de ce tutoriel.

Ensuite, nous utilisons db_fetch_object() pour voir chaque enregistrement retourné par la requête. Nous générerons un lien vers le node pour chaque node trouvé, avec son titre comme texte du lien :

<?php
  
// variable contenu qui sera retournée pour l'affichage   
  
$block_content ''
  while (
$links db_fetch_object($query_result)) {
    
$block_content .=  l($links->title'node/'$links->nid) .'<br />';
  }
?>

Notez que le vrai lien est créé par la fonction l(), l créé des liens <a href="link"> pour les chemins Drupal, formatés en clean URL (URL simplifiées) ou pas, selon les paramètres de la page Administrer » Configuration du site » URL simplifiées.

Pour finir, nous retournons à Drupal le contenu qui vient d'être généré, pour son affichage :

<?php
  
// vérifier s'il y a du contenu avant de retourner le block view
  
if ($block_content == '') {   
    
// pas de contenu il y a une semaine.
     
$block['subject'] = 'On This Date';
     
$block['content'] = 'Désolé, pas de contenu';
     return 
$block;
  }

  
// configurer le bloc
  
$block = array();
  
$block['subject'] = 'On This Date'
  
$block['content'] = $block_content;
  return 
$block;
}
?>

Nous retournons un tableau avec des éléments subject et content : c'est la structure attendue par Drupal pour les fonctions blocs. Si nous ne les avions pas mis les deux, le bloc n'aurait pas été correctement mis en forme.

L'exemple précédent suppose que, s'il n'y a pas de contenu pour la date choisie, vous voulez afficher un bloc disant « Désolé, pas de contenu ». A la place, vous pouvez décider d'ommettre l'affichage du bloc s'il n'y a pas de résultats. Pour cela, remplacez le code dans aux bons endroits :

<?php
  
if ($block_content == '') {   
     
/* pas de contenu il y a une semaine. Si nous ne renvoyons rien
      * le bloc ne s'affiche pas, ce qui est ce que nous voulons
     */
     
return;
  }
?>

Vous aurez peut-être remarqué que le contenu et la mise en page sont intimement liés, ce qui est fortement déconseillé. Si vous écrivez un module utilisable par tous, il vaut mieux fournir un moyen simple pour que la mise en page puisse être modifiée, notamment par des non-programmeurs. La façon de faire la plus simple consiste à ajouter un attribut de classe à votre lien, ou d'entourer le code HTML avec une balise <div> dotée d'une classe CSS spécifique et ne pas mettre la balise<br /> à la fin du lien. Une bien meilleure idée serait de rendre personnalisable le graphisme du module. Nous ne nous occuperons pas de cela pour l'instant mais gardez-le à l'esprit pour l'écriture de modules contributifs.

En mettant tous ces codes bout à bout, notre fonction ressemblera à ceci :

<?php
function onthisdate_block($op='list'$delta=0) {

  if (
$op == "list") {
    
// Génère le listing des blocs pour ce module, pour la pages Admin/Blocs
    
$block = array();
    
$block[0]["info"] = t('On This Date');
    return 
$block;
  }
  else if (
$op == 'view') {

    
// Génère notre contenu du bloc

    // la variable content sera retournée pour l'affichage
    
$block_content '';

    
// Obtenir la date du jour
    
$today getdate();

    
// calculer minuit il y a une semaine
    
$start_time mktime(000,$today['mon'],
                               (
$today['mday'] - 7), $today['year']);

    
// nous voulons seulement les éléments du jour en question, 
    //alors on calcule un jour
    
$end_time $start_time 86400;
    
// 60 * 60 * 24 = 86400 secondes dans une journée

    
$query "SELECT nid, title, created FROM " .
             
"{node} WHERE created >= '%d' " .
             
" AND created <= '%d'";

    
$query_result =  db_query($query$start_time$end_time);
    while (
$links db_fetch_object($query_result)) {
      
$block_content .= l($links->title'node/'.$links->nid) . '<br />';
    }

    
// vérifier s'il y a du contenu, avant de retourner la vue bloc
    //  
    
if ($block_content == '') {
    
// pas de contenu il y a une semaine.
     
$block['subject'] = 'On This Date';
     
$block['content'] = 'Désolé, pas de contenu';
     return 
$block;
    }
    
// configurer le bloc
    
$block['subject'] = 'On This Date';
    
$block['content'] = $block_content;
    return 
$block;
  }
}  
// end onthisdate_block
?>

Notre module est maintenant opérationnel (bien qu'il resterait encore à rendre personnalisable le style de ses affichages mais nous n'aborderons pas le sujet dans cet article), nous pouvons l'installer et le tester (prochaine étape du tutoriel).

Voir aussi