Submitted by Eki on
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
- Fichier average.module
; $Id$
name = average
description = Calcul de la moyenne de chaque utilisateur ayant écrit du contenu
core = 6.x
<?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 ? :)
L'erreur précisément : Fatal
Permalien Soumis par Eki le 7 Juin, 2010 - 11:47
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
Permalien Soumis par takeova le 7 Juin, 2010 - 17:56
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 !
Permalien Soumis par Eki le 8 Juin, 2010 - 08:41
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