taxonomy_select_nodes + сортировка по количеству флагов в модуле Flag
Столкнулся с распространенной задачей — в drupal необходимо сделать выборку идентификаторов нод в определенном «термине» таксономии. Это сделать легко с помощью функции taxonomy_select_nodes. Однако, параллельно установлен модуль Flag, который позволяет пользователям ставить флаги (заносить в фавориты, поднимать рейтинг) для различных сущностей, в частности для нод. На сайте заказчика с помощью модуля Flag была сделана возможно повышать рейтинг для контента, а затем в некоторых категориях необходимо было выводить список этого контента, отсортированного по количеству флажков (уровню рейтинга). taxonomy_select_nodes предоставляет возможность сортировки только по ограниченному числу полей. Для решения задачи можно было воспользоваться модулем Views, отношениями (views) и тогда в сортировку можно было бы включать количество флажков у материала, но мне не удобно менять шаблоны для Views, поэтому решил модифицировать функцию taxonomy_select_nodes.
Просто добавляем в template.php в папке шаблона функцию:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | function taxonomy_select_nodes_flagged($tid, $pager = TRUE, $limit = FALSE, $order = array('t.sticky' => 'DESC', 'f.count' => 'DESC', 't.created' => 'DESC'), $fid = 1) { if (!variable_get('taxonomy_maintain_index_table', TRUE)) { return array(); } $query = db_select('taxonomy_index', 't'); $query->leftJoin('flag_counts', 'f', 'f.entity_type=\'node\' AND f.fid = ' . $fid . ' AND f.entity_id = t.nid'); $query->addTag('node_access'); $query->condition('tid', $tid); if ($pager) { $count_query = clone $query; $count_query->addExpression('COUNT(t.nid)'); $query = $query->extend('PagerDefault'); if ($limit !== FALSE) { $query = $query->limit($limit); } $query->setCountQuery($count_query); } else { if ($limit !== FALSE) { $query->range(0, $limit); } } $query->addField('t', 'nid'); $query->addField('t', 'tid'); foreach ($order as $field => $direction) { $query->orderBy($field, $direction); // ORDER BY fields need to be loaded too, assume they are in the form // table_alias.name list($table_alias, $name) = explode('.', $field); $query->addField($table_alias, $name); } return $query->execute()->fetchCol(); } |
В функции добавился параметр fid — идентификатор флага. И в параметры сортировки добавлена сортировка по количеству флажков у материала. В саму функцию добавлен join таблицы БД, где, собственно, и находятся данные по количеству флагов.