Quelle bonne stratégie pour compter les 'notifiés' ?

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.

Bonsoir à tous.

Grande interrogation du soir:

J'ai un type de contenu 'producteurs', je voudrais que mes utilisateurs aient la possibilité de s'abonner à ces 'producteurs'. Ok, j'ai donc installé notifications pour les avertir dès qu'il y a une modification dans le noeud auquel ils sont abonnés. Et j'aimerai pouvoir compter ses abonnés (avoir un bloc : x personnes suivent ce producteur : machinbidule, gérard Lambert, l'autre, machinchouette, etc...)

Qu'elle stratégie me conseillez vous ? (sachant que j'ai un niveau de base en php et mysql et drupal)

1.Il existe une fonction toute faite dans notifications, que tu n'as pas vu, banane !
2.Il existe un autre module qui fait exactement ça.
3.Tu crées un bloc avec une instruction php de base select ...)
4.Notifications est trop complexe pour toi, tu as qu'as te créer ton propre module, mon grand !

Questions annexes :
- est-ce qu'on peut se dépatouiller sans notifications, juste avec rules ?
- je me penche pour la première fois dans la base de données brute, est-ce qu'il y a un lexique quelque part, un tutoriel général pour en comprendre l'organisation (même si plusieurs choses me semblent évidente, un petit tuto serait pratique...)

A bientôt. Et merci d'avance.

Forum : 
Version de Drupal : 
Tags : 

Bon, pour le moment, j'ai fait un bloc affichant ceci

<?php
$bd
= mysql_connect ("localhost","root");
mysql_select_db(producteurs, $bd);
$sql = "select name from users, notifications_fields where users.uid=notifications_fields.sid and notifications_fields.field='nid' and value=43";
$resultat = mysql_query($sql);
$nombre = mysql_num_rows($resultat);

$message = "Ce producteur est suivi par ".$nombre." utilisateurs :";

while ($ligne = mysql_fetch_array($resultat)) {
$message = $message." <a href='/?q=users/".$ligne[name]."'>".$ligne[name]."</a>";
}

echo $message;
?>

Concrètement ça fonctionne, mais est-ce que le code vous semble propre? Est-il possible de l'optimiser ?
Concernant la connexion à la base de données, est-ce qu'il n'y a pas une fonction Drupal pour ça ? Ca me fait bizarre d'utiliser mes identifiants de connexion directement dans un bloc (pour le moment c'est en local, tout va bien :)) Y'a t'il d'autres raccourcis pour utiliser les ressources de Drupal (je pense notamment au lien)?
Je vous remercie par avance de votre aide.

Oups, ma requête était pas bonne :

<?php
  $node
= node_load(arg(1));
 
$nid = $node->nid ;

$bd= mysql_connect ("localhost","root");
mysql_select_db(producteurs, $bd);
$sql = "select name from users, notifications_fields, notifications where users.uid = notifications.uid and notifications.sid=notifications_fields.sid and notifications_fields.value=".$nid;
$resultat = mysql_query($sql);
$nombre = mysql_num_rows($resultat);

$message = "Ce producteurs est suivi par ".$nombre." utilisateurs :";

while ($ligne = mysql_fetch_array($resultat)) {
$message = $message." <a href='/?q=users/".$ligne[name]."'>".$ligne[name]."</a>";
}

echo $message;
?>

Avec le pas beau, mais j'ai pas mieux :

<?php
if(arg(0) == 'node' && is_numeric(arg(1))){
 
$node = node_load(arg(1));
  (
$node->type == 'producteur') ? $afficher = TRUE : $afficher = FALSE;
}
return
$afficher;
?>

en paramètre de visibilité.

Si quelqu'un peu me dire quoi améliorer, je suis méga preneur. Même si ça marche, j'ai conscience que c'est de la bidouille !

Hello
Drupal est déjà connecté à la base de données, tu n'as pas à gérer toi même la connexion à la base, c'est fait en amont.

Tu dois utiliser db_query à la place de mysql_query, idem pour db_fetch_array à la place de mysq_fetch_array etc...

http://api.drupal.org/api/group/database/6

pour créer un lien, voir http://api.drupal.org/api/function/l/6

Merci de ton aide.

J'ai pas trouver la fonction correspondante à mysql_num_rows(), du coup, j'ai encore un peu bidouillé :

<?php
  $node
= node_load(arg(1));
 
