web-dev-qa-db-fra.com

Remplacer une suggestion de modèle de nœud avec un modèle dans un module personnalisé

Nous avons un type de contenu qui est ajouté au système drupal par programme lorsque nous installons l'un de nos modules personnalisés. Essentiellement, le module gère les données de propriété entrantes d'un tiers et crée une entité de nœud pour chaque propriété .

Le type de contenu créé est nommé properties et en tant que tel, sa suggestion de modèle affichée dans Twig debugging is node--properties--full.html.twig, voir ci-dessous:

enter image description here

Je crée un deuxième module personnalisé appelé lrg_property_display et mon intention est que ce module gère toutes les fonctionnalités liées au rendu, car je souhaite conserver les fonctionnalités liées à l'importation d'API distinctes du rendu. La structure de mon module est illustrée ci-dessous:

enter image description here

J'ai créé mon module et suivi quelques suggestions de sites que je crée simplement un fichier modèle dans mon module et dans le fichier .module implémenter le HOOK_THEME méthode, que j'ai fait comme indiqué:

function lrg_property_display_theme($existing, $type, $theme, $path)
{
    $theme['node__property_display__full'] = [
        'template' => 'node--property-display--full',
        'base hook' => 'node'
    ];

    return $theme;
}

Vider le cache et actualiser la page montre cependant que le thème n'a pas été appliqué.

Où vais-je me tromper avec ça s'il vous plaît? J'ai essentiellement besoin du node--property-display--full.html.twig modèle dans le module à utiliser chaque fois qu'un nœud de type Properties est affiché.

[~ # ~] mise à jour [~ # ~]

J'ai ajouté le code suivant à mon fichier de thème (le nom du thème est white_label) qui semblait produire une erreur suggérant que cela fonctionne "presque", albiet je préférerais ne pas avoir à faire de suggestion dans le thème mais la vouloir dans le module. Je peux vivre avec si cela fonctionne à court/moyen terme:

function white_label_theme($existing, $type, $theme, $path)
{
    return array(
        'node__properties__full' => array(
            'render element' => 'elements',
            'template' => 'node--property-display--full',
            'base hook' => 'node',
            'path' => drupal_get_path('module', 'lrg_property_display') . '/templates',
        )
    );
}

Il recherche ensuite le modèle node--property-display--full.html.twig mais sa recherche dans le répertoire principal du thème et non dans le module, même avec la spécification du chemin.

L'erreur renvoyée était:

he website encountered an unexpected error. Please try again later.Twig_Error_Loader: Template "themes/custom/white_label/templates/nodes/node--property-display--full.html.twig" is not defined.

Image de référence pour un commentaire dans la réponse de @ Leigh

enter image description here

2
John Cogan

Votre clé de tableau n'est-elle pas fausse? Ça devrait être:

 $theme['node__property__full'] = [
    'template' => 'node--property-display--full',
    'base hook' => 'node'
];

Si vous souhaitez cibler l'affichage "complet" et que votre type de contenu a un nom de machine "propriété"

Je fais quelque chose de similaire pour cibler un nœud de type "news" et afficher le nœud "teaser":

function mymodule_theme($existing, $type, $theme, $path) {
  return [
   'node__news__teaser' => [
      'template' => 'node--news--teaser',
      'base hook' => 'node'
    ],
  ];
}

Et ma structure de dossiers est:

/modules/custom/mymodule/templates/node--news--teaser.html.twig

2
Leigh

Avez-vous activé la suggestion de thème?

MYMODULE.module:

// This first function here.

/**
 ** Implements hook_theme_suggestions_hook().
 **/
function lrg_property_display_theme_suggestions_node(array $variables) {
  return [
    'node__properties'
  ];
}

/**
 ** Implements hook_theme().
 **/
function lrg_property_display_theme($existing, $type, $theme, $path) {
  return [
    'node__properties' => [
      'template' => 'node--properties',
      'base hook' => 'node',
    ],
  ];
}

Vous pouvez également déclarer un fichier de modèle spécifique:

function hook_theme_suggestions_hook(array $variables) {
  return [
    'my_very_specific_template'
  ];
}

function hook_theme($existing, $type, $theme, $path) {
  return [
    'my_very_specific_template' => [
      'base hook' => 'node',
    ],
  ];
}
0
Prestosaurus

Cela devrait aider

function MYMODULE_theme_registry_alter(&$theme_registry) {

        $extension   = '.html.twig';
        $module_path = drupal_get_path('module', 'MYMODULE');
        $files       = file_scan_directory($module_path . '/templates', '/' . preg_quote($extension) . '$/');

        $fs = \Drupal::service('file_system');

        foreach ($files as $file) {
          $template = $fs->basename($file->filename, $extension);
          $theme    = str_replace('-', '_', $template);
          $__expt = explode('__', $theme, 2);
          $base_theme = empty($__expt[0]) ? null : $__expt[0];
          $specific = empty($__expt[1]) ? null : $__expt[1];
          if (!empty($specific) && isset($theme_registry[$base_theme])) {
            $theme_info = array(
              'template'   => $template,
              'path'       => $fs->dirname($file->uri),
              'render element'  => $theme_registry[$base_theme]['render element'],
              'base hook'  => $base_theme,
              'type'       => 'module',
              'theme path' => $module_path,
              'preprocess functions' => $theme_registry[$base_theme]['preprocess functions'],
            );

            $theme_registry[$theme] = $theme_info;
          }
        }
}