2010-11-23 24 views
0
if ($node->taxonomy) { 
$query = 'SELECT DISTINCT(t.nid), n.nid, n.title FROM {node} n INNER JOIN {term_node} t ON n.nid = t.nid WHERE n.nid != %d AND ('; 


$args = array($node->nid); 
    $tids = array(); 

    foreach ($node->taxonomy as $term) { 
    $tids[] = 't.tid = %d'; 
    $args[] = $term->tid; 
} 

    $query .= implode(' OR ', $tids) . ')'; 

$result = db_query_range($query, $args, 0, 10); 
while ($o = db_fetch_object($result)) { 
echo l($o->title, 'node/' . $o->nid); 
} 

}(drupal) un code de difficulté à comprendre, obtenir le même titre de l'article sous le même terme

le code est d'un gourou drupal. . utilisé pour obtenir le titre de l'article sous le même terme dans node.tpl.php, je l'ai étudié deux jours, même si j'en connais une partie. le principe du code je ne sais toujours pas. attendre quelqu'un peut expliquer plus de détails à ce sujet pour moi .merci merci.

Répondre

2

Version courte:

Il obtient le tableau de balises du nœud, récupère les 10 premiers noeuds qui utilisent au moins un de ces balises et délivre un lien pour chaque de ces 10 résultats


Version détaillée:

Tout d'abord, la variable "$node" est un objet qui contient les données relatives à un noeud spécifique (par exemple une page ou un noeud Story). Par exemple, "$node->title" serait le titre de ce nœud.


tests « $node->taxonomy » est ce nœud est marqué (parce que si elle n'a pas de balise, il ne peut pas récupérer les autres noeuds en utilisant la même. Étiquette (s) Quand il y a une ou plusieurs étiquettes associées à ce noeud/page/histoire, $node->taxonomy est un array


maintenant au sujet de la requête SQL. "node" est la table de base de données qui stocke les champs de base (non CCK) de chaque noeud "term_node" est. la table de base de données t hat contient la combinaison de tag (appelée "taxonomy term") et le noeud.


Dans les deux tableaux, "nid" est le "unique Node ID" (qui est un nombre auto-incrémentée interne). Parce que cette colonne est dans les deux tables, voici comment les tables sont jointes ensemble.

Dans "term_node", "tid" est le "unique Term ID" (qui est également un nombre auto-incrémentée interne).


Le "node" table est aliasé "n", donc "n.nid" signifie "the Node ID stored in table node". La table "term_node" s'appelle "t", par conséquent "t.tid" signifie "the Term ID stored in table term_node".


La boucle « foreach » passe à travers le tableau de balises pour extraire le Termid de chaque étiquette utilisée par le noeud afin de l'ajouter dans la requête SQL et imploser convertit en une chaîne.

La boucle stocke un morceau de requête SQL pour chaque balise dans la variable $tids et stocke la valeur réelle dans la variable $args parce que les appels de base de données Drupal sont plus sûrs lorsque les arguments sont passés séparément de la requête SQL: « %d » signifie « integer number » .


"db_query_range" est une fonction qui sélectionne plusieurs lignes dans la base de données: ici, "0 10" signifie "retrieve the first 10 results".

dans la boucle « while »

« db_fetch_object » récupère chaque résultat et le stocke dans la variable « $o », qui est un objet.

Par conséquent "$o->title" contient la valeur de la colonne "title" récupérée par la requête SQL.


La fonction « l » est le functin drupal qui crée le code pour un lien HTML: le premier argument est le nom de la liaison, le second argument est le chemin drupal: dans Drupal, tout noeud peut être consulté par défaut en utilisant "www.yoursite.com/node/NodeID", ce qui explique pourquoi il donne le chemin "node/123" (où 123 est le "Node ID"). Cette fonction est utile car elle gère de manière transparente les chemins personnalisés. Si votre noeud dispose d'un chemin personnalisé pour y accéder à l'aide de "www.yoursite.com/my-great-page", il créera automatiquement un lien vers cette page au lieu de "www.yoursite.com/node/123".

+0

vous êtes mon héros. Merci beaucoup. mais il y a des parties que je ne peux pas bien suivre. "n" term_node "," tid "est l '" ID de terme unique "(qui est également un numéro interne auto-incrémenté)." J'ai regardé la table "term_node", il y a les mêmes lignes avec le même tid. – runeveryday

+0

pourquoi je devrais faire ces deux lignes "$ args = array ($ node-> nid); $ tids = array();" – runeveryday

+0

dans la boucle de foreach, où est le terme de $, comment je sais que c'est un objet. – runeveryday

1

Je n'appellerais pas exactement le type qui a écrit ceci un gourou, vous pourriez faire ceci beaucoup plus joli. Quoi qu'il en soit ce qu'il fait, il crée une requête qui ressemble à ceci:

SELECT DISTINCT(t.nid), n.nid, n.title FROM {node} n 
INNER JOIN {term_node} t ON n.nid = t.nid 
WHERE n.nid != %d 
AND (t.tid = %d OR t.tid = %d OR ... t.tid = %d); 

Le résultat final est qu'il sélectionne tous les nœuds ids et titres (une seule fois) qui partagent au moins un terme au nœud sélectionné, mais ISN 't le noeud lui-même.

+0

merci, vous êtes aussi un gourou. mais ta réponse est trop abstraite. je ne peux pas bien le suivre. Je ne sais pas comment cette ligne "(t.tid =% d OU t.tid =% d OR ... t.tid =% d);" de. – runeveryday