web-dev-qa-db-fra.com

Ajout d'une classe à une région

Je travaille sur mon thème dans Drupal 8 et je veux ajouter une classe à ma div d'en-tête. J'ai essayé de l'ajouter au fichier region.vars.php.

if ($region === 'header') {
  $variables[header]['class'][] = 'navbar-right';
}

Mais ça ne marche pas. Il s'agit du fichier complet 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';
  }

}

J'ai obtenu la plupart de ce code du thème Drupal 8 bootstrap. Tout le reste fonctionne.

4
Tyler

Ce que je fais normalement pour tous mes thèmes est d'ajouter la classe region region-name Manquante à chaque région en implémentant hook_preproccess_HOOK dans 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

Dans Drupal 8, il y a un fichier .theme dans votre répertoire themes/[nom-thème]. Vous pouvez y écrire votre prétraitement, par exemple hooks_preprocess_page(&$variables){}, où vous pouvez vérifiez le type de contenu du nœud et d'autres champs.

Pour votre cas, vous pouvez passer le type de contenu dans une variable comme dans le code suivant.

 $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;`
   }
 }

Cette variable sera disponible pour vous dans votre page.html.twig (le modèle de page).

Il existe déjà une variable appelée page.header, qui indique l'en-tête de la page. Vous pouvez insérer le <div> environ page.header.

{%if content_type == 'articles' %}
<div class='extra-header-class'>{{ page.header }}
</div>{% else %}
{{ page.header }}
{% endif %}
0
Ashish Deynap

En utilisant $variables['attributes']['class'][] = 'navbar-right'; ajoute la classe au div enveloppant la région. Je l'ai ajouté dans le fichier .theme (ancien template.php en D7).

0
littlethoughts