ユーザーのリストと各ユーザーの「確認」ボタンを表示するカスタムDrupal 8フォームがあります。Drupal 8は、複数の送信ボタンを持つカスタムフォームをプログラムで作成します。
チェックボタンをクリックすると、サブミットハンドラは、どのユーザーが「チェック」ボタンをクリックしたかを把握する必要があります。
私はこれを次の方法で試しましたが、常に正しい要素の代わりに最後の要素のIDを返します。
これはDrupal Core Form APIのバグですか?
これを行うには他の方法はありますか?私は提案に開放されています!
これは単なる例です。私が実際にやっていることは、特定の「会社」ノードに属するユーザーのリストを表示することです。そのリストには、各ユーザーの「会社から削除」ボタンがあります。
<?php
namespace Drupal\form_multi_submit\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\user\Entity\User;
class MultiSubmitForm extends FormBase {
public function getFormId() {
return 'MultiSubmitForm';
}
public function buildForm(array $form, FormStateInterface $form_state) {
// Get all users from database
$ids = \Drupal::entityQuery('user')
->condition('status', 1)
->execute();
$users = User::loadMultiple($ids);
// Set form table header
$form['users'] = array (
'#type' => 'table',
'#header' => array('ID', 'Remove'),
);
// Loop through all users
foreach ($users as $user) {
// Show user ID
$form['users'][$user->id()]['id'] = array(
'#type' => 'label',
'#title' => $user->id(),
);
// Show button for each user
$form['users'][$user->id()]['removememberbutton']['dummyNode'] = array(
'#type' => 'submit',
'#value' => 'Check',
'#submit' => array([$this, 'removeMember']),
);
}
return $form;
}
// Submit handler
public function removeMember(array &$form, FormStateInterface $form_state) {
$userid = $form_state->getTriggeringElement()['#array_parents'][1];
drupal_set_message($userid, 'status');
}
public function validateForm(array &$form, FormStateInterface $form_state) {
// Nothing to do here.
}
public function submitForm(array &$form, FormStateInterface $form_state) {
// Nothing to do here.
}
}