2010-04-28 38 views
7

Làm cách nào để in kết quả của việc gửi biểu mẫu trên cùng một trang với biểu mẫu?Drupal: Cách hiển thị kết quả của biểu mẫu trên cùng một trang dưới dạng

hook_menu liên quan:

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

trang callback:

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

Mẫu xây dựng chức năng:

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

Gửi function (bỏ qua chức năng validate cho ngắn gọn)

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

Nếu tôi in biến $ list đó, đó chính xác là những gì tôi muốn, nhưng tôi không biết cách đưa nó vào trang với trang biểu mẫu gốc được tạo từ 'ncbi_subsites_show_path_page'. Bất kỳ sự giúp đỡ nào cũng được đánh giá cao!

Trả lời

7

Thông tin chính trong liên kết Nikit được đăng là $ form_state ['rebuild']. Dưới đây là một số thông tin từ Drupal 7 tài liệu mà tôi tin rằng áp dụng tương tự cho Drupal 6 ...

$ form_state [ 'tái thiết']: Thông thường, sau khi toàn bộ xử lý mẫu được điền đầy đủ và nộp xử lý chạy, một biểu mẫu là được coi là xong và drupal_redirect_form() sẽ chuyển hướng người dùng đến một trang mới bằng cách sử dụng yêu cầu GET (do đó làm mới trình duyệt không gửi lại biểu mẫu). Tuy nhiên, nếu 'xây dựng lại' đã được đặt thành TRUE, thì bản sao mới của biểu mẫu ngay lập tức được tạo và gửi đến trình duyệt; thay vào đó là của chuyển hướng. Biểu mẫu này được sử dụng cho các hình thức nhiều bước, chẳng hạn như trình thuật sĩ và các mẫu xác nhận nhiều dạng. Ngoài ra, nếu một hình thức xử lý xác thực đã thiết lập 'xây dựng lại' thành TRUE và lỗi xác thực xảy ra, sau đó biểu mẫu được xây dựng lại trước khi được trả lại, cho phép thay đổi các thành phần . .

+0

Got nó làm việc, nhờ mẹo này. Tuy nhiên, cách duy nhất tôi có thể "chuyển" dữ liệu từ hàm submit tới hàm render biểu mẫu bằng cách thiết lập các biến toàn cầu trong hàm submit, sau đó xây dựng lại biểu mẫu và kiểm tra xem các biến đó có được đặt hay không. Có một cách khác để làm điều này? Tôi không thích các biến toàn cục. – Aaron

+0

Cũng trong ví dụ từ liên kết đó, bạn có thể thấy $ form_state ['storage'] đang được sử dụng. Tôi tin rằng ['lưu trữ'] là một nơi dành riêng để bạn lưu trữ dữ liệu một cách an toàn giữa các lần xác nhận hợp lệ, gửi ... –

+0

Vấn đề là tôi không có quyền truy cập vào $ form_state từ chức năng xử lý trang. Tôi muốn lưu trữ thứ gì đó trong mảng lưu trữ của $ form_state, nhưng tôi cần giá trị đó trong trình xử lý trang, không phải chức năng tạo biểu mẫu ... – Aaron

0

Drupal6 node.module và dblog.module thực hiện việc này cho admin/content/node và admin/reports/dblog bằng cách cung cấp gọi lại trang bao gồm biểu mẫu được hiển thị trong đầu ra của nó.

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

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

Trong gửi biểu mẫu, cài đặt bộ lọc được cập nhật được lưu trữ trong $ _SESSION.

Trong gọi lại trang, nó hiển thị kết quả dựa trên cài đặt bộ lọc được lưu trữ trong $ _SESSION.

$ _SESSION chỉ là một toàn cầu khác ở đây (mặc dù là một liên tục).

0

Đối với Drupal7 tôi thấy rằng nếu bạn sử dụng $form_state['rebuild'], thì các biến biểu mẫu có thể được truy cập tốt nhất từ ​​biến siêu toàn cầu PHP $_POST (hoặc $_REQUEST).Tuy nhiên, nếu bạn sử dụng $form_state['redirect'], giải pháp với $_SESSION sẽ tốt hơn (thay vì sử dụng $_GET hoặc $_REQUEST).

Tôi thấy vấn đề này khá phức tạp ngay cả đối với các chuyên gia. Có lẽ Drupal có một số cách dễ dàng và trực quan hơn mà chúng ta không biết.

+0

Mặc dù tôi làm cách nào để hiển thị các giá trị này trên trang của mình? – pal4life

1

Đây là một ví dụ làm việc đầy đủ của một trang và một danh sách trên cùng một trang

<?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); 
} 
Các vấn đề liên quan