Première création de module - Erreur

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,

étant donné que je n'ai pas trouvé de module approprié pour faire ce que je souhaite, je suis partie dans l'idée de créer un module.

Sauf qu'il y a quelques problèmes.

J'ai suivi le cours de création de module sur le site "KolossalDrupal" et j'ai donc voulu adapter le code à mon besoin.

Ce que doit faire mon module appelé "average" : afficher la moyenne pour chaque utilisateur de toutes les notes reçues par leurs articles. Par exemple, user1 a écrit trois articles. Chaque article a plusieurs notes. Je veux la moyenne de toutes les notes de ces trois articles.

Ce que j'ai écrit :

  • Fichier average.info
  • ; $Id$
    name = average
    description = Calcul de la moyenne de chaque utilisateur ayant écrit du contenu
    core = 6.x
  • Fichier average.module
  • <?php
    // $Id$
    ?>


    <?php

    // Donner les droits uniquement aux administrateurs
    function average_perm()
    {
        return array(
    'access average content', 'administer average');
    }

    // Bloc d'affichage du contenu
    function average_block($op='list',$delta=0)
    {
        if (
    $op == "list")
        {
           
    // Generate listing of blocks from this module, for the admin/block page
           
    $block = array();
           
    $block[0]["info"] = t('Average');
            return
    $block;
        }
        else if (
    $op == 'view')
        {
           
    // Generate our block content
           
            // Requête
           
    $query = "SELECT AVG(W.value) AS moyenne, N.uid, U.name
                        FROM {votingapi_cache W}
                        JOIN {node N} ON W.content_id=N.nid
                        JOIN {users U} ON N.uid=U.uid
                        WHERE W.function='average'
                        AND N.type='contribution'"
    ;
       
           
    $query_result db_query($query);
           
           
    // variable contenu qui sera retournée pour l'affichage  
           
    $block_content = '';
            while (
    $links = db_fetch_object($query_result))
            {
               
    $block_content .=  l($links->moyenne, $links->uid, $links->name) .'<br />';
            }
           
           
    // vérifier s'il y a du contenu avant de retourner le block view
           
    if ($block_content == '')
            {  
               
    // Aucun contenu
               
    $block['subject'] = 'Average';
               
    $block['content'] = 'Désolé, pas de contenu';
                return
    $block;
            }

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

(nb : je n'ai pas mis le ?> de fin de code dans mon fichier)

Ce que j'ai eu comme erreurs :

  • Des pages blanches à l'activation du module et à l'affichage du bloc (mais ça fonctionnait encore juste après l'activation du module)
  • Une erreur PHP me disant qu'il y avait un problème d' "operand type" sur le fichier common.inc à la ligne 1592, qui correspond à la fonction l() de création d'un lien. Mais si je ne veux pas de lien, je dois utiliser quelle fonction alors ?

Alors à vous qui êtes forcément plus au courant que moi de l'écriture d'un module Drupal, est-ce que vous pourriez m'expliquer ce qui ne va pas ? :)

Forum : 
Version de Drupal : 

L'erreur précisément :

Fatal error: Unsupported operand types in .../includes/common.inc on line 1592

EDIT : j'ai modifié la requête pour qu'elle fonctionne (testé dans phpMyAdmin) :

$query = "SELECT AVG(W.value) AS moyenne, N.uid, U.name
FROM votingapi_cache W
    JOIN node N ON W.content_id=N.nid
  JOIN users U ON N.uid=U.uid
    WHERE W.function='average'
   AND N.type='contribution'";

Vous avez une erreur dans votre fonction, l() accepte comme troisième paramètre un array qui correspond aux options du lien par exemple rel="nofollow". La fonction s'utilise comme ceci : l('texte à afficher', 'lien', array('options'));

Autre erreur au niveau de votre query les {} devrais seulement couvrir les nom des tables mais pas aussi alias.

Voila le code à peu près nettoyer :

<?php
// $Id$

/**
 * @file
 * Le but de mon module.
 */

/**
 * Implemenation of hook_perm().
 */
function average_perm() {
  return array(
'access average content', 'administer average');
}

/**
 * Implementation of hook_block().
 */
function average_block($op = 'list', $delta = 0, $edit = array()) {
  if (
$op == 'list') {
   
$block = array();
   
$block[0]["info"] = t('Average');
   
    return
$block;
  }
  else if (
$op == 'view') {
   
// Requête
   
$query = "SELECT AVG(W.value) AS moyenne, N.uid, U.name
                FROM {votingapi_cache} W
                JOIN {node} N ON W.content_id = N.nid
                JOIN {users} U ON N.uid = U.uid
                WHERE W.function = '%s'
                AND N.type = '%s'"
;
   
$query_result db_query($query, 'average', 'contribution');
   
   
// variable contenu qui sera retournée pour l'affichage
   
$block_content = '';
   
    while (
$links = db_fetch_object($query_result)) {
     
// La fonction l() s'utilise comme ceci l('texte à afficher', 'lien', array('options'));
     
$block_content .=  l($links->moyenne, $links->uid) . '<br />';
    }
   
   
$block['subject'] = t('Average');
   
$block['content'] = ($block_content == '') ? t('Désolé, pas de contenu') : $block_content;
   
    return
$block;
  }
}
?>

Merci beaucoup takeova ! :D

Je ne savais pas comment mettre les {} et les alias de mes tables et j'ai testé plusieurs choses ^^

Et si je ne veux pas afficher de lien mais juste les trois champs de la requête, que dois-je utiliser comme fonction à la place de l() ? (Pour afficher le nom de l'utilisateur et sa moyenne par exemple)

EDIT : j'ai trouvé ! en fait c'est comme en PHP normal quoi, je me prenais la tête pour rien :p