如何将变量传递给Drupal回调?

时间:2013-01-21 13:17:25

标签: php drupal callback drupal-7 drupal-webform

我在代码中创建了如下所示的字段结构,而不是使用webform UI。我以编程方式执行此操作的原因是因为我有数百种表单,我想一次性完成。

enter image description here

以下是我的代码:

for ($i = 0; $i <= 4; $i++) {
            $form['submitted']['file' . $i] = array(
                '#title' => t('File'),
                '#type' => 'managed_file',
                '#description' => t('Please upload a document or image.'),
                '#default_value' => variable_get('file' . $i, ''),
                '#weight' => 100,
               );

                $form['submitted']['remove_name'] = array(
               '#type' => 'submit',
               '#value' => t('Remove'),
               //I NEED A WAY TO PASS $i AS ARGUMENT TO THE CALLBACK
               '#submit' => array('form_remove_attachment'),
               // Since we are removing a name, don't validate until later.
              '#limit_validation_errors' => array(),
);
        }

在回调之下

function form_remove_attachment($i) {

    $form_state['submitted']['file' . $i]--;
   // Setting $form_state['rebuild'] = TRUE causes the form to be rebuilt again.
    $form_state['rebuild'] = TRUE;
}

现在我需要的是每个附件字段的删除按钮,以允许用户改变他们对附加文件的看法。我当然可以通过JS添加它,但这样就不会从$ form_state中删除附件。

有没有人有一些建议如何将$ i传递给回调form_remove_attachment?

1 个答案:

答案 0 :(得分:0)

首先,您应使用与$form['submitted']['remove_name']类似的内容,而不是$form['submitted']['remove_name' . $i],而不是$form['submitted']['file' . $i]

对于$form['submitted']['remove_name' . $i],您可以使用自定义属性,例如$form['submitted']['remove_name' . $i]['#mymodule_file_id']。 (将mymodule替换为您正在使用的模块的简称。)然后,提交表单应使用以下代码。

function form_remove_attachment($form, &$form_state) {
  // This is the same value used for #mymodule_file_id for the clicked button.
  $file_id = $form_state['triggering_element']['#mymodule_file_id'];
  // ...
}

附注:

  • managed_file表单元素不使用#default_value属性
  • 模块实现的每个功能都应该以模块的短名称为前缀;如果函数是 private ,则函数名中的第一个字符应为下划线,后跟模块的短名称

参考