Message d'avertissement

The subscription service is currently unavailable. Please try again later.

Quel module pour avoir "Accepter la réponse"

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,

quel est le module qui permet comme sur ce forum d'avoir "Accepter la réponse"?

Merci

Version de Drupal : 

J'ai réussi à faire quelque chose de présentable, malheureusement ce n'est pas un module. voici comment j'ai procédé :

  • Création d'un flag global solved_comment
  • Création d'un flag global solved_node caché (décocher toutes les options d'affichage)

Création de deux actions à associer au flag solved_node. La première action (Solved) est à associer lorsque le nombre flag solved_comment est supérieur ou égale à 1, et la seconde (Unsolved), lorsque le nombre de flag est inférieur à 1.

Cela permet de marquer le sujet comme résolu si au moins une réponse a été acceptée.

<?php
/**
 * Implementation of hook_action_info().
 */
function module_action_info () {
  return array(
   
'module_node_solved_action' => array(
     
'description' => t('Solved'),
     
'type' => 'comment',
     
'configurable' => FALSE,
     
'hooks' => array('any' => TRUE)
    ),
   
'module_node_unsolved_action' => array(
     
'description' => t('Unsolved'),
     
'type' => 'comment',
     
'configurable' => FALSE,
     
'hooks' => array('any' => TRUE)
    )
  );
}

/**
 * Implementation of a Drupal action.
 * Solved action
 */
function module_node_solved_action(&$object, $context = array()) {
 
$flag = flag_get_flag('solved_node');
 
$flag->flag('flag', $object->nid);
}

/**
 * Implementation of a Drupal action.
 * Unsolved action
 */
function module_node_unsolved_action(&$object, $context = array()) {
 
$flag = flag_get_flag('solved_node');
 
$flag->flag('unflag', $object->nid);
}
?>

Ensuite un petit hook afin que seul l'auteur est les administrateurs puissent marquer les commentaires. La version 2 du module flag gère ceci mais la migration est irréversible.

<?php
function theme_preprocess_flag(&$variables) {
  if (
$flag == 'solved_comment') {
    global
$user;

   
$comment = _comment_load ($variables['content_id']);
   
$node = node_load ($comment->nid);
    if (
$node->uid != $user->uid && !user_access('administer nodes')) {
     
$variables = array();
    }
  }
}
?>

Pour finir, je rajoute la classe CSS solved aux commentaires et nœuds résolus :

<?php
function theme_preprocess_node(&$variables) {
 
$flag = flag_get_flag('solved_node');
  if (
$flag && $flag->is_flagged($variables['node']->nid)) {
   
$variables['classes'] .= ' solved';
  }
}

function
theme_preprocess_comment(&$variables) {
 
$flag = flag_get_flag('solved_comment');
  if (
$flag && $flag->is_flagged($variables['comment']->cid)) {
   
$variables['classes'] .= ' solved';
  }
}
?>

en espérant avoir été utile ;)

Sur ce site, nous avons packagé une feature contenant le Flag + la configuration du type de contenu, et un peu de code spécifique, dont le morceau le plus important est une logique spécifique pour l'accès au flag:

<?php
/**
 * Implementation of hook_flag_access().
 */
function drupalfr_workflow_flag_access($flag, $content_id, $action, $account) {
  global
$user;
  if (
$flag->name == 'accepted_answer') {
   
$comment = $flag->fetch_content($content_id);
   
$node = node_load($comment->nid);

   
// User can edit that flag if
    //  - it is the owner of the node and not the owner of the comment.
    //  - and this node doesn't have an accepted answer or the comment is accepted.
   
if (($node->uid == $user->uid) && ($comment->uid != $user->uid) &&
        ((isset(
$node->field_workflow_status[0]['value']) && ($node->field_workflow_status[0]['value'] == 'pending')) || $flag->is_flagged($content_id))) {
      return
TRUE;
    }
    else {
      return
FALSE;
    }
  }
}
?>

Tout le reste a été fait avec Rules.

Voilà je l'ai mis sous forme de module : http://gege2061.homecomputing.fr/flag_solved.tar.gz (je vais voir pour le proposer sur drupal.org).

Une fois le module installé, il faut aller dans la liste des flags pour activer solved_node et solved_comment

Si tu utilise un lien de type javascript pour marquer les commentaires (ce qui est proposé par défaut), il faut le module Advanced forum pour que la réponse soit mise en avant (un beau fond vert, par défaut) sans rafraichir la page (sinon utilise un lien normal).

@Damien Tournoud Le hook flag_access n'est disponible qu'a partir de la version 2.0 du module flag, encore en beta. Par contre, merci pour le code de récupération des commentaires, c'est mieux que d'utiliser _comment_load.