Как распечатать результаты отправки формы на той же странице, что и сама форма?
Соответствующий hook_menu:
$items['admin/content/ncbi_subsites/paths'] = array( 'title' => 'Paths', 'description' => 'Paths for a particular subsite', 'page callback' => 'ncbi_subsites_show_path_page', 'access arguments' => array( 'administer site configuration' ), 'type' => MENU_LOCAL_TASK, );
обратный вызов страницы:
function ncbi_subsites_show_path_page() { $f = drupal_get_form('_ncbi_subsites_show_paths_form'); return $f; }
Функция построения формы:
function _ncbi_subsites_show_paths_form() { // bunch of code here $form['subsite'] = array( '#title' => t('Subsites'), '#type' => 'select', '#description' => 'Choose a subsite to get its paths', '#default_value' => 'Choose a subsite', '#options'=> $tmp, ); $form['showthem'] = array( '#type' => 'submit', '#value' => 'Show paths', '#submit' => array( 'ncbi_subsites_show_paths_submit'), ); return $form; }
Отправить функцию (пропустить функцию проверки для краткости)
function ncbi_subsites_show_paths_submit( &$form, &$form_state ) { //dpm ( $form_state ); $subsite_name = $form_state['values']['subsite']; $subsite = new Subsite( $subsite_name ); //y own class that I use internally in this module $paths = $subsite->normalized_paths; // build list $list = theme_item_list( $paths ); }
Если я напечатаю эту переменную $ list, это именно то, что я хочу, но я не уверен, как ее получить на странице с исходной страницей формы, созданной с помощью «ncbi_subsites_show_path_page». Любая помощь высоко ценится!
Основная информация в ссылке, которую размещал Никит, – $ form_state ['rebuild']. Вот некоторая информация из документации Drupal 7, которая, как я считаю, применима к Drupal 6 …
$ form_state ['rebuild']: Обычно, после завершения обработки всей формы и отправки обработчиков, форма считается выполненной, и drupal_redirect_form () перенаправляет пользователя на новую страницу с использованием запроса GET (поэтому обновление браузера не возвращается повторно). Однако, если для параметра 'rebuild' установлено значение TRUE, то новая копия формы немедленно создается и отправляется в браузер; вместо перенаправления. Это используется для многоступенчатых форм, таких как мастера и формы подтверждения. Кроме того, если обработчик проверки формы установил «rebuild» в TRUE и произошла ошибка проверки, форма будет восстановлена до того, как будет возвращена, что позволит изменить элементы формы, в зависимости от конкретной ошибки проверки.
Это полный рабочий пример страницы и списка на той же странице
<?php /* * Implements hook_mennu() */ function test_menu() { $items['test'] = array( 'title' => t('Test'), 'page callback' => 'test_search_page', 'access callback' => True, ); return $items; } function test_search_page(){ $form = drupal_get_form('test_search_form'); return $form; } function test_search_form($form, &$form_state){ $header = array(t('id'), t('name'), t('firstname')); $rows = Null; $form['name'] = array( '#type' => 'textfield', '#title' => t('Name'), '#required' => True, '#default_value' => isset($_GET['name']) ? $_GET['name'] : Null ); $form['submit'] = array( '#type' => 'submit', '#value' => t('submit'), ); if (isset($_GET['name'])){ $rows = get_data(); } $form['table'] = array( '#theme' => 'table', '#header' => $header, '#rows' => $rows, '#empty' => t('Aucun résultat.') ); $form['pager'] = array('#markup' => theme('pager')); /* if (isset($form_state['table'])) { $form['table'] = $form_state['table']; } $form['pager'] = array('#markup' => theme('pager')); */ return $form; } function test_search_form_submit($form, &$form_state){ $form_state['redirect'] = array( // $path 'test', // $options array('query' => array('name' => $form_state['values']['name'])), // $http_response_code 302, ); } //$header = array(t('id'), t('name'), t('firstname')); function get_data(){ $data = array( 0 => array( 'id' => '0', 'name' => 'pokpokpok', 'firstname' => 'pokpokpok', ), 1 => array( 'id' => '1', 'name' => 'pokpokpok', 'firstname' => 'pokpokpok', ), 2 => array( 'id' => '2', 'name' => 'pokpokpok', 'firstname' => 'pokpokpok', ), 3 => array( 'id' => '3', 'name' => 'pokpokpok', 'firstname' => 'pokpokpok', ), 4 => array( 'id' => '4', 'name' => 'pokpokpok', 'firstname' => 'pokpokpok', ), 5 => array( 'id' => '5', 'name' => 'pokpokpok', 'firstname' => 'pokpokpok', ), 6 => array( 'id' => '6', 'name' => 'pokpokpok', 'firstname' => 'pokpokpok', ), 7 => array( 'id' => '7', 'name' => 'pokpokpok', 'firstname' => 'pokpokpok', ), 8 => array( 'id' => '8', 'name' => 'pokpokpok', 'firstname' => 'pokpokpok', ), 9 => array( 'id' => '9', 'name' => 'pokpokpok', 'firstname' => 'pokpokpok', ), 10 => array( 'id' => '10', 'name' => 'pokpokpok', 'firstname' => 'pokpokpok', ), 11 => array( 'id' => '11', 'name' => 'pokpokpok', 'firstname' => 'pokpokpok', ) ); $paging = pager_array_splice($data, 2); return $paging; } /* $header = array(t('id'), t('name'), t('firstname')); $form_state['table'] = array( '#theme' => 'table', '#header' => $header, '#rows' => $paging, '#empty' => t('Aucun r?sultat.') ); $form_state['rebuild'] = True;*/ function pager_array_splice($data, $limit = 9, $element = 0) { global $pager_page_array, $pager_total, $pager_total_items; $page = isset($_GET['page']) ? $_GET['page'] : ''; // Convert comma-separated $page to an array, used by other functions. $pager_page_array = explode(',', $page); // We calculate the total of pages as ceil(items / limit). $pager_total_items[$element] = count($data); $pager_total[$element] = ceil($pager_total_items[$element] / $limit); $pager_page_array[$element] = max(0, min((int)$pager_page_array[$element], ((int)$pager_total[$element]) - 1)); return array_slice($data, $pager_page_array[$element] * $limit, $limit, TRUE); }
Drupal6 node.module и dblog.module делают это для admin / content / node и admin / reports / dblog, предоставляя обратный вызов страницы, который включает визуализированную форму в свой вывод.
modules/dblog/dblog.admin.inc dblog_overview() modules/node/node.admin.inc node_admin_nodes()
В форме submit обновленные настройки фильтра хранятся в $ _SESSION.
В обратном вызове страницы он отображает результаты на основе настроек фильтра, хранящихся в $ _SESSION.
$ _SESSION – это просто еще один глобальный (хотя и постоянный).
Для Drupal7 я нахожу, что если вы используете $form_state['rebuild']
, то переменные формы лучше всего получить из $form_state['rebuild']
переменной PHP $_POST
(или $_REQUEST
). Однако, если вы используете $form_state['redirect']
, решение с $_SESSION
лучше (вместо использования $_GET
или $_REQUEST
).
Я считаю эту проблему довольно сложной даже для экспертов. Возможно, у Drupal есть более простой и интуитивно понятный способ, которого мы не знаем.