УрокДобавление своей таблицы в качестве поля во Views

Не так давно попалось мне забавное задание - написать поиск по всем полям одного типа материала, включая приложенные файлы. Решил всё делать через раскрытые фильтры Views (exposed filters). И всё бы по всем полям ищет прекрасно - текстовые, таксономия, числовые. Но вот с загруженными файлами возникла проблема - по ним-то Views не бегает.

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

Итак, в .install файле модуля я описал будущую таблицу:

/**
 * Implements hook_schema().
 */
function example_schema() {
  $schema['example_attached_file'] = array(
    'fields' => array(
      'nid' => array(
        'type' => 'int',
        'unsigned' => TRUE,
        'not null' => TRUE,
      ),
      'text' => array(
        'type' => 'text',
        'size' => 'big',
        'not null' => TRUE,
      ),
    ),
    'primary key' => array('nid'),
  );
  return $schema;
}

Таблица простейшая - nid материала, для которого загружен документ, и текст самого документа.

Далее в файле .module я описал хук, который сообщает Views о том, что я собираюсь интегрировать с ним свой модуль, вернув версию API для него:

/**
 * Implements hook_views_api().
 */
function example_views_api(). {
  return array('api' => 3);
}

Дальше реализуется хук с набором данных для Views:

/**
 * Implements hook_views_data().
 */
function example_views_data() {
 
  // Здесь идёт связывание моей таблицы с таблицей {node} по ключу nid.
  // Т.е. будет формироваться дополнительное условие вида
  // LEFT JOIN {example_attached_file} ON node.nid = example_attached_file.nid
  $data['example_attached_file']['table']['join']['node'] = array(
    'left_field' => 'nid', // Поле (ключ) из таблицы {node}
    'field' => 'nid',      // Поле (ключ) из таблицы {example_attached_file}
  );
 
  // Теперь указываем поле с данными, которое будет выводиться на экран
  $data['example_attached_file']['text'] = array(
    'title'  => 'Текст приаттаченого документа',
    'help'   => 'Содержимое приаттаченого документа',
    'group'  => t('Node'),   // Группа, в которой будет отображаться поле
    'filter' => array('handler' => 'views_handler_filter_string'), // Добавляем возможность фильтровать по этому полю
    'field'  => array('handler' => 'views_handler_field'), // Добавляем возможность добавлять значение этой колонки как поле во Views
  );
  return $data;
}

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

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

    'sort'   => array('handler' => 'views_handler_sort');

Полный список возможных обработчиков полей (handlers) вы можете найти в папке handlers модуля Views.

Комментарии

Аватар пользователя alexeymalk
alexeymalk написал:

Круто, даже очень, но не помешал бы, полный исходный файл в зип))))))))))

12.08.2012 00:24
Аватар пользователя Gsnet
Gsnet написал:

А можно к своему полю ДАТА прикрутить виджет Date_popup чтобы при использовании его в качестве фильтра во Views вводить туда дату из календаря

04.11.2012 13:23

Комментировать