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中获得相同术语的文章标题,我已经研究了两天,虽然知道它的一部分。代码的原理我还是不知道。希望有人可以为我解释更多细节。非常感谢。

4

2 回答 2

2

简洁版本:

它获取节点的标签数组,检索至少使用其中一个标签的前 10 个节点,并为这 10 个结果中的每一个输出一个链接。


详细版本:

首先,变量“ $node”是一个包含特定节点(例如,页面或故事节点)的数据的对象。例如,“ $node->title”将是该节点的标题。


" $node->taxonomy" 测试该节点是否被标记(因为如果它没有标签,则无法使用相同的标签检索其他节点。当有一个或多个标签与该节点/页面/故事相关联时,$node->taxonomy是一个array.


现在关于 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 functin:第一个参数是链接的名称,第二个参数是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);

最终结果是他选择了所有与所选节点共享至少一个术语但不是节点本身的节点 ID 和标题(仅一次)。

于 2010-11-23T09:34:44.513 回答