Drupal 8でテーマに取り組んでおり、ヘッダーdivにクラスを追加したいと思っています。これをregion.vars.phpファイルに追加してみました。
if ($region === 'header') {
$variables[header]['class'][] = 'navbar-right';
}
ただし、機能しません。これは完全なregion.vars.phpファイルです。
<?php
/**
* @file
* region.vars.php
*/
use Drupal\Core\Template\Attribute;
/**
* Implements hook_preprocess_region().
*/
function bootstrap_preprocess_region(&$variables) {
$region = $variables['elements']['#region'];
$variables['region'] = $region;
$variables['content'] = $variables['elements']['#children'];
$theme = \Drupal::theme()->getActiveTheme()->getName();
// Content region.
if ($region === 'content') {
// @todo is this actually used properly?
$variables['theme_hook_suggestions'][] = 'region__no_wrapper';
}
// Help region.
elseif ($region === 'help' && !empty($variables['content'])) {
$content = $variables['content'];
$variables['content'] = array(
'icon' => array(
'#markup' => _bootstrap_icon('question-sign'),
),
'content' => array(
'#markup' => $content,
),
);
$variables['attributes']['class'][] = 'alert';
$variables['attributes']['class'][] = 'alert-info';
$variables['attributes']['class'][] = 'messages';
$variables['attributes']['class'][] = 'info';
}
// Support for "well" classes in regions.
static $wells;
if (!isset($wells)) {
foreach (system_region_list($theme) as $name => $title) {
$wells[$name] = bootstrap_setting('region_well-' . $name);
}
}
if (!empty($wells[$region])) {
$variables['attributes']['class'][] = $wells[$region];
}
if ($region === 'header') {
$variables[header]['class'][] = 'navbar-right';
}
}
私はこのコードのほとんどをDrupal 8 bootstrapテーマから取得しました。それ以外はすべて機能しています。
私がすべてのテーマで通常行うことは、region region-name
に hook_preproccess_HOOK
を実装して、欠落しているMYTHEME.theme
クラスを各リージョンに追加することです。
/**
* Implements template_preprocess_region().
*/
function MYTHEME_preprocess_region(&$variables) {
// Add missing region CSS classes.
$variables['attributes']['class'][] = 'region';
if (isset($variables['region']) && !empty($variables['region'])) {
$variables['attributes']['class'][] = 'region-' . str_replace('_', '-', $variables['region']);
}
}
Drupal 8の場合、themes/[theme-name]ディレクトリ内に.themeファイルがあります。ここにhooks_preprocess_page(&$variables){}
などのプリプロセスを書き込むことができます。ノードのコンテンツタイプと他のフィールドを確認します。
あなたのケースでは、次のコードのように、コンテンツタイプを変数で渡すことができます。
$node = \Drupal::routeMatch()->getParameter('node');
if (isset($node)) {
$entity = entity_load('node', $node->nid->value);
if ($entity) {
$type = $entity->get('type')->getValue();
$variables['content_type'] = $type;`
}
}
この変数は、page.html.twig(ページテンプレート)で使用できます。
すでにページのヘッダーを示すpage.headerと呼ばれる変数があります。 <div>
の周りにpage.header
を挿入できます。
{%if content_type == 'articles' %}
<div class='extra-header-class'>{{ page.header }}
</div>{% else %}
{{ page.header }}
{% endif %}
$variables['attributes']['class'][] = 'navbar-right';
を使用すると、領域をラップするdivにクラスが追加されます。 .themeファイルに追加しました(D7では以前のtemplate.php)。