(drupal)一个难理解的代码,获得相同的文章';在同一条件下的所有权
}(drupal)一个难理解的代码,获得相同的文章';在同一条件下的所有权,drupal,module,term,Drupal,Module,Term,} 代码来自drupal大师。我曾经在node.tpl.php中以相同的术语获得文章标题,我已经研究了两天,虽然我知道其中的一些内容。代码的原理我还不知道。希望有人能为我解释更多细节。非常感谢。我不会确切地说写这篇文章的人是大师,你可以做得漂亮得多。总之,他所做的是创建一个如下所示的查询: if ($node->taxonomy) { $query = 'SELECT DISTINCT(t.nid), n.nid, n.title FROM {node} n INNER JOIN {te
代码来自drupal大师。我曾经在node.tpl.php中以相同的术语获得文章标题,我已经研究了两天,虽然我知道其中的一些内容。代码的原理我还不知道。希望有人能为我解释更多细节。非常感谢。我不会确切地说写这篇文章的人是大师,你可以做得漂亮得多。总之,他所做的是创建一个如下所示的查询:
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);
}
最终结果是,他选择了所有节点ID和标题(仅一次),这些节点ID和标题至少与所选节点共享一个术语,但不是节点本身。我不会确切地称写这篇文章的人为大师,你可以做得更好。总之,他所做的是创建一个如下所示的查询:
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);
}
最终结果是,他选择了与所选节点至少共享一个术语的所有节点ID和标题(仅一次),但不是节点本身。简短版本: 它获取节点的标记数组,检索至少使用其中一个标记的前10个节点,并为这10个结果中的每个结果输出链接
详细版本: 首先,变量“
$node
”是包含特定节点(例如页面或故事节点)数据的对象。
例如,“$node->title
”将是该节点的标题
“
$node->taxonomy
”测试节点是否被标记(因为如果它没有标记,则无法使用相同的标记检索其他节点)。
当有一个或多个标记与该节点/页面/故事关联时,$node->taxonomy
是一个数组
现在,关于SQL查询: “
node
”是存储每个节点的基本字段(非CCK)的数据库表。
“term\u node
”是包含标记(称为“taxonomy term
”)和节点组合的数据库表
在这两个表中,“
nid
”是“unique Node ID
”(这是一个内部自动递增的数字)。由于此列在两个表中,因此这是将表连接在一起的方式
在“term\u node
”中,“tid
”是“唯一术语ID
”(也是一个内部自动递增的数字)
“
节点
”表的别名为“n
”,因此“n.nid
”表示“存储在表节点
中的节点ID”。
“term\u node
”表别名为“t
”,因此“t.tid
”表示“表term\u node
中存储的术语ID”
“
foreach
”循环遍历标记数组,提取节点使用的每个标记的TermID,以便将其添加到SQL查询中,并将内爆转换为字符串
循环在变量$tids
中存储每个标记的SQL查询,并在变量$args
中存储实际值,因为当参数与SQL查询分开传递时,Drupal数据库调用更安全:“%d
”表示“整数
”
“
db\u query\u range
”是一个在数据库中选择多行的函数:这里,“0 10
”表示“检索前10个结果”
“while
”循环中的“db\u fetch\u object
”检索每个结果并将其存储在变量“$o
”中,该变量是一个对象
因此“$o->title
”包含SQL查询检索到的“title
”列的值
函数“l
”是为HTML链接创建代码的drupal函数:第一个参数是链接的名称,第二个参数是drupal路径:在drupal中,默认情况下可以使用“www.yoursite.com/node/NodeID
”访问任何节点,
这就是为什么它给出路径“node/123
”(其中123
是“节点ID
”)
此函数非常有用,因为它可以透明地处理自定义路径,因此如果您的节点有一个自定义路径来访问它,请改用“www.yoursite.com/my great page
”,它将自动创建指向该页面的链接,而不是“www.yoursite.com/node/123
”。简短版本:
它获取节点的标记数组,检索至少使用其中一个标记的前10个节点,并为这10个结果中的每个结果输出链接
详细版本:
首先,变量“$node
”是包含特定节点(例如页面或故事节点)数据的对象。
例如,“$node->title
”将是该节点的标题
“$node->taxonomy
”测试节点是否被标记(因为如果它没有标记,则无法使用相同的标记检索其他节点)。
当有一个或多个标记与该节点/页面/故事关联时,$node->taxonomy
是一个数组
现在,关于SQL查询:
“node
”是存储每个节点的基本字段(非CCK)的数据库表。
“term\u node
”是包含标记(称为“taxonomy term
”)和节点组合的数据库表
在这两个表中,“nid
”是“unique Node ID
”(这是一个内部自动递增的数字)。由于此列在两个表中,因此这是将表连接在一起的方式
在“term\u node
”中,“tid
”是“唯一术语ID
”(也是一个内部自动递增的数字)
“node
”表的别名为“n
”,因此“n.nid
”表示“表节点中存储的节点ID”<