2010-04-28 18 views
7

¿Cómo imprimiría los resultados de un envío de formulario en la misma página que el formulario en sí?Drupal: Cómo generar resultados del formulario en la misma página que el formulario

hook_menu Relevante:

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

página de devolución de llamada:

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

Formulario función del edificio:

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

Presentar la función (función de validación saltado por razones de brevedad)

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 $ list, 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!

Respuesta

7

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

$ form_state [ 'reconstruir']: Normalmente, después de todo el procesamiento forma se ha completado y presentar manipuladores corrieron, una el formulario es considerado como hecho y drupal_redirect_form() redirigirá al usuario a una nueva página utilizando una solicitud GET (por lo que una actualización del navegador no vuelve a enviar el formulario ). Sin embargo, si 'reconstruir' se ha establecido en VERDADERO, entonces una nueva copia del formulario es inmediatamente construida y enviada al navegador; en su lugar de una redirección. Esto se usa para los formularios de pasos múltiples , como los formularios de confirmación y los asistentes. Además, si una forma controlador de validación ha puesto 'reconstruir' a TRUE y se produjo un error de validación , entonces la forma se reconstruye antes de ser devuelto, permitiendo forma elementos a ser alterados, según proceda para el error de validación particular, .

+0

¡Gracias trabajar, gracias a este consejo. Sin embargo, la única forma en que podía "pasar" los datos de la función de envío a la función que representa el formulario es estableciendo variables globales en la función de envío, luego reconstruyendo el formulario y comprobando si esos valores variables están establecidos. Hay otra manera de hacer esto? No me gustan las variables globales. – Aaron

+0

También en el ejemplo de ese enlace, puede ver $ form_state ['storage'] que se está utilizando. Creo que ['almacenamiento'] es un lugar dedicado donde puede almacenar datos de manera segura entre validaciones, envíos, etc. –

+0

El problema es que no tengo acceso a $ form_state desde la función del manejador de página. Me gustaría almacenar algo en la matriz de almacenamiento de $ form_state, pero necesito ese valor en el controlador de página, no en la función de creación de formularios ... – Aaron

0

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 formulario, la configuración de filtro actualizada se almacena en $ _SESSION.

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

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

0

Para Drupal7 Me parece que si se utiliza $form_state['rebuild'], entonces las variables de formulario se puede acceder mejor a partir de la variable super mundial 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.

+0

¿Cómo puedo mostrar estos valores en mi página? – pal4life

1

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