2017-02-01 3 views
0

ユーザーのリストと各ユーザーの「確認」ボタンを表示するカスタムDrupal 8フォームがあります。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. 
    } 

} 

答えて

0

Drupalは、彼らが異なる#NAME

を持っていない限り、だから私がしなければならなかったすべては私にユニーク#NAMEを追加し、同じボタンと同じ#VALUEでボタンを考慮これが正しく動作するために取得するためのボタン:

$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

関連する問題