template_preprocess_views_exposed_form()
(またはさらに優れたtemplate_preprocess_views_exposed_form__search_content()
)を使用して、(_ search_content_ビューの)公開されたフォームにフォームタグにクラスを追加するにはどうすればよいでしょうか。フォームはブロックとして公開されます。
これまでのところ、MY_THEME.theme内の次のコードを使用して機能します。
_function MY_THEME_preprocess_form(&$variables) {
if ($variables['element']['#form_id'] == 'views_exposed_form' && $variables['element']['#view_id'] == 'search_content') {
$variables['attributes']['class'][] = 'row';
}
}
_
しかし、私はそれを動作させることができません:
_function MY_THEME_preprocess_views_exposed_form__search_content(&$variables) {
// I tried:
// $variables['attributes']['class'][] = 'does-not-work';
// and also:
// $variables['attributes'] = new Attribute($variables['attributes']);
// $variables['attributes']->addClass('does-not-work');
// and also manipulating $variables['form'], but this didn't work either.
}
_
関数が呼び出されますが、フォームタグにクラスが追加されていません。 template_preprocess_views_exposed_form()
?で動作させることは可能ですか?
各関数のkint($variables)
出力のスクリーンショット:
Template_preprocess_views_exposed_form()で動作させることは可能ですか?
短いバージョン:hook_preprocess_views_exposed_form()
を使用して_<form>
_タグを変更することはできません。 _<form>
_タグは、_#theme_wrappers
_ renderプロパティを介して設定されたform
テーマフックによって個別にレンダリングされます。つまり、ビューが公開されたフォームの(内部)コンテンツをレンダリングする実際の_views_exposed_form
_テーマフックから完全に分離されます。
ロングバージョン:
views_theme()
は、_views_exposed_form
_テーマフックをフォームレンダリング要素を返すものとして定義します。つまり、最終的に Form render element によって提供される定義が(何らかの方法でオーバーライドされない限り)使用されることになります。これを見ると、その定義によってthe _'#theme_wrappers'
_プロパティが_['form']
_に設定されていることがわかります。今のところ驚きはありません。 :-)ビューページ(またはブロック)のテーマ設定のある時点で、テーマフック_views_view
_が機能します。このテーマフックには、基本的に目的の公開フォームであるexposed
レンダー変数が含まれています。exposed
のレンダー配列は、次の2つの関連プロパティを保持しています。
#theme => views_exposed_form
_(および_views_exposed_form__search_content
_などのより具体的なもの):これは、フォームのコンテンツ、つまり_<form>
_タグ内のすべてを提供するテーマフックです。これは、template_preprocess_views_exposed_form()
を呼び出すときにアクセスして変更するオプションを提供するものです。このテーマフックは_<form>
_タグのレンダリングを担当せず、変更することはできません。#theme_wrappers => ['form']
_:これは、テーマフックの_#theme_wrappers
_リストです。 form
は実際の_<form>
_タグを提供します。これは、基本的に_#theme
_テーマフックによって生成されたマークアップを_<form>
_タグに囲みます。これは、template_preprocess_form()
を呼び出すときにアクセスできるものです。このテーマは_<form>
_タグのレンダリングを担当し、変更できるようにします。実装の提案
hook_form_alter()
実装でフォーム関連のロジックを処理する場合は、別の前処理フックを使用して、必要な機能を実装できます。つまり、preprocess_views_view()
フックです。
_function MY_THEME_preprocess_views_view(&$variables) {
if ($variables['id'] === 'search_content') {
$variables['exposed']['#attributes']['class'][] = 'row';
}
}
_
頑張ってください、これは本当に良い質問です!
これは、以下のスクリーンショットで確認できるように、公開されたフォームに対して発生したフックが実際には「フォーム」であるためです。
そして、これが enable twig debug にすることが常に良い考えである理由です。
それが役に立てば幸い!
編集
さらに詳しく説明するには:
これは別のフックであるため、フォームに表示される前処理関数はフォーム自体を編集しません。クラスをフォームに追加する適切な方法は、フォームを自分で変更するか、フォームを使用することです https://api.drupal.org/api/drupal/core%21includes%21form.inc/function/template_preprocess_form/8.6 .x この関数はフォーム自体に属性を追加する責任があるためです。 twigソース https://api.drupal.org/api/drupal/core%21themes%21stable%21templates%21form%21form.html.twig/8.6 .x 属性がそこに印刷されていることがわかります。
公開されたフィルターにform
タグにClassを追加するだけの場合は、 hook_form_FORM_ID_altertemplate_preprocess_views_exposed_form()
またはtemplate_preprocess_views_exposed_form__search_content()
のように行うことができます以下:
use Drupal\Component\Utility\Html;
/**
* Implements hook_form_FORM_ID_alter().
*/
function myModuleName_form_views_exposed_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
$form['#attributes']['class'][] = Html::cleanCssIdentifier('your-new-class');
}