【问题标题】:Drupal page with 2 forms and URL arguments带有 2 个表单和 URL 参数的 Drupal 页面
【发布时间】:2015-12-15 10:01:32
【问题描述】:

我想创建一个包含 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 个文本输入字段的表单页面,并且每个字段都应该有一个单独的提交按钮 - 但 两者都应该是其字段上的默认按钮,因此可以轻松无需鼠标即可使用,只需填写输入字段并按 Enter。 应该触发字段对应的按钮。

我不关心我需要 1 个还是 2 个表单,我只需要两个表单上的 URL 参数。

没有帮助的解决方案:

...以及我找到的其他人。

提前致谢。

【问题讨论】:

    标签: php forms drupal


    【解决方案1】:

    您非常接近两个 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'];
      }
    }
    

    【讨论】:

    • 这是我解释的。您有一个表单和两个提交按钮。因此浏览器默认选择“最佳”按钮(= 按 Enter 时触发)。但正如解释的那样,我需要的是两个,例如我可以将光标放入并按 Enter 键的文本输入字段,然后单击 corresponding 按钮。使用您的解决方案,情况并非如此-但我在我的问题中说过,不是吗? (也许不是那么清楚......?)您的解决方案适用于鼠标,但不适用于键盘。
    • 我没有注意到您提到的键盘选择。我更新了我的帖子以反映这一点。请让我知道这是否适合您。
    • AAARRGGHHH。我没有看到你可以给 drupal_get_form 另一个论点。这就是解决方案。非常感谢你,伙计。我会检查它是否有效(可能需要几天,因为我正在忙 ATM,然后将答案标记为正确。
    • 是的,这个问题很可能是由于 Drupal API 页面上的文档不完善造成的。它没有显示 drupal_get_form() 在 Drupal 7 中像在 Drupal 6 版本中那样采用额外的参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 2014-08-18
    • 2013-09-12
    相关资源
    最近更新 更多