テーマテーブルに送信ボタンを追加しても機能しません

Aug 24 2020

テーブル要素の「#rows」キー内にボタンを追加すると、送信関数が呼び出されません。

class MyForm extends FormBase
{

   public function buildForm(array $form, FormStateInterface $form_state)
    {
        $my_button = [ '#type' => 'submit', '#value' => $this->t("Click"),
            '#submit' => [
                '::custom_submitForm'
            ]
        ];
        $form['my_table'] = [ // '#tree' => TRUE, '#theme' => 'table', '#header' => [ 'Column 1','Column 2' ], '#rows' => [ [$this->t("Blabla"), ['data'=>$my_button]] ], ]; return $form;
    }
    // other stuff

これに対する最善の回避策は何ですか?

追加する編集:

何が起こっているのかを理解するための最初の試みとして、私は子供たちの機能を子供たちと見なすことを許可しました'#rows'(を参照Drupal\Core\Render\Element::children

  public static function children(array &$elements, $sort = FALSE) {
     ...
    foreach ($elements as $key => $value) { if (is_int($key) || $key === '' || ($key[0] !== '#' || $key=='#rows')) {
     ...

これで問題は解決します(ハンドラーが呼び出されます)が、もちろん、この変更により他の多くの問題が発生します。しかし、これで、送信ハンドラーが呼び出されなかった理由を理解できます。

Drupalキューに問題を追加しました: https://www.drupal.org/project/drupal/issues/3166899

私はこのバグを修正するように求めていませんが、最善の回避策は何でしょうか。

回答

2 4k4 Aug 24 2020 at 18:51

#themeの代わりにフォーム要素#typeを使用します。

'#type' => 'table'

テーブルフォーム要素には、フォームで使用するときに処理するための追加のステップがあります。

あなたは必要ありません'#rows'。で始まらない配列キー#[]および行に。を追加することによって自動的に追加されるインデックスも、レンダリング可能な子と見なされ、行として表示されます。