Простой каталог на Друпале

Для создания каталога нам потребуются модули: Views, Taxonomy Redirect, Pathauto.

Так как все термины таксономии имеют одинаковые пути taxonomy/term/%, нельзя задать им разные отображения. К счастью в модуле taxonomy есть замечательный хук hook_taxonomy_term_path, с его помощью можно изменить эти пути. Люди разбирающиеся в программировании и умеющие читать документацию сделают это быстро. Но мы пойдем по легкому пути и используем модуль Taxonomy Redirect.

Шаг 1. Настройка Taxonomy Redirect

  1. Настройки модуля находятся по адресу admin/build/taxonomy_redirect
  2. Выбираем нужный словарь, Pathcatalog/!tid, сохраняем.

Шаг 2. Настойка Views

Настройка views.

  1. Создаем новое представление View nameКаталогView typeNode.
  2. Добавляем отображение типа page.
    • Basic settings:
      • NameСтраница каталога
      • Use pagerYes
      • 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->nametaxonomy_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:
      • Pathcatalog/%
    • Arguments:
      Жмем кнопку Override
      • Добавляем аргумент Taxonomy: Term ID (with depth) и настраиваем его:
        • Title%1
        • BreadcrumbКаталог
        • Validator options:
          • ValidatorTaxonomy term
          • Vocabulariesвыбираем наш словарь
          • Argument typeTerm ID
        • Depth2
        • Ставим галочку Set the breadcrumb for the term parents
  3. Добавляем отображение типа 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->nametaxonomy_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->nametaxonomy_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:
      • Pathcatalog/all
    • Arguments:
      Жмем кнопку Override
      • Добавляем аргумент Global: Null и настраиваем его:
        • Action to take if argument is not presentDisplay empty text

Теперь ваш каталог находится по адресу www.site.ru/catalog/all

Шаг 3. Настойка Pathauto

  1. Добавляем алиас вручную для корня каталога. catalog/all теперь будет просто catalog
  2. Шаблон для терминов нашего словаря будет catalog/[catpath-raw].
  3. Неприятная новость для тех у кого словарь таксономии уже был заполнен терминами: только новые термины получат автоматический алиас. Но это решается небольшим 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-page tbody,
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:20px 20px 0;
  vertical-align:top;
  width:33%; /* естественно это для 3х колонок */
}

 

Результат

Если вы сделаете все правильно, каталог будет выглядеть примерно так:

Автора автора

И в дополнение:

Скажите пожалуйста, вот у Вас каталог содержит разделы: Авто, досуг, СМИ и.т.д. Я сделал описания этих разделов, как мне вывести это описание в "Страница каталога" чтобы оно находилось сразу под названием раздела.

в самом первом коде, заменить

if (is_numeric(arg($arg_pos))) {
  $tid = arg($arg_pos);
  $terms = taxonomy_get_children($tid$vid);
  if (!empty($terms)) {
    $output = '<table class="catalog-page">';

на

if (is_numeric(arg($arg_pos))) {
  $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">';