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 の第一人者からのものです。. node.tpl.php の同じ用語で記事のタイトルを取得するために使用されていましたが、その一部は知っていましたが、2 日間調査しました。コードの原理はまだわかりません。誰かが私のためにそれについての詳細を説明できることを期待してください.多くの感謝.

4

2 に答える 2

2

短縮版:

ノードのタグの配列を取得し、これらのタグの少なくとも 1 つを使用する最初の 10 個のノードを取得し、これらの 10 個の結果それぞれのリンクを出力します。


詳細版:

まず、変数 " $node" は、特定のノード (ページ ノードやストーリー ノードなど) に関するデータを含むオブジェクトです。たとえば、" $node->title" はそのノードのタイトルになります。


" $node->taxonomy" テストは、ノードがタグ付けされていることです (タグがない場合、同じタグを使用して他のノードを取得できないためです)。そのノード/ページ/ストーリーに関連付けられた 1 つまたは複数のタグがある場合$node->taxonomyarray.


SQL クエリについて: " node" は、すべてのノードのベース フィールド (非 CCK) を格納するデータベース テーブルです。" term_node" は、タグ (" " と呼ばれるtaxonomy term) とノードの組み合わせを含むデータベース テーブルです。


両方の表で、" nid" は " unique Node ID" (内部で自動インクリメントされた数値) です。この列は両方のテーブルにあるため、このようにテーブルが結合されます。

" term_node" の " tid" は " unique Term ID" です (これは内部で自動インクリメントされた数値でもあります)。


" node" テーブルは別名 " n" であるため、" n.nid" は " " を意味しthe Node ID stored in table nodeます。" term_node" テーブルは別名 " t" であるため、" t.tid" は " " を意味しthe Term ID stored in table term_nodeます。


" foreach" ループはタグの配列を通過し、ノードが使用する各タグのTermIDを抽出して SQL クエリに追加し、implode は文字列に変換します。

ループは、各タグの SQL クエリの一部を変数$tidsに格納し、実際の値を変数に格納します$args。引数が SQL クエリとは別に渡されると、Drupal データベース呼び出しがより安全になるためです。" %d" は " " を意味しますinteger number


" db_query_range" は、データベース内の複数の行を選択する関数です。ここで、" 0 10" は " " を意味しretrieve the first 10 resultsます。


" " ループdb_fetch_object内の " " は、while各結果を取得し$o、オブジェクトである変数 " " に格納します。

したがって、" " には、SQL クエリによって取得された$o->title列 " " の値が含まれます。title


関数 " l" は、HTML リンクのコードを作成する drupal 関数です。最初の引数はリンクの名前で、2 番目の引数は drupal パスです: Drupal では、" www.yoursite.com/node/NodeID"を使用してデフォルトで任意のノードにアクセスできます。これがパス " " を与える理由です(" "はnode/123どこにありますか)。123Node ID

この関数はカスタム パスを透過的に処理するので便利です。そのため、ノードに " " を使用してアクセスするためのカスタム パスがある場合、" www.yoursite.com/my-great-page" の代わりにそのページへのリンクがwww.yoursite.com/node/123自動的に作成されます。

于 2010-11-23T09:40:23.067 に答える
1

私はこれを書いた人を正確に教祖とは呼びません、あなたはこれをもっときれいに行うことができます。とにかく、彼が行うことは、次のようなクエリを作成します。

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

最終的に、彼は、選択したノードと少なくとも1つの用語を共有するが、ノード自体ではないすべてのノードIDとタイトルを(1回だけ)選択します。

于 2010-11-23T09:34:44.513 に答える