web-dev-qa-db-ja.com

リージョンにクラスを追加する

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テーマから取得しました。それ以外はすべて機能しています。

4
Tyler

私がすべてのテーマで通常行うことは、region region-namehook_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']);
  }
}
2
leymannx

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 %}
0
Ashish Deynap

$variables['attributes']['class'][] = 'navbar-right';を使用すると、領域をラップするdivにクラスが追加されます。 .themeファイルに追加しました(D7では以前のtemplate.php)。

0
littlethoughts