【发布时间】:2017-02-01 14:02:33
【问题描述】:
我有一个自定义 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.
}
}
【问题讨论】:
-
在 '#submit' 表单元素属性行上,我不得不使用 '::removeMember' 来完成这项工作。在 Drupal 9 中简单地使用不带两个冒号 (:) 的 'removeMember' 会导致这样的错误:警告:call_user_func_array() 期望参数 1 是有效的回调,在 Drupal\Core\Form\FormSubmitter 中没有给出数组或字符串- >executeSubmitHandlers()(core/lib/Drupal/Core/Form/FormSubmitter.php 的第 113 行)。
标签: drupal-8