2010-11-23 2 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) eine Schwierigkeit Code zu verstehen, den gleichen Artikel Titel unter dem gleichen Begriff

der Code von einem Drupal-Guru bekommen. . verwendet, um den Titel des Artikels unter dem gleichen Begriff in node.tpl.php zu bekommen, ich habe es zwei Tage recherchiert, obwohl ich einen Teil davon kenne. das prinzip des codes weiß ich noch nicht. erwarte jemand kann mehr Details darüber für mich erklären. Vielen Dank.

Antwort

2

Kurzversion:

Es erhält das Array von Tags des Knotens, ruft die ersten 10 Knoten, die mindestens eines dieses Tags und gibt einen Link für jeden davon 10 Ergebnisse.


Ausführlichere:

Zu allererst wird die Variable "$node" ist ein Objekt, das die Daten zu einem bestimmten Knoten enthält (z.B. eine Seite oder Geschichte node). Zum Beispiel wäre "$node->title" der Titel dieses Knotens.


$node->taxonomy“ Tests ist, dass der Knoten markiert ist (denn wenn es keine Tags hat, kann es nicht die anderen Knoten rufen Sie die gleichen Tag (en) aufnehmen. Wenn ein oder mehrere Tags dort mit diesem Knoten verbunden ist,/page/Geschichte, ist $node->taxonomy ein array


Jetzt über die SQL-Abfrage. "node" ist die Datenbanktabelle, die die Basisfelder (nicht-CCK) jedes Knotens speichert "term_node" ist. die Datenbanktabelle t Hat enthält die Kombination aus Tag (taxonomy term) und Knoten.


In beiden Tabellen "nid" ist die "unique Node ID" (das eine interne autoincrement Zahl ist). Da diese Spalte in beiden Tabellen enthalten ist, werden die Tabellen so miteinander verbunden.

In "term_node", "tid" ist die "unique Term ID" (die auch eine interne autoincrement Zahl ist).


Die "node" table "n" aliased ist daher "n.nid" bedeutet "the Node ID stored in table node". Die Tabelle "term_node" hat den Alias ​​"t", daher bedeutet "t.tid" "the Term ID stored in table term_node".


Die „foreach“ Schleife geht durch das Array von Tags die TERMID jedes Etiketts durch den Knoten, um es in der SQL-Abfrage hinzuzufügen verwendet zu extrahieren und implodieren wandelt in einen String.

Die Schleife speichert ein Stück SQL-Abfrage für jede Variable in Variable $tids und speichert der aktuelle Wert in Variable $args da Drupal Datenbank Anrufe sind sicherer, wenn die Argumente getrennt von der SQL-Abfrage übergeben werden: „%d“ bedeutet „integer number“ .


"db_query_range" ist eine Funktion, die mehrere Zeilen in der Datenbank auswählt: hier "0 10" bedeutet "retrieve the first 10 results".


"db_fetch_object" in der "while" Schleife ruft jedes Ergebnis und speichert ihn in der Variable "$o", die ein Objekt ist.

Daher enthält "$o->title" den Wert der Spalte "title", die von der SQL-Abfrage abgerufen wird.


Die Funktion „l“ ist die drupal functin, die den Code für einen HTML-Link erzeugt: Das erste Argument der Name der Verbindung ist, ist das zweite Argument der Drupal Pfad: in Drupal, kann jeder Knoten sein Standardmäßig wird mit "www.yoursite.com/node/NodeID", zugegriffen, deshalb gibt es den Pfad "node/123" (wobei 123 der "Node ID" ist).

Diese Funktion ist nützlich, weil es transparent benutzerdefinierte Pfade behandelt, so dass, wenn Ihr Knoten einen benutzerdefinierten Pfad hat es den Zugriff auf „www.yoursite.com/my-great-page“ statt verwenden, wird es einen Link zu dieser Seite anstelle von „www.yoursite.com/node/123“ automatisch zu erstellen.

+0

du bist mein Held. vielen, vielen Dank. aber es gibt einige Teile, denen ich nicht gut folgen kann. "n" term_node "," tid "ist die" eindeutige Term ID "(die auch eine interne autoincrementierte Nummer ist)." Ich habe mir die Tabelle "term_node" angesehen, da sind die gleichen Zeilen mit der gleichen tid. – runeveryday

+0

Warum sollte ich diese zwei Zeilen machen? $ Args = array ($ node-> nid); $ tids = array(); " – runeveryday

+0

in foreach Schleife, wo ist der $ Begriff aus, wie ich weiß, dass es ein Objekt ist. – runeveryday

1

Ich würde den Kerl, der das hier geschrieben hat, nicht wirklich Guru nennen, du könntest das viel hübscher machen. Auch immer, was er tut es eine Abfrage erstellen, die wie folgt aussieht:

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); 

Das Endergebnis ist, dass er alle Knoten-IDs und Titel auswählt (nur einmal), dass die Aktie mindestens ein Semester lang mit dem ausgewählten Knoten, aber isn ist der Knoten selbst.

+0

danke, du bist auch ein Guru. aber deine Antwort ist zu abstrakt. Ich kann es nicht gut verfolgen. Ich weiß nicht, wie diese Linie "(t.tid =% d OR t.tid =% d OR ... t.tid =% d);" von. – runeveryday