2010-11-23 17 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の)難易度のコードは、理解し、同じ用語

コードがdrupalの第一人者からである下同じ記事のタイトルを取得します。 。 node.tpl.phpの同じ用語の下で記事のタイトルを取得するために使用されていますが、私は2日間それを研究しましたが、その一部を知っています。コードの原則はまだ分かりません。誰かが私のためにそれについての詳細を説明することができると期待しています。

答えて

2

ショートバージョン:

は、これらのタグのうちの少なくとも一つを使用し、最初の10個のノードを取得し、、これらの各のリンクを出力し、タグノードのの配列を取得し10件の結果


詳細バージョン:全ての

まず、変数「$node」は、特定のノード(例えば、ページ又はストーリーノード)についてのデータを含むオブジェクトです。 たとえば、「$node->title」はそのノードのタイトルになります。それはタグを持っていない場合、それが同じタグ(複数可)を使用して、他のノードを取得できないため


$node->taxonomy」試験は(ノードがタグ付けされることである。 そのノードに関連付けられた1個のまたは複数のタグが存在する場合/ページ/物語、$node->taxonomyarrayあるSQLクエリについて今


:。 「nodeは」すべてのノードのベース・フィールド(非CCK)を格納するデータベース表です 「term_node」があります。データベーステーブルt hatには、タグ(「taxonomy term」と呼ばれる)とノードの組み合わせが含まれます。両方のテーブルに


、 "nid" は(内部オートインクリメント数) "unique Node ID" です。この列は両方のテーブルにあるため、これはテーブルの結合方法です。

term_node」には、「tid」が「unique Term ID」(これは内部自動インクリメント番号でもあります)です。


"node" テーブル "はnを" エイリアスさを、従って "n.nid" 手段 "the Node ID stored in table node"。 ""テーブルのエイリアスは "t"なので、 "t.tid"は "the Term ID stored in table term_node"を意味します。


foreach」ループは、SQLクエリにそれを追加し、文字列に変換を内破するためにノードによって使用される各タグの管理用語識別子(TermID)を抽出するために、タグの配列を通して進みます。

ループ変数$tidsに各タグのSQLクエリの一部を格納し、引数はSQLクエリは別に渡される場合Drupalのデータベースコールが安全であるため、可変$argsの実際の値を格納する「%d」が「integer number」を意味。 「db_query_range


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


while」ループにおける「db_fetch_object」が目的である、それぞれの結果を取得し、変数に格納する「$o」。

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


機能「l」はHTMLリンクのコードを作成するDrupalのfunctinである:最初の引数は、リンクの名前であり、二番目の引数は、Drupalのパスである:Drupalの中に、任意のノードとすることができます「www.yoursite.com/node/NodeID」、 を使用してデフォルトでアクセスされるため、パス「node/123」(123は「Node ID」)になります。

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

+0

あなたは私のヒーローです。とても感謝しています。しかし、私はうまくいくことができない部分があります。 "n" term_node "、" tid "は"一意のTerm ID "(内部自動拡張番号でもあります)です。 テーブル "term_node"を見ましたが、同じtidを持つ同じ行があります。 – runeveryday

+0

なぜ私はこれら2つの行を "$ args = array($ node-> nid); $ tids = array();" foreachループ内の – runeveryday

+0

は、どこから$ termであるか、どのようにオブジェクトであるかを知っています。 – runeveryday

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

最終結果は、彼がすべてのノードIDとタイトルを選択していることである(一度だけ)を共有選択したノードを有する少なくとも一つの用語を、しかしISNノードそのもの。

+0

ありがとうございました。また、あなたは指導者です。あなたの答えはあまりにも抽象的です。私はよくそれに従うことができません。私はこの行 "(t.tid =%d OR t.tid =%d OR ... t.tid =%d);"から。 – runeveryday

関連する問題