php forms drupal drupal-6 drupal-fapi

php - drupal module



Drupal: Cómo presentar los resultados del formulario en la misma página que el formulario (5)

http://robshouse.net/blog-post/redirect-destination-after-submitting-multi-step-drupal-form

¿Cómo imprimiría los resultados de un envío de formulario en la misma página que el formulario mismo?

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

devolución de llamada de la página:

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

Función de construcción de formulario:

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

Función de envío (función de validación omitida para abreviar)

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

Si imprimo esa variable en la lista $, es exactamente lo que quiero, pero no estoy seguro de cómo ingresarla en la página con la página de formulario original creada a partir de ''ncbi_subsites_show_path_page''. ¡Cualquier ayuda es muy apreciada!


La información clave en el enlace que Nikit publicó es $ form_state [''Rebuild'']. Aquí hay información de la documentación de Drupal 7 que creo aplica de la misma manera para Drupal 6 ...

$ form_state [''rebuild'']: normalmente, una vez que se completa el procesamiento del formulario y se ejecutan los manejadores de envío, se considera que se ha completado un formulario y drupal_redirect_form () redirigirá al usuario a una nueva página utilizando una solicitud GET (para que el navegador se actualice no vuelve a enviar el formulario). Sin embargo, si ''reconstruir'' se ha establecido en VERDADERO, entonces una nueva copia del formulario se crea inmediatamente y se envía al navegador; en lugar de una redirección Esto se usa para formularios de varios pasos, como asistentes y formularios de confirmación. Además, si un manejador de validación de formulario ha establecido ''reconstruir'' en VERDADERO y se produjo un error de validación, el formulario se reconstruye antes de ser devuelto, lo que permite alterar los elementos del formulario, según corresponda al error de validación particular.


Drupal6 node.module y dblog.module hacen esto para admin / content / node y admin / reports / dblog proporcionando una devolución de llamada de página que incluye el formulario procesado en su salida.

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

En el envío del formulario, la configuración del filtro actualizada se almacena en $ _SESSION.

En la devolución de llamada de la página, los resultados se basan en la configuración del filtro almacenada en $ _SESSION.

$ _SESSION es solo otro global aquí (aunque persistente).


Para Drupal7, creo que si usas $form_state[''rebuild''] , entonces se puede acceder mejor a las variables de formulario desde la variable super-global PHP $_POST (o $_REQUEST ). Sin embargo, si usa $form_state[''redirect''] , la solución con $_SESSION es mejor (en lugar de usar $_GET o $_REQUEST ).

Encuentro este problema bastante complicado incluso para los expertos. Quizás Drupal tiene una forma más fácil e intuitiva que nosotros no sabemos.


Este es un ejemplo de trabajo completo de una página y una lista en la misma página

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