web-dev-qa-db-ja.com

カスタムフォームのテーマを設定するにはどうすればよいですか?

単純なクラスフォーム「MyformtestForm」を使用して、単純なモジュール「myformtest」を生成します。フォームに別のテーマを使用したい。

私はこの素晴らしい チュートリアル に従いました。 「myformtest.module」に「_theme_suggestions_alter」フックを追加し、twigデバッグをアクティブにして、フォームページをロードしました。

enter image description here

私の「提案テーマ」が存在し、その名前は「form--myformtest-form.html.twig」です。次に、私のモジュールディレクトリで:

  • サブディレクトリ「テンプレート」を追加しました
  • twig file "form--myformtest-form.html.twig"をサブディレクトリ "drupal/modules/custom/myformtest/templates"に追加しました

twigファイルに、この単純なコードを追加しました(drupal/core/themes/classy/templates/form/form.html.twigからコピーして、h1 html要素をオーバーライド)

<h1>TEST</h1>
<form{{ attributes }}>
    {{ children }}
</form>

キャッシュをクリアし(drush cr)、フォームページを再読み込みしました。しかし、html要素h1( "TEST")は表示されません!私の間違いはどこですか?

[〜#〜] up [〜#〜]

やったよ ! .moduleファイルにフックテーマを追加しました。

function myformtest_theme($existing, $type, $theme, $path)
{
  return array(
    'form__myformtest_form' => array(
      'render element' => 'form',
      'template' => 'form--myformtest-form',
    ),
  );
}

だが.... !フォームページを読み込むと、html要素h1 "test"が表示されますが、フォームは表示されません:/私の.twigファイルがform.html.twigのデフォルトのテーマをオーバーライドすると思いました.

enter image description here

私は何か見落としてますか ?フォームが表示されないのはなぜですか、どうすれば修正できますか?そして、どのようにしてカスタム配列をフォームクラスのビルドメソッドから私のtwigテンプレートに渡すことができますか?

2
matthieu lopez

これが解決策です:

デフォルトのフォームtwig contentが機能しない理由(属性と子変数が機能しない理由)をコピーして貼り付けた理由がわかりません)

私はすべての利用可能なtwig変数をカスタムテンプレートから({{dump()}}を介して)ダンプしました。「要素」という名前の配列があることがわかりました。これとその作業を試しました!フォームが表示されます。

これは私のカスタムフォームテンプレートのコードです:

<h1>TEST</h1>
<form{{ element }}></form>
0
matthieu lopez

同様の問題が発生しています。そして、次のように解決しました。

私のMYMODULE.moduleファイル:

function MYMODULE_theme($existing, $type, $theme, $path) {

  return [
    'mythemename' => [
      'render element' => 'form',
      'template' => 'my-template-name',
    ],
  ];
}

の中に $form

$form['#theme'] = 'mythemename';

そして最後にmy-template-name.html.twig テンプレート:

<div class="someclass">
  {{ form }}
</div>
2
David Coote

フォーム要素にはすでにベーステンプレートがあります。

ベーステンプレートを上書きするには、テーマのテンプレートディレクトリにtwigファイルを追加する必要があります。

モジュールのテンプレートディレクトリは、ベーステンプレートを提供するために存在します。

0
Eyal

Form.html.twigファイルの内容をカスタムテンプレートにコピーする必要があると思います。その後、カスタムテンプレートにさらに変更を加えることができます。このようにして、フォームがページにレンダリングされます。

0
Umed Godd