Drupal页面包含2个表单和URL参数

时间:2015-12-15 10:01:33

标签: php forms drupal

我想创建一个包含2个不同表单的页面,这些表单使用URL参数。 单独完成此任务的每个部分都很容易解决。我可以在表单上使用URL参数,使用drupal_get_form作为回调:

function mymodule_menu() {
  $items['user/%/blah'] = array(
    'title' => 'Blah',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('my_custom_callback', 1),
    'access arguments' => TRUE,
  );
}

function my_custom_callback($form, &$form_state, $uid) {
  // I can use candidateId here now
}

还可以做的是,使用两种形式创建自定义页面回调(不完全确定是否有效)

function mymodule_menu() {
  $items['user/%/blah'] = array(
    'title' => 'Blah',
    'page callback' => 'my_page_callback',
    'page arguments' => array(1), 
    'access arguments' => TRUE,
  );
}

function my_page_callback($uid) {
  $build = array();
  global $user;

  //PROBLEM: I can't pass the URL parameters to the separate
  //form callbacks
  $build['form1'] = drupal_get_form('form1_callback');
  $build['form2'] = drupal_get_form('form2_callback');

  return $build;
}

因此,如评论中所述,我无法将URL参数传递给单独的表单回调 - 并且他们需要在我的模块中使用此参数。确切地说:我在一个页面上需要2个表单(因为我需要2个不同的提交按钮作为默认按钮),每个都传递一个URL参数。

TL; DR:

基本上,我需要一个包含2个文本输入字段的表单页面,每个字段都应该有一个独立的提交按钮 - 但都应该是其字段上的默认按钮,因此它很容易无需鼠标即可使用,只需填写输入字段&按进入。 应触发该字段的相应按钮。

我不在乎我是否需要1或2个表单,我只需要两个表单上的URL参数。

没有帮助的解决方案:

......和我找到的其他人。

提前致谢。

1 个答案:

答案 0 :(得分:0)

你与两个drupal_get_form()函数非常接近。您可以在form_id之后添加一个参数,如:

function testing_forms_callback($user) {
  $build = array();
  $build['form1'] = drupal_get_form('testing_form_one', $user);
  $build['form2'] = drupal_get_form('testing_form_two', $user);

  return drupal_render($build);
}

这将允许您将参数传递给要加载的表单。这是完整的代码。

/**
 * Implements hook_menu()
 */
function testing_menu() {
  $items['user/%user/blah'] = array(
    'type' => MENU_CALLBACK,
    'title' => 'My Forms',
    'page callback' => 'testing_forms_callback',
    'page arguments' => array(1),
    'access callback' => TRUE,
  );

  return $items;
}

function testing_forms_callback($user) {
  $build = array();
  $build['form1'] = drupal_get_form('testing_form_one', $user);
  $build['form2'] = drupal_get_form('testing_form_two', $user);

  return drupal_render($build);
}

/**
 * Form 1.
 */
function testing_form_one($form, $form_state, $user) {
  $form['textfield_1'] = array(
    '#type' => 'textfield',
    '#title' => t('Textfield 1'),
    '#default_value' => $user->uid,
  );

  $form['submit_1'] = array(
    '#type' => 'submit',
    '#value' => t('Submit 1'),
  );

  return $form;
}

/**
 * Form 2.
 */
function testing_form_two($form, $form_state, $user) {
  $form['textfield_2'] = array(
    '#type' => 'textfield',
    '#title' => t('Textfield 2'),
    '#default_value' => $user->name,
  );

  $form['submit_2'] = array(
    '#type' => 'submit',
    '#value' => t('Submit 2'),
  );

  return $form;
}

/**
 * Submit handler to process the first textfield.
 */
function testing_form_one_submit($form, &$form_state) {
  drupal_set_message(t('called testing_form_submit_one'));
  // Do something.
  if (isset($form_state['values']['textfield_1'])) {
    $form_state['redirect'] = 'user/' . $form_state['values']['textfield_1'];
  }
}

/**
 * Submit handler to process the second textfield.
 */
function testing_form_two_submit($form, &$form_state) {
  drupal_set_message(t('called testing_form_submit_two'));
  // Do something.
  if (isset($form_state['values']['textfield_2'])) {
    $form_state['redirect'] = 'users/' . $form_state['values']['textfield_2'];
  }
}