Drupal: how to display form results on the same page as a form

How do I print the results of submitting a form on the same page as the form itself?

Corresponding 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, ); 

page callback:

 function ncbi_subsites_show_path_page() { $f = drupal_get_form('_ncbi_subsites_show_paths_form'); return $f; } 

Form Build Function:

  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; } 

Submit function (skipped validation function for short)

 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 ); } 

If I print this $ list variable, this is exactly what I want, but I'm not sure how to get it on the page with the original page of the form created with 'ncbi_subsites_show_path_page'. Any help is much appreciated!

+7
php forms drupal drupal-6 drupal-fapi
source share
5 answers

The key information in the link Nikit posts is $ form_state ['rebuild']. Here is some information from the Drupal 7 documentation that I think is applicable to Drupal 6 ...

$ form_state ['rebuild']: Usually, after all the processing of the form is completed and the submission of the handlers is completed, the form is considered completed and drupal_redirect_form () will redirect the user to a new page using a GET request (therefore, do not re-submit the browser to update the form). However, if 'rebuild' is set to TRUE, then a new copy of the form is immediately embedded and submitted to the browser; instead of redirecting. This is used for multi-stage forms, such as wizards and confirmation forms. In addition, if the form validation handler sets 'rebuild' to TRUE and the validation error occurs, then the form is rebuilt before returning, allowing the form elements to be changed, depending on the situation, to the specific validation error.

+7
source share

This is a complete working example of a page and list on the same page.

 <?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); } 
+1
source share

Drupal6 node.module and dblog.module do this for admin / content / node and admin / reports / dblog, providing a page callback that includes the rendered form in its output.

 modules/dblog/dblog.admin.inc dblog_overview() modules/node/node.admin.inc node_admin_nodes() 

On the submit form, the updated filter settings are stored in $ _SESSION.

In the page callback, it displays the results based on the filter settings stored in $ _SESSION.

$ _ SESSION is just another global (albeit permanent) one.

0
source share

For Drupal7, I found that if you use $form_state['rebuild'] , then form variables are best obtained from the superglobal PHP variable $_POST (or $_REQUEST ). However, if you use $form_state['redirect'] , a solution with $_SESSION better (instead of using $_GET or $_REQUEST ).

I find this problem quite complicated even for experts. Perhaps Drupal has a simpler and more intuitive way that we don’t know.

0
source share

All Articles