現在作成中のサイトには、さまざまなビューがあり、すべて異なるページに複数の表示モードがあります。
たとえば、私は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
変数に基づいてテーマの提案を追加する必要があります。
あなたのソリューションは良いですが、よりクリーンなものがあります。 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 の詳細情報
同様の質問があり、回答は良好でしたが、私のケースにすべてを提供するわけではありませんでした。さらに、拡張に役立つように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テンプレートファイルに対応します。
views-view-field--my-field-name.html.twig
_views-view--my-views-id.html.twig
_views-view-unformatted--my-views-id.html.twig
_それで、最終的に私は次の解決策を思いつきました。基本的に、現在の$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
*/
}
( からのクロスポストビューのテーマの提案が表示されません )
これはDrupal 8コアのバグで、現在バージョンで作業中です 8.6 8.7
今すぐ機能が必要な場合は、2つのオプションがあります。
Issue#2923634 のコメント#22(以降)のパッチと Issue#2752443のパッチをお試しください 。 #2923634のコメントスレッドを読んで、ここで何が行われているのかを完全に理解してください。
または、上記のオプション1のために延期された 問題#2118743 のコメント#139からよく吟味されたパッチを使用します。
オプション2のパッチ( #2118743 )を正常に使用しています。これは、標準のコアコントリビューターの推奨事項に反することに注意してください。しかし、その理由は、#2118743には、開発中にのみ有効化/使用される何かに対して、十分に吟味された単一の実用的なパッチがあり、まだ開発中の2つの個別のパッチのさまざまな組み合わせをテストする必要がないためです。より良い解決策( #2923634 および #2752443 )が修正されるとコア、#2118743は不要になり、不要になりました。
ダニエルズの回答に追加するために、提案はダッシュではなくアンダースコアでフォーマットする必要があると答えます:$suggestions[] = 'views_view__venues_grid_rows';
私の問題は少し異なっていましたが、ここでは関係があると思います。フィールドプラグイン「レンダリングされたエンティティ」を介してレンダリングされるエンティティに、テーマフックの提案を提供する必要があります。これが私の解決策です。
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'];
}
}
}