Для создания каталога нам потребуются модули: Views, Taxonomy Redirect, Pathauto.
Так как все термины таксономии имеют одинаковые пути taxonomy/term/%
, нельзя задать им разные отображения. К счастью в модуле taxonomy есть замечательный хук hook_taxonomy_term_path
, с его помощью можно изменить эти пути. Люди разбирающиеся в программировании и умеющие читать документацию сделают это быстро. Но мы пойдем по легкому пути и используем модуль Taxonomy Redirect.
Шаг 1. Настройка Taxonomy Redirect
- Настройки модуля находятся по адресу
admin/build/taxonomy_redirect
- Выбираем нужный словарь, Path: catalog/!tid, сохраняем.
Шаг 2. Настойка Views
Настройка views.
- Создаем новое представление View name: Каталог, View type: Node.
- Добавляем отображение типа page.
- Basic settings:
- Name: Страница каталога
- Use pager: Yes
- Header:
Жмем кнопку Override,
вставляем данный код, формат ввода: PHP code<?php
$vid = 1; // id словаря
$arg_pos = 1; // номер позиции аргумента, в нашем случает 1
$cols = 3; // кол-во столбцов для отображения
$show_count = TRUE; // показывать или нет кол-во нод в терминах.if (is_numeric(arg($arg_pos))) {
$tid = arg($arg_pos);
$terms = taxonomy_get_children($tid, $vid);
if (!empty($terms)) {
$output = '<table class="catalog-page">';
$count = 0;
$total = count($terms);
foreach ($terms as $tid => $term) {
if ($count % $cols == 0) {
$output .= '<tr>';
}
$item = l($term->name, taxonomy_term_path($term));
if ($show_count) {
$count_nodes = taxonomy_term_count_nodes($term->tid);
$item .= ($count_nodes) ? " ($count_nodes)" : " (0)";
}
$count++;
$output .= '<td>'. $item .'</td>';
if ($count % $cols == 0 || $count == $total) {
$output .= '</tr>';
}
}
$output .= '</table>';
return $output;
}
}
?>
ставим галочку Display even if view has no result
- Page settings:
- Path: catalog/%
- Arguments:
Жмем кнопку Override- Добавляем аргумент Taxonomy: Term ID (with depth) и настраиваем его:
- Title: %1
- Breadcrumb: Каталог
- Validator options:
- Validator: Taxonomy term
- Vocabularies: выбираем наш словарь
- Argument type: Term ID
- Depth: 2
- Ставим галочку Set the breadcrumb for the term parents
- Добавляем аргумент Taxonomy: Term ID (with depth) и настраиваем его:
- Basic settings:
- Добавляем отображение типа page.
- Basic settings:
- Name: Корень каталога
- Title: Каталог
- Empty text:
Жмем кнопку Override,
вставляем данный код, формат ввода: PHP code<?php
$vid = 1; // id словаря
$cols = 3; // кол-во столбцов для отображения
$limit = 3; // кол-во выводимых дочерных терминов$tree = taxonomy_get_tree($vid, 0, -1, 1);
if (!empty($tree)) {
$output = '<table class="catalog-root">';
$count = 0;
$total = count($tree);
foreach ($tree as $tid => $term) {
if ($count % $cols == 0) {
$output .= '<tr>';
}
$item = '<h2>'. l($term->name, taxonomy_term_path($term)) .'</h2>';
$children_list = array();
$children = taxonomy_get_children($term->tid, $vid);
$i = 1;
foreach (taxonomy_get_children($term->tid, $vid) as $child) {
$children_list[] = l($child->name, taxonomy_term_path($child));
if ($limit != 0 && $i >= $limit) break;
$i++;
}
if (count($children) > $limit) {
$children_list[] = l('...', taxonomy_term_path($term));
}
$count++;
$item .= implode(' / ', $children_list);
$output .= '<td>'. $item .'</td>';
if ($count % $cols == 0 || $count == $total) {
$output .= '</tr>';
}
}
$output .= '</table>';
return $output;
}
?>
- Page settings:
- Path: catalog/all
- Arguments:
Жмем кнопку Override- Добавляем аргумент Global: Null и настраиваем его:
- Action to take if argument is not present: Display empty text
- Добавляем аргумент Global: Null и настраиваем его:
- Basic settings:
Теперь ваш каталог находится по адресу www.site.ru/catalog/all
Шаг 3. Настойка Pathauto
- Добавляем алиас вручную для корня каталога.
catalog/all
теперь будет простоcatalog
- Шаблон для терминов нашего словаря будет
catalog/[catpath-raw]
. - Неприятная новость для тех у кого словарь таксономии уже был заполнен терминами: только новые термины получат автоматический алиас. Но это решается небольшим php-кодом
$vid = 1; // заменить на id словаря таксономии
$path = 'catalog/'; // путь, тот что указывали в taxonomy_redirect (catalog/!tid), но без !tid
_pathauto_include();
$result = db_query("SELECT tid, vid, name, description, src, dst FROM {term_data} LEFT JOIN {url_alias} ON CONCAT('%s', CAST(tid AS CHAR)) = src WHERE src IS NULL AND vid = %d", $path, $vid);
$count = 0;
$placeholders = array();
while ($category = db_fetch_object($result)) {
$count += _taxonomy_pathauto_alias($category, 'bulkupdate');
}
drupal_set_message(format_plural($count,
'Bulk generation of terms completed, one alias generated.',
'Bulk generation of terms completed, @count aliases generated.'));выполнить код можно через Devel, по адресу
http://ваш_сайт/devel/php
Шаг 4. Немного css магии
table.catalog-root tbody {
border:none;
}
table.catalog-root a {
color:#494949;
text-decoration:underline;
}
table.catalog-root a:hover {
text-decoration:none;
}
table.catalog-root h2 a {
color:#027AC6;
}
table.catalog-page tr td,
table.catalog-root tr td {
color:#999;
padding:0 20px 20px 0;
vertical-align:top;
width:33%; /* естественно это для 3х колонок */
}
Результат
Если вы сделаете все правильно, каталог будет выглядеть примерно так:
И в дополнение:
Скажите пожалуйста, вот у Вас каталог содержит разделы: Авто, досуг, СМИ и.т.д. Я сделал описания этих разделов, как мне вывести это описание в "Страница каталога" чтобы оно находилось сразу под названием раздела.
в самом первом коде, заменить
$tid = arg($arg_pos);
$terms = taxonomy_get_children($tid, $vid);
if (!empty($terms)) {
$output = '<table class="catalog-page">';
на
$tid = arg($arg_pos);
$term = taxonomy_get_term($tid);
if ($term->description) {
$output = '<div class="term-description">'. check_markup($term->description) .'</div>';
}
$terms = taxonomy_get_children($tid, $vid);
if (!empty($terms)) {
$output .= '<table class="catalog-page">';