Drupal → Фильтр без использования Views

05.07.2010

Пример простого фильтра по заголовкам нод.

В hook_menu() регистрируем адрес, по которому будет выводится форма фильтра и таблица с отфильтрованными данными:

/**
 * Implements hook_menu().
 */
function nodefilter_menu() {
  $items['nodefilter'] = array(
    'title' => 'Node filter',
    'description' => 'Node filter',
    'page callback' => 'nodefilter_page_callback',
    'access arguments' => array('access content'),
  );
  return $items;
}

Кэлбак ф-я, которая соберёт на одной странице форму и таблицу с данными:

/**
 * Menu callback.
 */
function nodefilter_page_callback() {
  $output = drupal_get_form('nodefilter_filter_form');
  $output .= nodefilter_table();
  return $output;
}

Описание формы фильтра:

/**
 * Form builder.
 */
function nodefilter_filter_form() {
  $form['filter'] = array(
    '#title' => 'Часть заголовка',
    '#type' => 'textfield',
    '#required' => true,
  );
    
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => 'Фильтр',
  );
    
  $form['#redirect'] = FALSE;
    
  return $form;
}

Таблица с данными:

/**
 * Form table
 */
function nodefilter_table() {
  $filter = (string)$_REQUEST['filter'];
    
  if ($filter == '') return '';
    
  $nodes = db_query("SELECT nid, title, created FROM {node} WHERE title LIKE '%%%s%%' ORDER BY nid", $filter);
  $table_header = array('Заголовок', 'Дата создания');
  $table_data = array();
     
  while ($node = db_fetch_object($nodes)) {
    $table_data[] = array(
       l($node->title, 'node/' . $node->nid),
       format_date($node->created)
    );
  }

  if (count($table_data) == 0) {
    return 'Ничего не найдено.';
  }

  return theme('table', $table_header, $table_data);
}

Скриншот фильтра в действии:
Пример фильтра по слову 'jquery'

Исходники модуля.

В Drupal 7 нужно в submit callback-е прописать $form_state['redirect'] = FALSE:

function mymodule_myform_submit($form, &$form_state) {
  $form_state['redirect'] = FALSE;
}
Написанное актуально для
Drupal 6
Похожие записи

Комментарии

Гость
21.12.2010, 11:48

Спасибо..
Очень полезный материал...помог мне в решении проблемы создания фильтра для агенства недвижимости..;)

Гость
03.03.2012, 11:30

Здравствуйте! Я только начал разбираться с Drupal и порой не понимаю элементарных вещей. Подскажите, пожалуйста, куда надо вставлять этот код, чтобы поиск был, например, на стр node/add?

Чтобы изменить страницу поиска надо изменить адрес nodefilter на что-то другое в 1 функции.
было
$items['nodefilter'] = array()
стало
$items['node/my-search-filter'] = array()

Гость
29.04.2013, 13:07

У меня проблема с подобной формой в д7. В нём, похоже игнорируется строка

$form['#redirect'] = false;

и редирект на эту же страницу всё равно происходит. Подскажите как от него избавиться?

ilianna.ru
16.07.2013, 20:47

Благодарю за решение! Даже и не подумала бы так сделать.

Изменил под Друпал 7 модуль. Выдает ошибку:
Notice: Undefined index: filter в функции nodefilter_table() (строка 68...)
В чем может быть причина?

В function nodefilter_filter_form() впиши ещё $form['#method'] = 'get' и после этого замени строку $filter = (string)$_REQUEST['filter']; на $filter = (string)$_GET['filter'];

Здравствуйте. Использую пагинацию и сортировку. При переходе на другую страницу или изменении сортировки данные из $_REQUEST затираются и фильтр слетает. Как решить эту проблему? Пробовал через переменные в сессии, но тогда фильтр сохраняется, если просто зайти на страницу. Есть ли более красивое решение?

xandeadx, спасибо, это работает, но тогда в адрес попадают ненужные параметры op, form_build_id, form_token, form_id.

Их можно как-то скрыть или может есть ещё способы?

Спасибо Вам за замечательный сайт, регулярно пользуюсь им.

Под 7-ку не работает к сожалению, $output = drupal_get_form('jfilter_filter_form') . ''; выводит массив в итоге, а не текст.
Видимо в семерке по иному формы надо формировать

drupal_get_form('nodefilter_filter_form');
а render где?

В шестёрке drupal_get_form возвращает строку

Добавить комментарий