Truyền đối số cho drupal_get_form ()


19

Làm thế nào tôi có thể chuyển các đối số drupal_get_form()trong Drupal 7?

function new_menu_callback() {
  $vars = some_example_function(); // returns: array(1 => 'one', 2 => 'two');
  $output = $vars[2];
  $output .= drupal_render(drupal_get_form('new_form'));
}

function new_form($form, &$form_state) {
  // How can I access $vars[1] from new_menu_callback() here?
}

4
Có rất nhiều ví dụ cho việc này. Chạy một grep cho drupal_get_form từ thư mục gốc drupal.
Sivaji

Câu trả lời:


33

Chỉ cần thêm $varslàm đối số thứ hai.

drupal_get_form('new_form', $vars);

và ...

function new_form($form, &$form_state, $vars) {
// ...

Trích dẫn từ drupal_get_form ()

... Bất kỳ đối số bổ sung nào được truyền vào các hàm được gọi bởi drupal_get_form (), bao gồm cả hàm xây dựng biểu mẫu duy nhất. Ví dụ, biểu mẫu node_edit yêu cầu một đối tượng nút được truyền vào đây khi nó được gọi. Chúng có sẵn để triển khai hook_form_alter () và hook_form_FORM_ID_alter () dưới dạng mảng $ form_state ['build_info'] ['args'].


3

Các đối số bổ sung mà bạn chuyển đến drupal_get_form()có sẵn $form_state['build_info']['args'], nhưng bạn không thể có các lệnh gọi hàm page arguments. Tôi muốn đề xuất cách tiếp cận sau:

function mymodule_menu() {
    $items = array();
    $items['mymodule/example'] = array(
      'page callback' => 'drupal_get_form',
      'page arguments' => array('mymodule_form'),
    );
    return $items;
}


function mymodule_form($form, &$form_state) {
  // this function now uses dev/user friendly named keys
  $vars = mymodule_example_function();
  $form = array();

  $form['heading'] = array(
    '#markup' => check_plain($vars['heading']),
  );

  // use other arguments here

  return $form;
}

Phần còn lại của những gì bạn cần là trong tài liệu tham khảo API mẫu


Hàm này nên được sử dụng thay cho drupal_build_form () khi không cần $ form_state (nghĩa là khi ban đầu hiển thị biểu mẫu) và thường được sử dụng làm hàm gọi lại trình đơn. api.drupal.org/api/drupal/includes!form.inc/feft/NH
khaled_webdev

0

Tôi đã có một vấn đề tương tự và nó đã được giải quyết bằng sự pha trộn giữa câu trả lời của @ kalabro và cách riêng của tôi để giải quyết nó.

Vì vậy, về cơ bản tôi có một trang đích tĩnh nơi tôi sử dụng mã thông báo. Trong hook_tokenstôi gọi mẫu đăng ký thông qua $form = drupal_get_form('user_register_form', 'register-test');.

Và cuối cùng trong hook_form_alter tôi kiểm tra xem String có phải là "register-test" không. Điều này được thực hiện thông qua $form_state['build_info']['args'][0]. Đây là chức năng:

function hook_form_user_register_form_alter(&$form, &$form_state, $form_id) {
...
if ($form_state['build_info']['args'][0] == 'register-test') {
    // manipulate the form as usual
    $form['...
  }
...
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.