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