1

Web フォーム 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 プロパティを使用しません
  • モジュールによって実装されるすべての関数には、モジュールの短い名前をプレフィックスとして付ける必要があります。関数がprivateの場合、関数名の最初の文字はアンダースコアで、その後にモジュールの短い名前が続く必要があります

参考文献

于 2013-01-21T19:13:29.003 に答える