web-dev-qa-db-ja.com

ビュー(行とフィールド)のプログラムによるテーマの提案の追加

現在作成中のサイトには、さまざまなビューがあり、すべて異なるページに複数の表示モードがあります。

たとえば、私はvenuesビューを持っています。1つのブロックはlistingという名前で、私のvenuesコンテンツタイプをすべてリストしています。より具体的なコンテキストフィルターを持つ別のブロックがあります。

私の問題は、この異なるブロックのスタイルが同じで、マークアップがlistingブロックと同じであるため、Twigのテンプレートを複製する必要がない行とフィールド、私が持っている表示モードごとに。

私の考えは、特定のビューの表示モードを一覧表示できる関数を.themeファイルに追加し、その後ろに単一のテーマ提案を追加することでした。このようにして、Twigテンプレートの名前を変更し、行レベルとフィールドレベルで同じテンプレートを、必要な数の表示モードで再利用できます。

テーマの提案の変更フックを使用していないため、実際にテーマの提案を追加する方法がわかりません。

これが私がこれまでに得たものです:

/**
 * Theme suggestions for views.
*/
function spve_preprocess_views_view(&$variables) {
  $view = $variables['view'];
  $id = $view->storage->id();

  // Venues
  if($id === 'venues') {
    // Venues grid
    switch($view->current_display) {
      case 'single_occasion_type_listing':
        $suggestion = 'views-view--venues-grid';
        break;

      default:
        $suggestion = null;
        break;
    }
  }
}

明らかに、テーマの提案を追加するには、$suggestionを正しい関数に置き換えるか、関数の最後にビットを追加して、$suggestion変数に基づいてテーマの提案を追加する必要があります。

6
Daniel Dewhurst

あなたのソリューションは良いですが、よりクリーンなものがあります。 hook_theme_suggestions_HOOK_alterなので、それがviewかどうか、または確認したいものかどうかを確認する必要はありません。

あなたの場合は次のようになります:

    function spve_theme_suggestions_views_view_alter(array &$suggestions, array $variables) {
        // If you want you can add a template suggestion for all views
        // based on their ID:
        $suggestions[] = sprintf('views_view__%s', $variables['view']->id());

        // Or you can check the ID, add suggestions, do whatever you want
        // ...
    }

    function spve_theme_suggestions_views_view_field_alter(array &$suggestions, array $variables) {
        // Check here the id, add suggestions, do whatever you want
        // ...
    }

Drupal Theme API の詳細情報

8
btemperli

同様の質問があり、回答は良好でしたが、私のケースにすべてを提供するわけではありませんでした。さらに、拡張に役立つように3セントを追加して1分が経過しました...

ビューテンプレートの提案を追加します。

_/**
 * Implements hook_theme_suggestions_HOOK_alter().
 *
 * Add views template suggestions.
 * 
 * @inheritdoc
 */
function HOOK_theme_suggestions_views_view_alter(array &$suggestions, array $variables) {
  return [
    'views_view__' . $variables['view']->id()
  ];
}
_

ビュー表示テンプレートの提案を追加しますか???:

_/**
 * Implements hook_theme_suggestions_HOOK().
 *
 * Add views template suggestions.
 * 
 * @inheritdoc
 */
function HOOK_theme_suggestions_views_view(array $variables) {
  return [
    'views_view_display__' . $variables['view']->current_display,
  ];
}
_

ビューのフォーマットされていないテンプレートの提案を追加します。

_/**
 * Implements hook_theme_suggestions_HOOK_alter().
 *
 * Add views unformatted template suggestions.
 * 
 * @inheritdoc
 */
function HOOK_theme_suggestions_views_view_unformatted_alter(array &$suggestions, array $variables) {
  return [
    'views_view_unformatted__' . $variables['view']->id()
  ];
}
_

ビューフィールドテンプレートの提案を追加します。

_/**
 * Implements hook_theme_suggestions_HOOK().
 *
 * Add views field template suggestions.
 * 
 * @inheritdoc
 */
function HOOK_theme_suggestions_views_view_field(array $variables) {
  return [
    'views_view_field__' . $variables['field']->field
  ];
}
_

また、カスタムモジュールで作業している場合は、hook_theme()を使用してテンプレートファイルをテーマレジストリに追加する必要があることも追加します。

_/**
 * Implements hook_theme().
 *
 * Add template files to the theme.
 * 
 * @inheritdoc
 */
