web-dev-qa-db-fra.com

Passer la variable au fichier de modèle de bloc personnalisé

Je veux créer mon bloc personnalisé avec un contenu personnalisé en Drupal 8, au début, je crée un bloc avec juste du texte simple dessus, et je travaille correctement, mon problème est de savoir comment puis-je transmettre ma variable personnalisée à J'ai vu un didacticiel à ce sujet, le nom de mon module est tcdev et c'est le contenu de .module fichier.

function tcdev_theme($existing, $type, $theme, $path) {
    return array('tcdev' =>
        array(
            'variables' => array(
                'title' => 'Default title',
                'description' => null
            ),
            'template' => 'block--sliderblock'
        )
    );
}

et mon SliderBlock.php

    namespace  Drupal\tcdev\Plugin\Block;
use Drupal\Core\block\BlockBase;


/**
 * Provides a 'SliderBlock' block.
 *
 * @Block(
 * id = "slider_block",
 * admin_label = @Translation("Slider Block"),
 * )
 */

class SliderBlock extends BlockBase{
    /**
     * {@inheritdoc}
     */
    public function build(){
        return array(
            '#title' => 'my title ',
            '#description' => 'my custom desc'
        );
}
}

et enfin mon fichier modèle block--sliderblock.html.twig

  <h2>My Custom Block{{ title }}-{{ description }}</h2>

Mais le résultat n'est que "Mon bloc personnalisé". Le problème est que les variables ne sont pas transmises au fichier modèle, où est ma faute?

apprécier toute aide

11
Yusef

Votre tableau de retour ne contient pas de clé #theme. Donc, pour le moment, vous n'utilisez pas du tout de fichier modèle.

Et vous avez probablement un mélange entre le bloc externe et le thème du contenu à l'intérieur du bloc. Votre modèle à l'intérieur porte le nom tcdev, car c'est le nom que vous avez défini en haut du tableau dans *_theme(), et tcdev.html.twig est l'endroit où vos variables finiront.

Votre code ressemblerait au suivant.

function tcdev_theme($existing, $type, $theme, $path) {
  return array('tcdev' =>                  // this is the name of the template
           array(
            'variables' => array(
                'title' => 'Default title',
                'description' => null
            ),
        )
    );
}

SliderBlock.php

namespace  Drupal\tcdev\Plugin\Block;
use Drupal\Core\block\BlockBase;


/**
 * Provides a 'SliderBlock' block.
 *
 * @Block(
 * id = "slider_block",
 * admin_label = @Translation("Slider Block"),
 * )
 */

class SliderBlock extends BlockBase{
    /**
     * {@inheritdoc}
     */
    public function build() {
        return array(
            '#theme' => 'tcdev',
            '#title' => 'my title ',
            '#description' => 'my custom desc'
        );
   }
}

tcdev.html.twig

  <h2>My Custom Block{{ title }}-{{ description }}</h2>

Vous avez écrit que vous avez vu des didacticiels à ce sujet. Il s'agissait probablement de deux sujets différents, et vous essayez de les appliquer en même temps.

Le modèle personnalisé dans le premier lien est tcdev.html.twig. Ce que vous essayez de faire avec la méthode du deuxième lien est pour block - sliderblock.html.twig.

15
4k4

Pour que je trouve, vous voulez remplacer un modèle de bloc par défaut par un modèle de bloc (module) personnalisé, puis lui passer vos variables, tout d'abord vous devez vous assurer d'écraser correctement votre modèle car votre modèle de bloc actuel semble sorti de votre Répertoire de thème (pas de module):

<!-- BEGIN OUTPUT from 'themes/gttc_2016/templates/block--sliderblock.html.twig' -->

Pour ce faire, vous devez d'abord créer un répertoire appelé templates/ dans la racine de vos modules puis placez votre modèle.

Faites maintenant savoir à Drupal que vous stockez le modèle dans votre module. Dans your_module.module ajoutez cette fonction:

function YOUR_MODULE_theme($existing, $type, $theme, $path) {
  return array(
    'block__my_module' => array(
      'render element' => 'elements',
      'template' => 'block--my-module',
      'base hook' => 'block'
    )
  );
}

Enfin, faites attention à l'endroit où vous placez votre fichier twig et à son nom. Créez un répertoire de modèles dans le répertoire de votre module et remplacez le _ dans le nom de la fonction du thème avec -:
mymodule-block.html.twig

N'oubliez pas de vider le cache.


Avec l'aide de la réponse écrite par Nicensin dans cet article:
Bloc personnalisé Drupal 8 (module) créer twig fichier modèle

3
Mojtaba Reyhani

J'en suis arrivé là aussi. Les variables ne semblent pas être transmises au modèle de bloc. J'ai presque le même code que vous, dans mon cas, j'ai activé twig débogage et désactivation du cache dans services.yml. mon environnement de développement.

twig.config:    
# Not recommended in production environments
# @default false
debug: true
# Not recommended in production environments
# @default null
auto_reload: true
1
Julian Mancera