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.
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']);
}
}
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 %}
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).