Парочка самописных функций, которые могут оказаться полезными.

Главные вкладки

Аватар пользователя Ромка Ромка 24 апреля 2007 в 21:43

Выкладываю несколько самописных функций, возможно кому-то они смогут оказаться полезными. Если вдруг выяснится, что в Друпале уже есть такие функции, просьба ткнуть меня в них носом.

1. Подсчет количества материалов определенного типа, которым присвоен определенный термин таксономии:
<?php
function count_nodes($tid, $type = '%')
{
$my_r = db_query("SELECT COUNT(*) AS count FROM {term_node} n INNER JOIN {node} nn ON n.nid = nn.nid WHERE n.tid = '" . $tid . "' AND nn.type LIKE '" . $type . "'");
$my_obj = db_fetch_object($my_r);
return $my_obj->count;
}
?>
Первый параметр – tid термина, ноды для которого считаем, второй – тип ноды, если не указан, то ведется подсчет материалов всех типов.

2. Подсчет количества материалов определенного типа, которым присвоно два темина из таксономии:
<?php
function count_nodes2($t1, $t2, $type = '%')
{
$c = 0;
$my_r = db_query("SELECT nid FROM {term_node} n WHERE n.tid = '" . $t1 . "'");
while($my_obj = db_fetch_object($my_r))
{
$my_r2 = db_query("SELECT COUNT(*) AS count FROM {term_node} n INNER JOIN {node} nn ON n.nid = nn.nid WHERE n.nid = '" . $my_obj->nid . "' AND n.tid = '" . $t2 . "' AND nn.type LIKE '" . $type . "'");
$my_obj2 = db_fetch_object($my_r2);
if($my_obj2->count >= 1)$c++;
}
return $c;
}
?>
При желании, совсем не сложно заменить обе функции одной, которая в качестве первого аргумента будет принимать не tid ноды, а массив тидов, тогда можно будет проверять принадлежность ноды сразу n терминам, где n->oo, но пока не было такой задачи, потому и заморачиваться не стал.

3. Функция считает количество статей в выбранном разделе и всех подразделах (то есть принадлежащих термину и всем дочерним терминам таксономии):
<?php
function count_children_nodes($tid, $type = '%')
{
$my_obj = db_fetch_object(db_query("SELECT vid FROM {term_data} WHERE tid = '" . $tid . "' LIMIT 1"));
$vid = $my_obj->vid;

$my_counter = 0;
$my_childrens = taxonomy_get_tree($vid, $tid);
foreach($my_childrens as $apoj)
{
$my_r2 = db_query("SELECT COUNT(*) AS count FROM {term_node} t INNER JOIN {node} n ON n.nid = t.nid WHERE t.tid = '" . $apoj->tid . "' AND n.type LIKE '" . $type . "'");
$my_obj2 = db_fetch_object($my_r2);
$my_counter += $my_obj2->count;
}

return $my_counter;
}
?>

4. Функция выводит дерево терминов выбранного словаря:
<?php
function build_tree($vid, $tid ='-1')
{
$content = "";
if($tid == '-1')$tree = taxonomy_get_tree($vid);
else $tree = taxonomy_get_tree($vid, $tid);
foreach ($tree as $term)
{
$dash = "";
for($i = 1; $i <= $term->depth; $i++)$dash.="-";
$count = count_nodes($term->tid);
$count_all = count_children_nodes($term->tid);
$content .= $dash . "tid . " target=_top>" . $term->name . " (" . $count_all . ")\n
";
}
return $content;
}
?>

Комментарии

Аватар пользователя ultraboy@drupal.org ultraboy@drupal.org 25 апреля 2007 в 9:38

Пара комментариев, с Вашего позволения:

1. Запросы вида

<?php
db_query("SELECT vid FROM {term_data} WHERE tid = '" . $tid . "' LIMIT 1");
?>

потенциально подвергают сайт опасности взлома через SQL Injection. В Drupal принято писать так:

<?php
db_query("SELECT vid FROM {term_data} WHERE tid = %d LIMIT 1", $tid);
?>

Кроме того, я убрал одинарные кавычки, они не нужны для числового параметра.

2. В английском языке нет слова Childrens. Children это уже множественное число от Child.

Smile

Аватар пользователя Ромка Ромка 25 апреля 2007 в 9:53

Smile
Спасибо.

потенциально подвергают сайт опасности взлома через SQL Injection.
Теоретически, эти функции должны использоваться внутри модуля и обычным юзверям к ним доступ не получить...

Кстати, вопрос, с которым никак не могу разобраться. Каким образом Друпал связывает "%d" с переменной $tid? А если у меня несколько переменных, то как их обзывать в запросе?

Аватар пользователя romsk1983 romsk1983 24 марта 2010 в 19:13

Уважаемый Ромка! А не могли бы вы для тех, кто в танке кое-что пояснить? Как воспользоваться вот этим кодом:

<?php
function count_nodes($tid$type '%')
{
    
$my_r db_query("SELECT COUNT(*) AS count FROM {term_node} n INNER JOIN {node} nn ON n.nid = nn.nid WHERE n.tid = '" $tid "' AND nn.type LIKE '" $type "'");
    
$my_obj db_fetch_object($my_r);        
    return 
$my_obj->count;
}
?>

Куда конкретно вставить номер термина и тип документа? А то чего-то не получается с ним.

Спасибо за внимание.