Drupal 8 以编程方式创建具有多个提交按钮的自定义表单
Drupal 8 programmatically create a custom form with multiple submit buttons
我有一个自定义的 Drupal 8 表单,它显示用户列表和每个用户的 "check" 按钮。
单击检查按钮时,提交处理程序需要确定单击了哪个用户 "check" 按钮。
我已经尝试过以下方法,但它总是 returns 最后一个元素的 ID 而不是正确的元素。
这是 Drupal Core Form API 中的错误吗?
还有其他方法吗?我愿意接受建议!
这只是一个例子。我实际上想做的是显示属于特定 'company' 节点的用户列表。在该列表中,每个用户都有一个 'remove from company' 按钮。
<?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.
}
}
Drupal 将具有相同#value 的按钮视为同一按钮,除非它们具有不同的#name
所以我所要做的就是为我的按钮添加一个唯一的#name 以使其正常工作:
$form['users'][$user->id()]['dummyNode-' . $user->id()] = array(
'#type' => 'submit',
'#value' => 'Check',
'#name' => 'check_' . $user->id(),
'#submit' => array([$this, 'removeMember']),
);
我有一个自定义的 Drupal 8 表单,它显示用户列表和每个用户的 "check" 按钮。
单击检查按钮时,提交处理程序需要确定单击了哪个用户 "check" 按钮。
我已经尝试过以下方法,但它总是 returns 最后一个元素的 ID 而不是正确的元素。
这是 Drupal Core Form API 中的错误吗?
还有其他方法吗?我愿意接受建议!
这只是一个例子。我实际上想做的是显示属于特定 'company' 节点的用户列表。在该列表中,每个用户都有一个 'remove from company' 按钮。
<?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.
}
}
Drupal 将具有相同#value 的按钮视为同一按钮,除非它们具有不同的#name
所以我所要做的就是为我的按钮添加一个唯一的#name 以使其正常工作:
$form['users'][$user->id()]['dummyNode-' . $user->id()] = array(
'#type' => 'submit',
'#value' => 'Check',
'#name' => 'check_' . $user->id(),
'#submit' => array([$this, 'removeMember']),
);