การส่งผ่านข้อโต้แย้งไปยัง drupal_get_form ()


19

ฉันจะส่งผ่านข้อโต้แย้งไปยังdrupal_get_form()ใน 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
มีตัวอย่างมากมายสำหรับสิ่งนี้ รัน grep สำหรับ drupal_get_form จากไดเร็กทอรีรูท drupal
Sivaji

คำตอบ:


33

เพียงเพิ่ม$varsเป็นอาร์กิวเมนต์ที่สอง

drupal_get_form('new_form', $vars);

และ...

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

อ้างอิงจากdrupal_get_form ()

... อาร์กิวเมนต์เพิ่มเติมใด ๆ จะถูกส่งผ่านไปยังฟังก์ชันที่เรียกใช้โดย drupal_get_form () รวมถึงฟังก์ชันตัวสร้างฟอร์มที่ไม่ซ้ำกัน ตัวอย่างเช่นรูปแบบ node_edit ต้องการให้วัตถุโหนดถูกส่งผ่านที่นี่เมื่อมันถูกเรียก สิ่งเหล่านี้พร้อมใช้งานสำหรับการนำไปใช้งานของ hook_form_alter () และ hook_form_FORM_ID_alter () เป็นอาร์เรย์ $ form_state ['build_info'] ['args']


3

ข้อโต้แย้งเพิ่มเติมที่คุณส่งผ่านไปยังdrupal_get_form()มีอยู่ในแต่คุณไม่สามารถมีฟังก์ชั่นในการโทรของคุณ$form_state['build_info']['args'] page argumentsฉันขอแนะนำวิธีการดังต่อไปนี้:

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

ส่วนที่เหลือของสิ่งที่คุณต้องการอยู่ในการอ้างอิงแบบฟอร์ม API


ควรใช้ฟังก์ชั่นนี้แทน drupal_build_form () เมื่อไม่จำเป็นต้องใช้ $ form_state (เช่นเมื่อแสดงผลแบบฟอร์มครั้งแรก) และมักจะใช้เป็นเมนูเรียกกลับ api.drupal.org/api/drupal/includes!form.inc/function/…
khaled_webdev

0

ฉันมีปัญหาที่คล้ายกันและได้รับการแก้ไขด้วยคำตอบของ @ kalabro และวิธีการจัดการกับมัน

ดังนั้นโดยทั่วไปฉันมีหน้า Landing Page ที่ฉันใช้โทเค็น ในการที่ผมเรียกว่าแบบฟอร์มการลงทะเบียนผ่านทางhook_tokens$form = drupal_get_form('user_register_form', 'register-test');

และสุดท้ายใน hook_form_alter ฉันตรวจสอบว่า String เป็น "register-test" $form_state['build_info']['args'][0]นี้จะกระทำผ่านทาง ฟังก์ชั่นที่นี่:

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['...
  }
...
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.