カスタムテンプレート内にフォームを追加しようとしています。 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 }}
'render element' => 'form'
あなたのレンダリング要素はformです。これは、提供されたすべての変数がそこに渡されることを意味します。
twigテンプレートでは、ここのようにフォームをレンダリングできます
<div>{{ form.form }}</div>
更新#1
わぁ、名前空間が間違っていますDrupal\cmodule\Forms\RequestForm
Drupal\cmodule\Form\RequestFormである必要があります
フォームの名前をフォームに変更し(ディレクトリも同じ)、キャッシュをクリアしてください。それはあなたを助けるはずです。
各情報配列には、 'variables'要素(#theme要素を使用する場合)または 'render要素'要素(render要素の場合)のいずれかが含まれている必要があります両方ではありません。
manage_cmodule_page
ではvariables
とrender element
の両方が必要ですが、これは許可されていません。コードの残りの部分が機能している場合は、variables
配列をhook_themeから削除すると、これが機能するはずです。