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

Прислано: Ромка

вт, 24/04/2007 - 17: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 "<a href=" base_path() . "LINK_TO_VIEW/" $term->tid " target=_top>" $term->name "</a> (" $count_all ")\n<br>";
    }
    return 
$content;
}
?>

Комментарии


Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Применить"
Опубликовано ultraboy@drupal.org в ср, 25/04/2007 - 05: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.

=)


Опубликовано Ромка в ср, 25/04/2007 - 05:53.

:)
Спасибо.

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

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


Опубликовано ultraboy@drupal.org в ср, 25/04/2007 - 06:03.

Просто подставляет в порядке очередности.

Я не могу сказать лучше чем документация. Есть хорошие объяснения где-то на д.о.


Опубликовано kiev1 в ср, 25/04/2007 - 06:38.

Спасибо!


Опубликовано flecus в ср, 25/04/2007 - 14:47.

Вроде все эти функции реализованы в Taxonomy DHTML


Опубликовано KCEOH в ср, 25/04/2007 - 16:04.

Ромка, глянь доку по C. Функция printf, и sprintf. Там все и описано.


Опубликовано Valeratal в чт, 13/09/2007 - 07:04.

спасибо


Опубликовано romsk1983 в ср, 24/03/2010 - 16: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;
}
?>

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

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


Опубликовано B.I.S. в сб, 13/11/2010 - 18:16.

Может вот это поможет:

http://php.su/functions/custom/?1


Опубликовано xman0011 в вт, 21/02/2012 - 07:34.

http://api.drupal.ru/api/function/taxonomy_term_count_nodes/6


Новое на сайте

Ссылки партнёров