Mysql: Récupération d'un "tid" dans la table "term_node"

Catégories:

Bonjour,

Je vous explique déjà quesque j’aimerais faire :

J’ai ajouté un vocabulaire : Problème résolu avec comme termes : oui, non. Ce vocabulaire est affiché dans les noeuds de type «forum».

J’aimerais maintenant ajouter une colonne dans la liste des messages du forum : Résolu.

Pour commencer j’ai cherché le code qui ajoute le nom des colonnes pour le tri (Topic, Réponses, Created, Last reply)

Voiçi le code :

function forum_get_topics($tid, $sortby, $forum_per_page) {
  global $user, $forum_topic_list_header;

  $forum_topic_list_header = array(
    NULL,
    array('data' => t('Topic'), 'field' => 'n.title'),
    array('data' => t('Replies'), 'field' => 'l.comment_count'),
    array('data' => t('Created'), 'field' => 'n.created'),
    array('data' => t('Last reply'), 'field' => 'l.last_comment_timestamp'),
  );

  $order = _forum_get_topic_order($sortby);
  for ($i = 0; $i < count($forum_topic_list_header); $i++) {
    if ($forum_topic_list_header[$i]['field'] == $order['field']) {
      $forum_topic_list_header[$i]['sort'] = $order['sort'];
    }
  }

  $term = taxonomy_get_term($tid);

  $sql = db_rewrite_sql("SELECT n.nid, r.tid, n.title, n.type, n.sticky, u.name, u.uid, n.created AS timestamp, n.comment AS comment_mode, l.last_comment_timestamp, IF(l.last_comment_uid != 0, cu.name, l.last_comment_name) AS last_comment_name, l.last_comment_uid, l.comment_count AS num_comments, f.tid AS forum_tid FROM {node_comment_statistics} l INNER JOIN {node} n ON n.nid = l.nid INNER JOIN {users} cu ON l.last_comment_uid = cu.uid INNER JOIN {term_node} r ON n.vid = r.vid INNER JOIN {users} u ON n.uid = u.uid INNER JOIN {forum} f ON n.vid = f.vid WHERE n.status = 1 AND r.tid = %d");
  $sql .= tablesort_sql($forum_topic_list_header, 'n.sticky DESC,');
  $sql .= ', n.created DESC';  // Always add a secondary sort order so that the news forum topics are on top.

  $sql_count = db_rewrite_sql("SELECT COUNT(n.nid) FROM {node} n INNER JOIN {term_node} r ON n.vid = r.vid AND r.tid = %d WHERE n.status = 1");

  $result = pager_query($sql, $forum_per_page, 0, $sql_count, $tid);
  $topics = array();
  while ($topic = db_fetch_object($result)) {
    if ($user->uid) {
      // folder is new if topic is new or there are new comments since last visit
      if ($topic->tid != $tid) {
        $topic->new = 0;
      }
      else {
        $history = _forum_user_last_visit($topic->nid);
        $topic->new_replies = comment_num_new($topic->nid, $history);
        $topic->new = $topic->new_replies || ($topic->timestamp > $history);
      }
    }
    else {
      // Do not track "new replies" status for topics if the user is anonymous.
      $topic->new_replies = 0;
      $topic->new = 0;
    }

    if ($topic->num_comments > 0) {
      $last_reply = new stdClass();
      $last_reply->timestamp = $topic->last_comment_timestamp;
      $last_reply->name = $topic->last_comment_name;
      $last_reply->uid = $topic->last_comment_uid;
      $topic->last_reply = $last_reply;
    }
    $topics[] = $topic;
  }

  return $topics;
}

r.tid donne au final $topic->tid ?

