web-dev-qa-db-fra.com

Ajout de suggestions de thèmes par programme pour les vues (lignes et champs)

Pour un site que je suis en train de créer, j'ai une variété de vues, toutes avec plusieurs modes d'affichage pour différentes pages.

Par exemple, j'ai une vue venues, un bloc nommé listing qui répertorie tous mes venues type de contenu. J'ai un autre bloc qui a des filtres contextuels plus spécifiques.

Mon problème est que ce bloc différent est du même style et a le même balisage que mon bloc listing, donc je ne veux pas avoir à dupliquer mes modèles Twig pour le lignes et champs, pour chaque mode d'affichage que j'ai.

Mon idée était d'ajouter une fonction à mon .theme fichier qui me permettrait de lister les modes d'affichage pour une certaine vue, et d'ajouter une suggestion de thème unique à l'arrière de cela. De cette façon, je peux renommer mes modèles Twig, et réutiliser les mêmes pour le niveau ligne et champ, sur autant de modes d'affichage que je le souhaiterais.

Comme je n'utilise pas de crochet de suggestions de thème, je ne sais pas comment ajouter des suggestions de thème.

Voici ce que j'ai jusqu'à présent:

/**
 * 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;
    }
  }
}

Évidemment, je devrais remplacer soit $suggestion avec la fonction correcte pour ajouter une suggestion de thème, ou ajouter un peu à la fin de ma fonction pour ajouter une suggestion de thème basée sur mon $suggestion variable.

6
Daniel Dewhurst

Votre solution est bonne, mais il y en a une plus propre. Vous pouvez utiliser le hook_theme_suggestions_HOOK_alter, vous n'avez donc pas à vérifier s'il s'agit d'un view ou de tout ce que vous voulez vérifier.

Dans votre cas, cela ressemblerait à ceci:

    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
        // ...
    }

Plus d'informations dans API Drupal Theme

8
btemperli

J'avais une question similaire, et bien que les réponses soient bonnes, elles n'ont pas tout fourni pour mon cas. De plus, cela fait une minute, en ajoutant mes 3 cents pour aider à l'expansion ...

Ajouter des suggestions de modèles de vues:

/**
 * 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()
  ];
}

Ajouter des suggestions de modèles d'affichage de vues ???:

/**
 * 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,
  ];
}

Ajoutez des suggestions de modèles non formatés pour les vues:

/**
 * 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()
  ];
}

Ajouter des suggestions de modèles de champ de vues:

/**
 * 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
  ];
}

Et je veux également ajouter que si vous travaillez dans un module personnalisé, vous devrez peut-être ajouter les fichiers de modèle à votre registre de thèmes en utilisant 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',
    ],
  ];
}

Et la HOOK_theme() ci-dessus correspondrait aux fichiers de modèle Twig:

  1. views-view-field--my-field-name.html.twig
  2. views-view--my-views-id.html.twig
  3. views-view-unformatted--my-views-id.html.twig
4
Prestosaurus

Donc, j'ai finalement trouvé la solution suivante. Fondamentalement, je vérifie si le courant $hook est une vue, puis vérifie si la vue est la vue pour laquelle je souhaite ajouter des suggestions, puis vérifie les niveaux de ligne et de champ.

Si vous trouvez/connaissez une meilleure solution, partagez-la!

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
   */
}
4
Daniel Dewhurst

(Cross-post de Je ne vois pas les suggestions de thème de vues )

Ceci est un bug dans Drupal 8 core, actuellement en cours de développement pour la version 8.6 8.7

Si vous avez besoin de la fonctionnalité maintenant, vous avez deux options:

  1. Essayez les correctifs du commentaire # 22 (ou plus récent) sur problème # 2923634 et les correctifs sur problème # 275244 . Lisez le fil de commentaires sur # 2923634 pour bien comprendre ce qui se passe ici.

  2. Ou utilisez le correctif bien vérifié du commentaire # 139 sur problème # 211874 qui a été reporté en faveur de l'option 1 ci-dessus.

J'utilise le patch de l'option 2 ( # 211874 ) avec succès. Veuillez noter que cela va à l'encontre des recommandations standard des principaux contributeurs. Mais la raison en est que # 2118743 a un seul correctif bien vérifié et fonctionnel pour quelque chose qui n'est activé/utilisé que pendant le développement et au lieu d'avoir à tester différentes combinaisons de deux correctifs distincts qui sont encore en cours de développement. Une fois que la meilleure solution ( # 2923634 et # 275244 ) a été corrigée dans le noyau, # 2118743 devrait être évitée et plus nécessaire.

1
JamesWilson

Juste pour ajouter à la réponse de Daniels que les suggestions doivent être formatées avec des traits de soulignement au lieu de tirets: $suggestions[] = 'views_view__venues_grid_rows';

0
KalleVu

Mon problème était un peu différent, mais je pense qu'il est pertinent ici. J'ai besoin de fournir une suggestion de crochet de thème pour une entité qui est rendue via le plugin de champ "Entité rendue". Voici ma solution.

  • Mon module est nommé "entrée"
  • Mon identifiant de vue est "entrées"

Dans le fichier 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'];
    }
  }
}
0
jimconte