web-dev-qa-db-ja.com

template_preprocess_views_exposed_form()を介してビューを公開したフォームのフォームタグにクラスを追加します

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)出力のスクリーンショット:

enter image description here

Template_preprocess_views_exposed_form()で動作させることは可能ですか?

2
LarS

短いバージョン:hook_preprocess_views_exposed_form()を使用して_<form>_タグを変更することはできません。 _<form>_タグは、_#theme_wrappers_ renderプロパティを介して設定されたformテーマフックによって個別にレンダリングされます。つまり、ビューが公開されたフォームの(内部)コンテンツをレンダリングする実際の_views_exposed_form_テーマフックから完全に分離されます。

ロングバージョン:

  1. views_theme() は、_views_exposed_form_テーマフックをフォームレンダリング要素を返すものとして定義します。つまり、最終的に Form render element によって提供される定義が(何らかの方法でオーバーライドされない限り)使用されることになります。これを見ると、その定義によってthe _'#theme_wrappers'_プロパティが_['form']_に設定されていることがわかります。今のところ驚きはありません。 :-)
  2. ビューページ(またはブロック)のテーマ設定のある時点で、テーマフック_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';
  }
}
_

頑張ってください、これは本当に良い質問です!

6

これは、以下のスクリーンショットで確認できるように、公開されたフォームに対して発生したフックが実際には「フォーム」であるためです。
enter image description here

そして、これが 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 属性がそこに印刷されていることがわかります。

0
Ismail Cherri

公開されたフィルターに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');
}
0
berramou