1

我从代码中创建了一个如下所示的字段结构,而不是使用 webform UI。我以编程方式执行此操作的原因是因为我有数百个表单,并且我想一劳永逸地执行此操作。

在此处输入图像描述

下面是我的代码:

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 有一些建议吗?

4

1 回答 1

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 属性
  • 模块实现的每个功能都应该以模块的短名称为前缀;如果函数是私有的,函数名的第一个字符应该是下划线,后跟模块的简称

参考

于 2013-01-21T19:13:29.003 回答