$nid = $node->nid ;

$sql = "select name from users, notifications_fields, notifications where users.uid = notifications.uid and notifications.sid=notifications_fields.sid and notifications_fields.value=".$nid;
$resultat = db_query($sql);

$debutMessage = "Ce producteur est suivi par ";
$message = " utilisateurs : ";

$nb = 0;
$attribute = array();

while ($ligne = db_fetch_array($resultat)) {

$url = "users/".$ligne[name];
$message .= l($ligne[name],$url, $attribute)." ";
$nb = $nb+1;
}

echo $debutMessage.$nb.$message;

?>

Ca fonctionne mais c'est encore de la bidouille...
Est-ce que ma requête sql est bonne ou est-ce qu'on peut l'optimiser ?

Je continue de parler dans le désert, mais j'ai l'impression d'avancer.

(Dsl, je flood pas, simplement, je crois qu'il n'est pas possible d'éditer mes précédents messages)

Le fin du fin serait d'intégrer mon bout de code au bloc fourni de base par le module notifications, mais j'ai aucune idée de comment il faut faire...
Quelqu'un pour m'aider ?

Bon allez, il est grand temps d'aller se coucher...

Bonne soirée à tous.

Peut être le module notifications possède t-il un template pour afficher le contenu de son bloc que tu peux overrider pour créer ta propre version et donc ajouter ce que tu veux dedans.

Sinon tu peux créer un template de bloc pour themer à ta manière le bloc notifications (page à lire impérativement si on fait du theming drupal : http://drupal.org/node/190815 ;-) )

Du coup tu pourrais par exemple rajouter ça dans le template de ce bloc.

Bonjour à tous.
J'ai essayé d'avancer un peu par moi même et j'ai fait des bétises !!!

J'ai modifié la fonction hook_block

Elle était comme ça :

/**
* Implementation of hook_block()
*/
function notifications_ui_block($op = 'list', $delta = 0) {
  global $user;
 
  if ($op == 'list') {
    $blocks[0]['info'] = t('Subscriptions');
    return $blocks;
  }
  else if ($op == 'view') {
    if ((arg(0) == 'node') && is_numeric(arg(1)) && ($node = node_load(arg(1))) && notifications_ui_node_options($node->type, 'block')) {
      // Only display if we have something for the form
      if ($node_options = notifications_ui_subscribe_options($user, 'node', $node)) {
        $block['subject'] = t('Subscriptions');
        $block['content'] = drupal_get_form('notifications_ui_options_form', $node_options, FALSE);
        return $block;
      }     
    }
    elseif (arg(0) == 'user' && is_numeric(arg(1)) && notifications_ui_account_options('block')) {
      // Only display if we have something for the form
      if (($account = user_load(arg(1))) && ($options = notifications_ui_subscribe_options($user, 'user', $account))) {
        $block['subject'] = t('Subscriptions');
        $block['content'] = drupal_get_form('notifications_ui_options_form', $options, FALSE);
        return $block;
      }      
    }
  } 
}

et j'ai fait ceci :

/
* Implementation of hook_block()
*/
function notifications_ui_block($op = 'list', $delta = 0) {
  global $user;
 
  if ($op == 'list') {
    $blocks[0]['info'] = t('Subscriptions');
    return $blocks;
  }
  else if ($op == 'view') {
    if ((arg(0) == 'node') && is_numeric(arg(1)) && ($node = node_load(arg(1))) && notifications_ui_node_options($node->type, 'block')) {
      // Only display if we have something for the form
      if ($node_options = notifications_ui_subscribe_options($user, 'node', $node)) {
        $block['subject'] = t('Subscriptions');
        $block['content'] = notifications_ui_definit_bloc_content($node_options);
        return $block;
      }     
    }
    elseif (arg(0) == 'user' && is_numeric(arg(1)) && notifications_ui_account_options('block')) {
      // Only display if we have something for the form
      if (($account = user_load(arg(1))) && ($options = notifications_ui_subscribe_options($user, 'user', $account))) {
        $block['subject'] = t('Subscriptions');
        $block['content'] = notifications_ui_definit_bloc_content($options);
        return $block;
      }      
    }
  } 
}

/
* Fonction personnelle pour ajouter le comptage et l'identification des personnes subscribed
*
**/
function notifications_ui_definit_bloc_content ($options) {

$node = node_load(arg(1));
  $nid = $node->nid ;

$sql = "select name from users, notifications_fields, notifications where users.uid = notifications.uid and notifications.sid=notifications_fields.sid and notifications_fields.value=".$nid;
$resultat = db_query($sql);

$debutMessage = "Ce producteur est suivi par ";
$message = " utilisateurs : ";

$nb = 0;
$attribute = array();

while ($ligne = db_fetch_array($resultat)) {

$url = "users/".$ligne[name];
$message .= l($ligne[name],$url, $attribute)." ";
$nb = $nb+1;
}

$contenu = $debutMessage.$nb.$message;
global $user;
if ($user->uid) {
$contenu .= drupal_get_form('notifications_ui_options_form', $options, FALSE);
}
else {
$contenu .= "<br>Pour s'abonne &agrave; un producteur vous devez &ecirc;tre enregistr&eacute; sur le site. ".l("Inscrivez-vous !","user/register",$attribute);
}
      

return $contenu;
}

Mais ça marche pas du tout, l'affichage est aléatoire, le formulaire ne fonctionne qu'avec l'admin et pas avec un autre pseudo, pourtant je pensais ne pas avoir touché au formulaire.
Est-ce que quelqu'un pourrait me dire ce que j'ai fait de mal...
SVP

Hello,

Je n'ai pas lu le détail des messages intermédiaires, mais j'ai vu beaucoup de code PHP et MySQL et j'ai l'impression qu'il y a moyen de faire plus simple :

1) S'abonner à un producteur

Utilise le module http://drupal.org/project/flag.

Un flag est comme une variable qui ne peut avoir que deux valeurs : On / Off (ou si tu préfères : oui / non ; 1 / 0...). Tu crées un flag "abonné au producteur" que tu fais porter sur le type de contenu "producteur". Chaque utilisateur pourra ensuite cliquer un lien situé sur la fiche du producteur pour passer le flag On ou Off, autrement dit, pour dire s'il s'abonne ou pas au producteur en question.

2) Afficher la liste des utilisateurs qui suivent un producteur

