[РЕШЕНО] Вывод таксономию с иерархией в Drupal 7 c помошью сниппета

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

Аватар пользователя ArmRus ArmRus 12 ноября 2012 в 17:00

Как то нужно было найти снипет с иерархичесским выводом, но ничего достойного не нашел. Везде используются ручная генерация списков, где делать изменения(например добавлять классы или другие аттрибуты к списку могут запутать Smile хотя распутаться очень легко. Вот недавно написал свой сниппет и решил поделиться, может кому пригодится.
-для заметки я в курсе что можно через views выводить - но в данном случае предпочитаю свой вариант, т.к. очень много ньюансов...

И так первым делом Генерируем массив для передачи в функцию темизации theme_item_list();

<?php
    $voc 
MY_VID#Здесь просто можете написать VID нужного словаря
    
$tree taxonomy_get_tree($voc01); #Получаем корневые термины словаря
    
$items['title'] = t('Catalog'); # Указываем заголовок списка
    
$items['type'] = 'ul'#отмечаем тип маркированного списка
    
$items['items'] = my_module_get_hierarchy($tree); #генерируем элементы
    
$list theme('item_list',$items);
?>

Осталось отрендерить и вывести.

А вот собственно код для генерации элементов(терминов)

<?php
function my_module_get_hierarchy($terms) {
    
$items = array();
    
$current 0;
    foreach (
$terms as $term) {
        
$items[$current]['data'] = l($term->name,  'taxonomy/term/' . ($term->tid));  
        
#Прописываем в список текущий элемент
        
if($childs taxonomy_get_children($term->tid)){  
            
$items[$current]['children'] = my_module_get_hierarchy($childs); 
            
#Проверяем если есть дочерные термины - рекурсивно заполняем их
        
}
        
$current++;
    }
    return 
$items;
}
?>

Можно добавлять классы и другие аттрибуты по желанию. ничто не запутано. Я так думаю)
К стати выводит ЛЮБУЮ вложенность терминов
Вопросы? Smile

Комментарии

Аватар пользователя ArmRus ArmRus 14 ноября 2012 в 14:50

"АлександрБолт" wrote:
можно пример посмотреть?

Что вы подразумеваете под словом пример? Вам написать список который получается?
Скажу сразу - получается ОБЫЧНЫЙ HTML список, который содержит дерево таксономии любой вложенности.

Аватар пользователя АлександрБолт АлександрБолт 15 ноября 2012 в 10:47

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

Аватар пользователя ArmRus ArmRus 15 ноября 2012 в 16:43

"АлександрБолт" wrote:
вывести меню состоящее из терминов таксономии на страницу, при том меню состоит из картинок терминов, для этой задачи ваш снипет подойдет?

Вам нужно вместо $term->name прописать вывод Картинки. А картинку вы можете получить с помощью field_view_filed
Т.е. в вашем случае должно получится что-то на подобие

<?php
function my_module_get_hierarchy($terms) {
    
$items = array();
    
$current 0;
    foreach (
$terms as $term) {
        
$image field_view_field('taxonomy',$term,'field_image');
        
$items[$current]['data'] = l($image,  'taxonomy/term/' . ($term->tid),array('html' => TRUE));  
        
#Прописываем в список текущий элемент
        
if($childs taxonomy_get_children($term->tid)){  
            
$items[$current]['children'] = my_module_get_hierarchy($childs); 
            
#Проверяем если есть дочерные термины - рекурсивно заполняем их
        
}
        
$current++;
    }
    return 
$items;
}
?>

Нет времени проверить код - попробуйте, должно сработать.
А чтобы вывести это почитайте как создать модуль(материалов больше чем необходимо).

для примера вывода страницы(допустим page callback = my_module_page)

<?php
function my_module_page(){
     
$voc MY_VID#Здесь просто можете написать VID нужного словаря
    
$tree taxonomy_get_tree($voc01); #Получаем корневые термины словаря
    
$items['title'] = t('Catalog'); # Указываем заголовок списка
    
$items['type'] = 'ul'#отмечаем тип маркированного списка
    
$items['items'] = my_module_get_hierarchy($tree); #генерируем элементы
    
$list theme('item_list',$items);
    return 
$list;
}
?>

и естественно функцию которая чуть выше тоже пишите в этот файл. Не забудьте указать vid словаря

Аватар пользователя Sadchenko Sadchenko 31 января 2013 в 1:04

Ниче не пойму, а что куда вставлять?
Вставляю первый код в template.php
а второй в page.tpl и не работает нифига. Что не так делаю?

Аватар пользователя ArmRus ArmRus 31 января 2013 в 10:43

"Sadchenko" wrote:
Ниче не пойму, а что куда вставлять?
Вставляю первый код в template.php
а второй в page.tpl и не работает нифига. Что не так делаю?

Во первых чтобы узнать что и куда писать, ПРОЧИТАЙТЕ хотябы названия функций(даже не все а начало имени my_module - примерно означает МОЙ_МОДУЛЬ).
Дальше по тексту:
после первого примера я написал

"xman0011" wrote:
А чтобы вывести это почитайте как создать модуль(материалов больше чем необходимо).

для примера вывода страницы(допустим page callback = my_module_page)

Этим я хотел сказать, что если не знаете что делать прочитайте как создать модуль.

Если вы хотите работать с дурпалом на программном уровне(незнаю как по-другому обозвать кодинг), то изучите для начало API просто копи-пастом правильный сайт не сделаете.