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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.