web-dev-qa-db-ja.com

カスタムテンプレートでフォームをレンダリングする方法

カスタムテンプレート内にフォームを追加しようとしています。 cmodule.routing.ymlファイル内に登録されているパスを開いた場合、フォームは機能しますが、カスタムテンプレート内で使用しようとしても機能しません。dump(form)またはdump(form.anyfield)を使用すると、 NULLを取得します。

cmodule.routing.yml:

cmodule.manageform:
  path: '/cmodule/manageform'
  defaults:
    _title: 'Documents'
    _form: '\Drupal\cmodule\Forms\RequestForm'
  requirements:
    _permission: 'access content'
cmodule.manage:
  path: '/cmodule/manage'
  defaults:
    _controller: '\Drupal\cmodule\Controller\CmoduleController::manageAction'
    _title: 'Custom Documents'
  requirements:
    _permission: 'access content'

RequestForm.php:

/**
 * {@inheritdoc}
 *
 */
public function buildForm(array $form, FormStateInterface $form_state) {

    $form['type'] = array(
        '#type' => 'radios',
        '#options' => array(
            '0' =>t('DOC'),
            '1' =>t('PDF')
        ),
    );
    $form['pid'] = array(
        '#type' => 'textfield',
        '#title' => t('ID:'),
        '#required' => FALSE
    );
    $form['submit'] = array(
        '#type' => 'submit',
        '#value' => $this->t('Submit'),
        '#attributes'=> ['class'=>['glyphicon', 'glyphicon-search']],
    );


    return $form;
}

cmodule.module:

/**
 * Implements hook_theme().
 */
function cmodule_theme(){

    $templates = array(
        'manage_cmodule_page' => array(
            'variables' =>
                [
                    'id' => NULL,
                    'form' => NULL
                ],
            'template' =>'manage_cmodule',
            'render element' => 'form'
        )
    );

    return $templates;
}

コントローラには以下が含まれます:

public function manageAction() {

        $id = 1;

        $form = \Drupal::formBuilder()->getForm('Drupal\cmodule\Forms\RequestForm');

        $form['type']['#title_display'] = 'invisible';

        return [ '#theme' => 'manage_cmodule_page',
            '#form' => $form,
            '#id' => $id,
        ];
    }

そして、テンプレート/ビュー(含む):

<div>
 {{ form.form_token }}
{{ form.form_build_id }}
{{ form.form_id }} 
{{form.type}}
{{form.submit}}
</div>
etc..

しかし、上記で述べたように、テンプレートはフォームを表示せず、コントローラーを介して渡された#id値を表示します(印刷する場合)。何か提案はありますか?!


UPDATE#1Beebeeの提案にも従うように試み、次に this および this したがって、コードは次のとおりです。

コントローラ:

controller contains:

public function manageAction() {

        $form = \Drupal::formBuilder()->getForm('Drupal\cmodule\Forms\RequestForm');

        $render['#form'] = $form;
        $render['theme'] = 'manage_cmodule_page';
        return $render;;
    }

.moduleファイル内のhook_themeの実装は次のとおりです。

return [
    'manage_cmodule_page' => [
        'template' =>'manage_cmodule',
        'render element' => 'form',
    ]
];

結果は、Apacheログ内にエラーがある空のページです。

[php7:error] [pid 12660:tid 1592] [client :: 1:59521] PHP致命的なエラー:メモリ不足(270532608が割り当てられています)(266354688バイトを割り当てようとしました)C:\drupal\vendor\twig\twig\lib\Twig\Extension\Debug.php、60行目、リファラー: http:// localhost/drupal /

コントローラから次の行を削除すると

$render['theme'] = 'manage_atps_page';

ページは読み込まれますが、空です(フォームなし)。

更新#2

Alex Kuzava のアイデアに従って問題を修正しました。したがって、フォームの新しいディレクトリでUPDATE 1のコードを使用し、次にこれらの3行をテンプレートの一部に追加しました(それ以外の場合、[送信]ボタンは機能しません)。

{{ form.form.form_build_id }} 
{{ form.form.form_id }}
{{ form.form.form_token }}
3
que le

'render element' => 'form'

あなたのレンダリング要素はformです。これは、提供されたすべての変数がそこに渡されることを意味します。

twigテンプレートでは、ここのようにフォームをレンダリングできます

<div>{{ form.form }}</div>

更新#1

わぁ、名前空間が間違っていますDrupal\cmodule\Forms\RequestForm

Drupal\cmodule\Form\RequestFormである必要があります

フォームの名前をフォームに変更し(ディレクトリも同じ)、キャッシュをクリアしてください。それはあなたを助けるはずです。

5
Alex Kuzava

参照: https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Render!theme.api.php/function/hook_theme/8.2.x

各情報配列には、 'variables'要素(#theme要素を使用する場合)または 'render要素'要素(render要素の場合)のいずれかが含まれている必要があります両方ではありません

manage_cmodule_pageではvariablesrender elementの両方が必要ですが、これは許可されていません。コードの残りの部分が機能している場合は、variables配列をhook_themeから削除すると、これが機能するはずです。

2
Beebee