Utilise le module http://drupal.org/project/views.

Tu fais une vue d'utilisateurs qui ne remonte que les utilisateurs ayant le flag "abonné au producteur" en position ON (dans Views, ça s'appelle un "filtre"), et ce uniquement pour un producteur donné (dans Views, ça s'appelle un "argument").

Tu afficheras cette vue sous forme de bloc, sur la page de chaque producteur.

La vue ira chercher l'identifiant du producteur dans l'URL, de façon à "s'adapter" automatiquement au producteur qu'on est en train de regarder.

3) Notifier les abonnés des changements dans la fiche producteur.

Utilise le module http://drupal.org/project/rules.

............

Voilà. Je te recommande le module Flag parce qu'il est parfaitement intégré aux modules Views et Rules. Tu pourras donc construire les vues et les règles que tu veux, sur la base de tes flags.

Cela dit, je t'ai uniquement indiqué les grandes lignes. Si tu débutes avec Drupal, il est probable que tu doives d'abord te documenter sur le fonctionnement individuel de chacun de ces trois modules avant de chercher à les faire fonctionner ensemble.

Merci à toi DrupalFrance !

C'est effectivement exactement ce dont j'avais besoin.

Je n'avais pas connaissance du module Flag, il devrait me simplifier la vie.

Effectivement dans mes stratégies de départ, j'avais "utiliser rules" mais je ne suis pas arrivé à le faire fonctionner correctement avec notifications (pour lister mes abonnées), du coup, j'étais parti à écrire un peu de php (ce que je ne regrette pas, ça m'a obligé à me plonger un peu dans l'api et dans la façon de faire des modules, et c'est toujours ça de pris).
Avec Flag ça à l'air simple, et ça doit être simple pour l'utilisation que j'en ai. En plus, j'utilise déjà largement views et un peu rules dont je devrais me dépatouillé maintenant. Merci de ton aide très claire et détaillée.

A bientôt.

Visiblement, il est pas évident d'utiliser rules pour prévenir tous les utilisateur qui ont flagged le contenu que celui-ci à changer.
Je vais persévérer un peu, mais ce n'est pas une action proposée de base par Rules.

Dommage que Notification fonctionne pas avec View aussi bien que flag, cela aurait simplifié les choses !!! (une views des gens qui avait activé la notification du node aurait suffit...)