【问题标题】:Drupal 8 programmatically create a custom form with multiple submit buttonsDrupal 8 以编程方式创建具有多个提交按钮的自定义表单
【发布时间】:2017-02-01 14:02:33
【问题描述】:

我有一个自定义 Drupal 8 表单,其中显示了用户列表和每个用户的“检查”按钮。

当点击一个检查按钮时,提交处理程序需要确定哪些用户的“检查”按钮被点击了。

我已经尝试过以下方式,但它总是返回最后一个元素的 id 而不是正确的元素。

这是 Drupal Core Form API 中的错误吗?

还有其他方法吗?我愿意接受建议!

这只是一个例子。我实际上想要做的是显示属于特定“公司”节点的用户列表。在该列表中,每个用户都有一个“从公司中删除”按钮。

http://pastebin.com/us2YFcjr

<?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


【解决方案1】:

Drupal 将具有相同#value 的按钮视为同一个按钮,除非它们具有不同的#name

所以我所要做的就是为我的按钮添加一个唯一的#name 以使其正常工作:

$form['users'][$user->id()]['dummyNode-' . $user->id()] = array(
  '#type' => 'submit',
  '#value' => 'Check',
  '#name' => 'check_' . $user->id(),
  '#submit' => array([$this, 'removeMember']),
);

https://www.drupal.org/node/1342066#comment-11904090

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 2015-02-04
    • 2010-12-05
    相关资源
    最近更新 更多