【问题标题】:Passing URL parameters to a Drupal form created in a menu item将 URL 参数传递给在菜单项中创建的 Drupal 表单
【发布时间】:2013-07-29 16:03:13
【问题描述】:

我正在使用 Drupal 7 并有一个自定义模块,我在其中创建了一个菜单项,该菜单项将显示 Drupal 表单。代码设置如下:

$items['job-seekers/update-resume/%'] = array(
  'title' => 'Update Resume',
  'page callback' => 'drupal_get_form',
  'page arguments' => 'oa_onboard_update_resume_form',    
  'access arguments' => array('access content'),
  'page arguments' => array(2),
);

所以我的菜单项将显示一个表单,但我需要将 URL 中传递的参数存储在一个隐藏的表单字段中,该字段最终将传递给表单提交方法进行处理。我的表单代码如下所示:

/**
 * Form callback for updating resume
 */
function oa_onboard_update_resume_form($form_state) {  

  $form['resume_file'] = array(
    '#type' => 'file',
    '#title' => t('Resume Upload'),
  );

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

  return $form;
}

所以这是一个非常简单的表单,只是一个文件上传字段,但是我不知道如何访问在 URL 中传递的 ID。最初我在想我需要像这样的表单方法来解释它:

function oa_onboard_update_resume_form($candidateId) { 

但是当我尝试这样做时出现错误:

Notice: Undefined index: 20249278 in drupal_retrieve_form() (line 763 of C:\xampp\htdocs\mysite\includes\form.inc).
Warning: call_user_func_array() expects parameter 1 to be a valid callback, function '20249278' not found or invalid function name in drupal_retrieve_form() (line 798 of C:\xampp\htdocs\mysite\includes\form.inc).

我想我可能会以错误的方式解决这个问题。底线是我只需要创建一个 URL,我可以将一个 ID 传递给它将显示一个表单并将该 ID 与文件上传一起传递给提交方法。

提前致谢。

编辑 这是根据以下建议修复菜单项后呈现表单的新回调函数:

function oa_onboard_update_resume_form($candidateId) {  

  $form['candidateId'] = array(
    '#type' => 'hidden',
    '#value' => $candidateId,
  );

  $form['resume_file'] = array(
    '#type' => 'file',
    '#title' => t('Resume Upload'),
  );

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

  return $form;
}

【问题讨论】:

    标签: forms drupal drupal-7


    【解决方案1】:

    在 hook_menu 函数中,您设置了两次 “页面参数”,您应该将 “页面回调” 与函数 oa_onboard_update_resume_form 一起使用。

    $items['job-seekers/update-resume/%'] = array(
      'title' => 'Update Resume',
      'page callback' => 'oa_onboard_update_resume_form',    
      'access arguments' => array('access content'),
      'page arguments' => array(2),
    );
    

    【讨论】:

    • 哇,我不敢相信我没有看到。好的,所以现在我有一个不同的问题。其实两个。所以我修复了菜单链接中的代码,但由于某种原因,我在 URL 中传递的值被截断了。换句话说,如果我转到 /job-seekers/update-resume/2058569,我的隐藏表单字段仅包含“2”。我的表单提交按钮也没有任何作用。表单呈现,我可以选择要上传的文件,但单击提交按钮不会提交表单。我更新了我的原始帖子,向您展示我使用什么作为我的回调函数来呈现表单。
    • 如果你愿意,可以给我的回答点赞。我花了一些时间来解决最初的问题。
    【解决方案2】:

    好的,这就是最终的工作:

    $items['job-seekers/update-resume/%'] = array(
      'title' => 'Update Resume',
      'page callback' => 'drupal_get_form',
      'page arguments' => array('oa_onboard_update_resume_form', 2),
      'access arguments' => array('access content'),
    );
    
    function oa_onboard_update_resume_form($form, &$form_state, $candidateId) {
      // I can use candidateId here now
    }
    

    【讨论】: