2010-04-28 9 views
7

W jaki sposób wydrukować wyniki przesyłania formularza na tej samej stronie co sam formularz?Drupal: Jak renderować wyniki formularza na tej samej stronie co formularz

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

strona zwrotna:

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

Formularz funkcja budynku:

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

Prześlij function (pominięty funkcję sprawdzania poprawności dla zwięzłość)

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

Jeśli wydrukuję tę zmienną $ list, to jest to dokładnie to, czego chcę, ale nie jestem pewien, jak uzyskać ją na stronie z oryginalną stroną formularza zbudowaną z 'ncbi_subsites_show_path_page'. Każda pomoc jest doceniana!

Odpowiedz

7

Kluczowe informacje w Nikit linków zamieszczonych jest $ form_state [ 'odbudować']. Oto kilka informacji z Drupal 7 dokumentacji wierzę obowiązuje taka sama dla Drupal 6 ...

$ form_state [ „odbudować”]: Normalnie, po całe przetwarzanie formularz jest wypełniony i złożyć teleskopowe ran, A Formularz jest uważany za zrobiony, a drupal_redirect_form() przekieruje użytkownika użytkownika na nową stronę za pomocą żądania GET (aby odświeżenie przeglądarki nie spowodowało ponownego przesłania formularza). Jednakże, jeżeli "przebudowanie" zostało ustawione na PRAWDA, to nowa kopia formularza jest natychmiast tworzona i wysyłana do przeglądarki przez ; zamiast tego przekierowania. Jest to używane w przypadku formularzy wieloetapowych, takich jak kreatory i formularze potwierdzenia . Ponadto, jeżeli forma obsługi walidacji włączony „przebudowa” TRUE i błąd sprawdzania miejsce, wówczas forma zostaje odświeżona przed zawraca, umożliwiając formularz elementy zostać zmienione, stosownie do przypadku do danego błędu walidacji .

+0

dostał pracę, dzięki tej końcówki. Jednak jedyny sposób, w jaki mogę "przekazać" dane z funkcji submit do funkcji, która renderuje formularz, ustawia zmienne globalne w funkcji submit, a następnie przebudowuje formularz i sprawdza, czy te zmienne są ustawione. Czy jest inny sposób na zrobienie tego? Nie lubię zmiennych globalnych. – Aaron

+0

Również w przykładzie z tego linku można zobaczyć $ form_state ['storage']. Wierzę, że ['storage'] jest dedykowanym miejscem, w którym można bezpiecznie przechowywać dane między walidacjami, przesłaniami itd. –

+0

Problem polega na tym, że nie mam dostępu do $ form_state z funkcji obsługi strony. Chciałbym przechowywać coś w tablicy pamięci $ form_state, ale potrzebuję tej wartości w procedurze obsługi strony, a nie funkcji budowania formularzy ... – Aaron

0

Drupal6 node.module i dblog.module Zrób to dla admina/content/node i admin/reports/dblog, zapewniając wywołanie zwrotne strony, które zawiera renderowany formularz na wyjściu.

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

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

W formularzu przesyłania zaktualizowane ustawienia filtrowania są przechowywane w $ _SESSION.

W oddzwonieniu strony renderuje wyniki na podstawie ustawień filtra przechowywanych w $ _SESSION.

$ _SESSION jest tutaj kolejnym globalnym miejscem (choć jest trwałe).

0

Dla Drupal7 Uważam, że jeśli używasz $form_state['rebuild'], to zmienne forma najlepiej można uzyskać z super-global zmiennej PHP $_POST (lub $_REQUEST).Jeśli jednak używasz $form_state['redirect'], rozwiązanie z $_SESSION jest lepsze (zamiast korzystania z $_GET lub $_REQUEST).

Uważam, że ten problem jest dość trudny nawet dla ekspertów. Może Drupal ma nieco prostszy i intuicyjny sposób, którego nie znamy.

+0

Chociaż jak wyświetlić te wartości na mojej stronie? – pal4life

1

Jest to pełny przykład roboczych strony oraz listę na tej samej stronie

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