Workbench Access et Rules - Notifier les modérateurs d'une nouvelle contribution

Autoroute de nuit

La gestion de contenu sous drupal

Workbench est une suite de modules qui permettent une gestion des contenus selon un flux de circulation (workflow) hautement paramétrable.

Le module workbench Moderation permet de créer autant d'états pour vos contenus (brouillons, relecture, proposé à la publication, publié, etc.) que nécessaire et de paramétrer les différentes transitions possibles d'un état à un autre. Vous pouvez définir bien sûr les permissions pour chaque transition (qui a le droit d'effectuer telle ou telle transition), selon les rôles dont disposent les différents contributeurs de votre site internet collaboratif.

Le module Workbench Access permet de gérer plus finement les droits selon une hiérarchie (basé sur un menu ou sur la taxonomy). Lors de la création et l'édition de contenu, les utilisateurs ne peuvent placer le contenu que dans une section éditoriale qui leur a été attribuée (et les éventuelles sous-sections). Les autres utilisateurs au sein de cette section ou de ses parents seront en mesure de modifier le contenu, s'ils disposent bien sûr du rôle adéquat. Un utilisateur peut disposer des droits éditoriaux sur une section spécifique à titre individuel ou de part son rôle assigné sur le site.

Comment notifier les modérateurs ?

Lors du changement d'état d'un contenu (comme par exemple de l'état brouillons à l'état proposé à la publication), il peut être opportun de notifier par courriel les différents modérateurs de la section (sur laquelle est proposé l'article) qu'un nouveau contenu est en attente de validation, ou encore de notifier à tous les contributeurs d'une section qu'un nouveau contenu est disponible.

Une notification manuelle avec Workbench Email

Le module Workbench Email propose ce type de fonctionnalités. Lorsque l'auteur d'un article soumet celui-ci en lui attribuant un état particulier (dans notre exemple proposé à la publication), il lui est proposé de sélectionner dans une liste les différents modérateurs qu'il souhaite prévenir. Ce module permet de définir autant de type de courriels différents qu'il existe de transitions possibles et d'affecter à chacune de ces transitions les potentiels destinataires (selon leur rôle) de la notification.

Mais si on utilise Workbench Access pour contrôler finement les droits de modération selon les sections du site, la liste des modérateurs proposée par le module Workbench Email n'est plus pertinente car elle contient tous les utilisateurs qui disposent du rôle de modération, mais qui ne disposent pas forcément tous des droits de modération sur la section où est proposé l'article.

Une notification automatique des modérateurs définis par Workbench Access avec le module Rules

Ici Intervient le module Rules. Worbench Moderation dispose d'une bonne intégration dans le modules Rules, ce qui permet aisément de créer des règles pour réaliser des actions selon les changements d'état des articles. Aussi bien il est aisé de notifier l'auteur d'un article sur les changements d'état de celui-ci, notifier les modérateurs définis avec Workbench Access est plus compliqué.

Le tutoriel ci-dessous va vous permettre de créer une règle pour notifier tous les utilisateurs disposant d'un ou plusieurs roles définis, et disposant des droits éditoriaux sur une section Workbench Access, lors d'un changement d'état d'un contenu.

Créons une règle Notification modérateurs

Ajouter l'événement Après une transition d'état (After Moderation transition)

Rules Ajouter un événement

Ajouter les conditions

Rules ajouter des conditions

L'état de moderation courant du contenu et paramétrons le sur Proposé à la relecture (Need review)
L'état de moderation précédent du contenu et paramétrons le sur Brouillon (Draft)
L'Entité a un champ et paramétrons le sur le champ field_section

Pour cette dernière condition, dans l'exemple Workbench Access est paramétré sur le vocabulaire Section. Cette condition permet de nous assurer que le contenu est bien géré par WorkBench Access et permet surtout de nous fournir pour l'action de la règle, le champ field_section et sa valeur.

Ajouter l'action Envoyer un courriel

Rules Ajouter une action

Snippet PHP pour le champ des destinataires

Dans le champ destinataire du courriel, saisissons ce snippet PHP (le module PHP filter du coeur de Drupal doit bien sûr être activé). Ce code va renvoyer les courriels de tous les utilisateurs disposant de droits éditoriaux de la section (ou les sections) de l'article et disposant du role indiqué dans le snippet.

 workbench_access;

// Workbench access est configuré pour utiliser les termes de taxonomy
// On récupère les termes de taxonomy (objet)
$terms=taxonomy_term_load_multiple($sections);

foreach ($terms as $term) {
// Pour chacun des termes on récupère tous les parents
$parents=taxonomy_get_parents_all($term->tid);

  if (!empty($parents)) {
    // Pour chacun des parents, on complète le tableau des sections affectées au noeud
    foreach ($parents as $parent) {
      
    $tid=$parent->tid;
    // Et au passage on récupère le nom machine du vocabulaire
    $voc_name=$parent->vocabulary_machine_name;
      if (!in_array($tid, $sections)) {
        $sections[$tid]=$tid;
      }
    }
  // On complète le tableau des sections du noeud avec le vocabulaire lui-même
  $sections[$voc_name]="'".$voc_name."'";
  }
};

// On définit le role des modérateurs
// Si plusieurs rôles sont modérateurs, il suffit de créer un tableau puis de faire une boucle foreach à ce niveau
$role_id=4;
$emails = array();

// Pour chaque section, on recherche les utilisateurs qui y ont été affectés et qui bien sûr disposent du rôle adéquat
foreach ($sections as $section) {
$result = db_query("SELECT user.mail AS mail FROM users user, workbench_access_user workbench, users_roles roles WHERE roles.rid=$role_id AND user.uid=roles.uid AND user.uid=workbench.uid AND access_id=$section");

// On enregistre les mels de chaque utilisateur trouvé dans le tableau $emails s'il n'y est pas déjà
  foreach($result as $record) {
    $mail=$record->mail;
    if (!in_array($mail,$emails)) { $emails[] = $mail; }
  }
}

// Les roles affectés à des sections
// Pour chaque section, on recherche les roles qui y ont été affectés (ils doivent bien sur disposer des droits nécessaires pour effectuer des modérations)
foreach ($sections as $section) {
$result = db_query("SELECT user.mail AS mail FROM users user, workbench_access_role workbench, users_roles roles WHERE user.uid=roles.uid AND roles.rid=workbench.rid AND access_id=$section");
  // On enregistre les mels de chaque utilisateur trouvé dans le tableau $emails s'il n'y est pas déjà
  foreach($result as $record) {
    $mail=$record->mail;
    if (!in_array($mail,$emails)) { $emails[] = $mail; }
  }
}

// Et nous imprimons la liste des courriels des moderateurs des sections auxquelles est affecté le noeud
print implode($emails, ",");

?> 

Nous pouvons enfin compléter les autres paramètres du courriels (champ expéditeur et le corps du messages) en utilisant les tokens fournis (auteur de l'article, titre de l'article, son url, etc.).

Désormais, à chaque transition depuis l'état Brouillons à l'état Proposé à la relecture, un courriel sera envoyé automatiquement à tous les modérateurs de la section où a été écrit l'article.

Workbench Notify : un module qui implémente cette fonctionnalité

Pour conclure, le module Workbench Notify implémente cette fonctionnalité et permet d'effectuer le paramétrage en quelques clics de souris. Vous n'avez pas alors besoin d'utiliser Rules pour notifier vos modérateurs.

Workbench Notify

Commentaires

Soumis par bil (non vérifié) le 09/03/2017 à 11:32 - Permalien

bonjour
j'ai testé le code php dans rule et cela ne fonctionne pas je sais pas si j'ai commis une erreur quelque part.

j'ai bien configuré workbench_access et sa suite tout fonctionne bien avec workbench_mail et workbench_notifier mais j'aimerais résoudre le problème de l'envoi de mail par section raison pour laquelle j'ai testé votre code .
toute aide de votre part est vivement souhaitée.
cordialement.

Ajouter un commentaire