Je suis aller voir dans la table (term_node pour le résultat par exemple du noeud 75.
Il y a deux lignes :
nid vid tid
75 1600 60
75 1600 89

$topic->tid me donne le résultat : 60

J’aimerais le résultat : 89

Le but final serait de rajouter la colonne Résolu.

  $forum_topic_list_header = array(
    NULL,
    array('data' => t('Topic'), 'field' => 'n.title'),
    array('data' => t('Resolu'), 'field' => 'r.tid'),//Ca devrait donner quelque chose du genre....
    array('data' => t('Replies'), 'field' => 'l.comment_count'),
    array('data' => t('Created'), 'field' => 'n.created'),
    array('data' => t('Last reply'), 'field' => 'l.last_comment_timestamp'),
  );

Voilà je ne sais pas si j’ai été très claire dans ma question. J’espère que vous pourrez m’aider car pour l’instant je nage complètement !

#

1/ J’imagine que si tu n’utilises pas CCK pour ton champs c’est que tu ne veux pas l’utiliser ?
2/ telle qu’est construite ta requête tu jointes sur tous les termes du noeud, tout vocabulaire confondu. Du coup si tu as deux taxonomies rattachée au type de contenu «forum», tu vas remonter une ligne avec le tid du 1ier vocabulaire, et une ligne pour le second (à cause de la jointure). Tu pourrais mieux t’en rendre compte en jointant en plus sur term_data td on td.tid=r.tid et en exposant le champs td.vid. Tu devrais logiquement obtenir un truc du genre

nid td.vid tid
75 X 60
75 Y 89

Yoran - arNuméral

#

Merci pour ta réponse,

Je n’ai pas bien compris pour ta solution. Si je sélectionne r.tid, td.tid lorsque je j’affiche $topic->tid il va m’afficher le quel ?? Vraiment désolé pour ma méconnaissance du sujet.

Pour l’utilisation de CCK, ça ne me fait rien, d’ailleur j’ai essayé de faire quelque chose qui marche plus ou moins.

J’ai ajouté un champs : Content taxonomy field

Voilà ce que j’ai rajouté juste après INNER JOIN {term_node} r ON n.vid = r.vid :

INNER JOIN {content_type_forum} re on r.nid = re.nid

Puis je rajoute dans la sélection re.field_essai_value

Ma variable $topic->field_essai_value à bien le tid de la taxomie de dans.

Le seul gros gros problème c’est que le forum ne m’affiche plus que les sujets où le champs essai a été remplis donc 1 seul pour le moment.

Il faudrait que je rajoute une condition je pense ?

Merci pour ton aide.

#

Sans offense, il faudrait que tu te documentes un peu sur SQL il me semble. Particulièrement sur les différents types de jointure et leurs impacts.

En effet, ma 1iere «solution» n’en est pas une, je cherchais juste à mettre en évidence le fait que tu ne peux pas, avec ta requête SQL arriver au résultat que tu désires dés qu’à ton type de contenu «forum» est rattaché plus d’1 vocabulaire et/ou plus d’1 terme de taxonomie. La jointure que tu poses va en effet provoquer la duplication de la même ligne de forum pour chaque terme.

De même, dans le cas de ton champ CCK, tu devrais utiliser un LEFT JOIN et pas un INNER JOIN car vu que tu as créé un certain nombre de type de contenu forum avant d’appliquer CCK, il y a un certain nombre de noeud qui n’ont pas de correspondance dans la table content_type_forum. Si tu appliques un INNER JOIN, tu vas très logiquement perdre ces lignes.

Enfin, pour CCK, je pense que tu devrais oublier le champ Content Taxonomy Fied et utiliser un simple champ «entier» avec un widget «case à cocher». Ce sera plus simple que de gérer une taxo. Tu auras un champ field_status_value avec 0 si c’est pas résolu et 1 dans le cas contraire. Si tu appliques un LEFT JOIN, tu auras donc NULL/0 => non résolu, et 1 => Résolu.

Yoran - arNuméral

#

Merci beaucoup pour ta réponse.

Désoler pour mon non professionnalisme…c’est vrais que c’est mieux de se renseigner sur le sujet avant de poster !

J’ai donc remplacé INNER JOIN par LEFT JOIN et par miracle ça marche super.

Pour le type de champs, c’est vrais que tu as raison, de la taxonomie n’aurait aucun sens. J’ai donc ajouté un champs de type entier mais avec comme option : case à cocher et pas case à coché unique car les sujets postés ne seront pas forcément des problèmes à résoudre.

Donc voilà ce que j’ai mis dans mon champs (pas obligatoire) :
Problème résolu :
1 -> Oui
2 -> Non

(si l’utilisateur ne sélectionne aucune case, le champs est vide)

Donc jusqu’à la aucun problème !

Maintenant j’aimerais que lorsque je trie dans un sens, ça m’affiche en premier : 1 (oui) et dans l’autre : 2 (non).

Pour le moment ça m’affiche 2 et les champs vide en premier. C’est logique bien sur mais ya t’il pas une solution pour cela ? J’ai bien essayer de regarder dans la doc cette foie mais il ne me semble pas que j’ai trouvé quelque chose pour ce cas là.

————[Edition]————

J’ai résolu le problème.

Dans mon champs de type entier j’ai rentré ces valeurs :
1 -> Non
2 -> -
3 -> Oui

Dans hook_nodeapi j’ai mis celà :

       case 'presave':
        if ($node->field_essai[0]['value'] == NULL) {
           $node->field_essai[0]['value'] = 2;
         }
       
         break;

Et dans node-forum-edit.tpl.php j’ai mis :

  $form['field_essai']['value']['']['#value'] = '';
  $form['field_essai']['value'][1]['#title'] = 'Non';
  $form['field_essai']['value'][3]['#title'] = 'Oui';

Pour que les messages aillant été postés avant :
(placé dans la boucle d’affichage…que provisoir) :

if ($topic->field_essai_value == NULL)
{
  $sql = "INSERT INTO content_type_forum (vid, nid, field_essai_value) VALUES ('" .$topic->vid ."', '" .$topic->nid ."', '2')" ;
  mysql_query($sql);
}

Maintenant ça marche comme je voulais. Merci beaucoup pour m’avoir aidé dans mon problème Yoran.

J’ai juste un dernière petite question : Lorsqu’il y aura des mises à jours pour le module forum, est-ce que le code rajouté ne va pas poser problème ?

Syndiquer le contenu