function HOOK_theme($existing, $type, $theme, $path) {
  return [
    // Field templates.
    'views_view_field__my_field_name' => [
      'template' => 'views-view-field--my-field-name',
      'base hook' => 'views_view_field',
    ],
    // Views templates.
    'views_view__my_views_block' => [
      'template' => 'views-view--my-views-id',
      'base hook' => 'views_view',
    ],
    // Views unformatted templates.
    'views_view_unformatted__my_views_block' => [
      'template' => 'views-view-unformatted--my-views-id',
      'base hook' => 'views_view_unformatted',
    ],
  ];
}
_

上記のHOOK_theme()は、次のTwigテンプレートファイルに対応します。

  1. _views-view-field--my-field-name.html.twig_
  2. _views-view--my-views-id.html.twig_
  3. _views-view-unformatted--my-views-id.html.twig_
4
Prestosaurus

それで、最終的に私は次の解決策を思いつきました。基本的に、現在の$hookはビューです。次に、ビューが提案を追加するビューであるかどうかを確認し、行レベルとフィールドレベルの両方を確認します。

より良い解決策を見つけた/知っている場合は、それを共有してください!

function spve_theme_suggestions_alter(array &$suggestions, array $variables, $hook) {

  /**
   * Venues Grid Twig Template Suggestions
   */
  // Firstly check it's a view
  if($hook === 'views_view') {
    // Check if it's the 'venue' view
    if($variables['view']->id() === 'venues') {
      // Check the display mode
      switch($variables['view']->current_display) {
        case 'listing':              
        case 'single_occasion_type_listing':
          $suggestions[] = 'views-view--venues-grid-rows';
          break;
        default:
          break;
      }
    }
  }

  // Firstly check it's a view field
  if($hook === 'views_view_field') {
    // Check if it's the 'venue' view
    if($variables['view']->id() === 'venues') {
      // Check the display mode
      switch($variables['view']->current_display) {
        case 'listing':              
        case 'single_occasion_type_listing':
          $suggestions[] = 'views-view--venues-grid-field';
          break;
        default:
          break;
      }
    }
  }
  /**
   * E/O Venues Grid Twig Template Suggestions
   */
}
4
Daniel Dewhurst

からのクロスポストビューのテーマの提案が表示されません

これはDrupal 8コアのバグで、現在バージョンで作業中です 8.6 8.7

今すぐ機能が必要な場合は、2つのオプションがあります。

  1. Issue#2923634 のコメント#22(以降)のパッチと Issue#2752443のパッチをお試しください 。 #2923634のコメントスレッドを読んで、ここで何が行われているのかを完全に理解してください。

  2. または、上記のオプション1のために延期された 問題#2118743 のコメント#139からよく吟味されたパッチを使用します。

オプション2のパッチ( #2118743 )を正常に使用しています。これは、標準のコアコントリビューターの推奨事項に反することに注意してください。しかし、その理由は、#2118743には、開発中にのみ有効化/使用される何かに対して、十分に吟味された単一の実用的なパッチがあり、まだ開発中の2つの個別のパッチのさまざまな組み合わせをテストする必要がないためです。より良い解決策( #2923634 および #2752443 )が修正されるとコア、#2118743は不要になり、不要になりました。

1
JamesWilson

ダニエルズの回答に追加するために、提案はダッシュではなくアンダースコアでフォーマットする必要があると答えます:$suggestions[] = 'views_view__venues_grid_rows';

0
KalleVu

私の問題は少し異なっていましたが、ここでは関係があると思います。フィールドプラグイン「レンダリングされたエンティティ」を介してレンダリングされるエンティティに、テーマフックの提案を提供する必要があります。これが私の解決策です。

  • 私のモジュールは「エントリ」という名前です
  • 私のビューIDは「entries」です

Entry.moduleファイルで:

/**
 * Adds theme suggestions for Field in a View
 *
 * @see hook_theme_suggestions_HOOK_alter()
 * @param array $suggestions
 * @param array $variables
 */
function entry_theme_suggestions_views_view_field_alter(array &$suggestions, array $variables) {
  /** @var \Drupal\views\Entity\View $view */
  $view = $variables['view'];
  if ($view->id() == 'entries') {
    $field = $variables['field'];
    if ($field instanceof \Drupal\views\Plugin\views\field\RenderedEntity) {
      $suggestions[] = 'views_view_field__' . $field->options['view_mode'];
    }
  }
}
0
jimconte