web-dev-qa-db-ja.com

1つの送信ボタンのみのcontainer.html.twigテンプレートをオーバーライドするにはどうすればよいですか?

1つの送信ボタンのみのcontainer.html.twigをオーバーライドするにはどうすればよいですか?

テンプレートの提案は表示されません。 Here is my template sugestions

3
Mariamita

キエミの答えにいくらか基づいて、あなたはこの程度の何かに行くことができます:

<?php

/**
 * Implements hook_theme_suggestions_container_alter().
 */
function yourtheme_theme_suggestions_container_alter(array &$suggestions, array $variables) {
  $pieces = [
    $variables['element']['#type'],
    $variables['element']['#name'],
    $variables['element']['#display_id'],
  ];
  $suggestions[] = 'container__' . implode('_', $pieces);
}

これにより、たとえばcontainer--view-articles-featured.html.twigの提案が生成されます

もちろん、それが本当のDrupalテンプレート提案標準に従うようにしたい場合は、さまざまなレベルの具体性を持ついくつかの提案を追加する必要があります。

3
Matt Fletcher
function MYTHEME_theme_suggestions_container_alter(array &$suggestions, array $variables) {
  $suggestions[] = 'container__';
}

このようなものをテーマに入れることができます。同じことをしようとしていますが、変数を取得する方法がわかりません...

1
kiemi

Template Suggest モジュールにコンテナテンプレートの提案が含まれるようになりました。ビューに提供されるものの例:

 FILE NAME SUGGESTIONS:
   * container--view--case-study--page-listing.html.twig
   * container--view--case-study.html.twig
   x container--view.html.twig
   * container--no-parent.html.twig
   * container.html.twig

送信ボタンの元のポストユースケースの場合、送信ボタンの周りの一般的なコンテナが提供するものは次のとおりです。

 FILE NAME SUGGESTIONS:
   * container--actions.html.twig
   * container--has-parent.html.twig
   x container.html.twig

そのため、送信ボタンを含むすべてのアクションを含むコンテナを、container--actions.html.twigテンプレートを使用して簡単にターゲティングできます。 (または、container--has-parent.html.twigを含むすべてのフォームコンテナ。)

ただし、目標が本当に1つの特定の送信ボタンのコンテナーをターゲットにすることであり、他の送信ボタンではない場合、かなり難しくなります。問題は、フォームのIDも、モジュールが提供するテンプレートの提案よりも正確ではないことです(たとえば、このコアフォームには、IDとしてedit-actionsがあり、提案を取得するWebフォームcontainer--webform-actions.html.twigは単にIDを取得しますedit-actions!)

1つのアプローチは、container--actions.html.twigをオーバーライドしてdivなどを削除し、必要に応じてinput--submit.html.twigテンプレート(コアが提供する提案)でそれらを再現することです。ただし、コンテナには複数の入力ボタンを含めることができるため、これは危険です。

これらのボタン自体の情報は本来一意ではないため(たとえば、コア管理フォームではedit-submitのID、Webフォームではedit-actions-submitのID)、可能なテンプレートの提案やアプローチをさらに掘り下げることは控えます元のポスター(または他の利害関係者!)が彼らの意図を正確に明らかにできるまで。

モジュールが使用するコードは、もともと 関連する投稿でのKevinの回答 に基づいています。

function twigsuggest_theme_suggestions_container_alter(array &$suggestions, array $variables) 
{
  $element = $variables['element'];

  // We cannot count on template_preprocess_container having run, so we copy
  // its logic here to provide templates for forms (has parents) or not forms.
  // Special handling for form elements.
  if (isset($element['#array_parents'])) {
    $suggestions[] = 'container__has_parent';
  }
  else {
    $suggestions[] = 'container__no_parent';
  }

  if (isset($element['#type']) && $element['#type'] != 'container') {
    $suggestions[] = 'container__' . $element['#type'];
  }

  if (isset($element['#type']) && $element['#type'] == 'container' && isset($element['children']['#type'])) {
    $suggestions[] = 'container__' . $element['children']['#type'];
  }
}
1
mlncn