2017-02-01 5 views
0

У меня есть специальная форма Drupal 8, которая показывает список пользователей и кнопку «Проверить» для каждого пользователя.Drupal 8 программно создает пользовательскую форму с несколькими кнопками отправки

При нажатии кнопки «Проверить» обработчик отправки должен выяснить, какие пользователи нажали кнопку «Проверить».

Я пробовал это следующим образом, но он всегда возвращает идентификатор последнего элемента вместо правильного элемента.

Является ли это ошибкой в ​​API-интерфейсе Drupal Core?

Любой другой способ сделать это? Я открыт для предложений!

Это всего лишь пример. То, что я на самом деле пытаюсь сделать, это показать список пользователей, принадлежащих к определенному узлу компании. В этом списке есть кнопка «удалить из компании» для каждого пользователя.

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. 
    } 

} 

ответ

0

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