Drupal → Фильтр без использования Views
Пример простого фильтра по заголовкам нод. Ссылка на демо.
В 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); }
В Drupal 7 нужно в submit callback-е прописать $form_state['redirect'] = FALSE
:
function mymodule_myform_submit($form, &$form_state) { $form_state['redirect'] = FALSE; }
Комментарии
Спасибо..
Очень полезный материал...помог мне в решении проблемы создания фильтра для агенства недвижимости..;)
Здравствуйте! Я только начал разбираться с Drupal и порой не понимаю элементарных вещей. Подскажите, пожалуйста, куда надо вставлять этот код, чтобы поиск был, например, на стр node/add?
Чтобы изменить страницу поиска надо изменить адрес nodefilter на что-то другое в 1 функции.
было
$items['nodefilter'] = array()
стало
$items['node/my-search-filter'] = array()
У меня проблема с подобной формой в д7. В нём, похоже игнорируется строка
и редирект на эту же страницу всё равно происходит. Подскажите как от него избавиться?
Благодарю за решение! Даже и не подумала бы так сделать.
Изменил под Друпал 7 модуль. Выдает ошибку:
Notice: Undefined index: filter в функции nodefilter_table() (строка 68...)
В чем может быть причина?
В function nodefilter_filter_form() впиши ещё $form['#method'] = 'get' и после этого замени строку $filter = (string)$_REQUEST['filter']; на $filter = (string)$_GET['filter'];
Здравствуйте. Использую пагинацию и сортировку. При переходе на другую страницу или изменении сортировки данные из $_REQUEST затираются и фильтр слетает. Как решить эту проблему? Пробовал через переменные в сессии, но тогда фильтр сохраняется, если просто зайти на страницу. Есть ли более красивое решение?
пользуйтесь get формой
xandeadx, спасибо, это работает, но тогда в адрес попадают ненужные параметры op, form_build_id, form_token, form_id.
Их можно как-то скрыть или может есть ещё способы?
http://xandeadx.ru/blog/drupal/674
Спасибо Вам за замечательный сайт, регулярно пользуюсь им.
Под 7-ку не работает к сожалению, $output = drupal_get_form('jfilter_filter_form') . ''; выводит массив в итоге, а не текст.
Видимо в семерке по иному формы надо формировать
Оставить комментарий