(drupal) код сложности, чтобы понять, получить то же название статьи под тем же термином - PullRequest
0 голосов
/ 23 ноября 2010
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);
}

}

код от друпальского гуру. , Раньше я получал название статьи под тем же термином в node.tpl.php, я исследовал его два дня, хотя знаю некоторую его часть. принцип кода я до сих пор не знаю. ожидаю, что кто-то может объяснить мне более подробно. Большое спасибо.

Ответы [ 2 ]

2 голосов
/ 23 ноября 2010

Короткая версия:

Это получает массив тегов узла, получает первые 10 узлов , которые используют хотя бы одиниз этих тегов и выводит ссылку для каждого из этих 10 результатов.


Подробная версия:

Прежде всего, переменная«$node» - это объект, который содержит данные о конкретном узле (например, узле Page или Story).Например, «$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 и выполнить преобразование в строку.

Цикл сохраняет фрагмент SQL-запроса для каждого тега в переменной $tids и сохраняет фактическое значение в переменной $args, поскольку вызовы базы данных Drupal безопаснее, когда аргументы передаются отдельно от SQL-запроса: "%d "означает" integer number ".


" db_query_range "- это функция, которая выбирает несколько строк в базе данных: здесь" 0 10 "означает" retrieve the first 10 results ".


"db_fetch_object" в цикле "while" извлекает каждый результат и сохраняет его в переменной "$o", которая является объектом.

Следовательно "$o->title "содержит значение столбца" title ", извлеченного запросом SQL.


Функция" l "- это функция drupal, которая создает код для ссылки HTML:первый аргумент - это имя ссылки, второй аргумент - путь drupal: в Drupal любой узел можетбыть доступным по умолчанию, используя "www.yoursite.com/node/NodeID", поэтому он дает путь "node/123" (где 123 - "Node ID").

Эта функция полезна, потому что она прозрачнообрабатывает пользовательские пути, поэтому, если у вашего узла есть пользовательский путь для доступа к нему с использованием «www.yoursite.com/my-great-page», он автоматически создаст ссылку на эту страницу вместо «www.yoursite.com/node/123».

1 голос
/ 23 ноября 2010

Я бы точно не назвал парня, который написал это гуру, вы могли бы сделать это намного красивее. В любом случае, что он делает, он создает запрос, который выглядит следующим образом:

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

Конечным результатом является то, что он выбирает все идентификаторы и заголовки узлов (только один раз), которые имеют хотя бы один термин с выбранным узлом, но не сам узел.

...