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

11

Je veux créer mon bloc personnalisé avec du contenu personnalisé dans Drupal 8, au début je crée un bloc avec juste du texte simple dessus, et je travaille correctement, mon problème est comment puis-je lui passer ma variable personnalisée? J'ai vu un tutoriel à ce sujet, mon nom de module est tcdevet c'est le contenu du .modulefichier.

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

Yusef
la source

Réponses:

15

Votre tableau de retour ne contient pas de #themeclé. 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 *_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.

4k4
la source
Mais block--sliderblock.html.twigrendu, le problème est de savoir comment lui passer ma variable !!!? que me proposez-vous selon mon code. ? tnx pour votre attention
Yusef
Vous voulez le contenu des variables à l'intérieur d'un bloc? Ensuite, ce n'est pas connecté à un modèle de bloc, car il s'agit de l'extérieur du bloc. ( block--sliderblock.html.twigrendu, car vous avez utilisé le nom d'une suggestion de thème, cela s'afficherait même si le bloc était totalement vide, vous pouvez essayer ceci)
4k4
J'ai essayé de changer votre code pour rendre les choses plus claires, j'espère que cela fonctionne, je ne l'ai pas débogué.
4k4
J'applique votre code, reconstruis le cache, mais je continue de lire block--sliderblock.html.twiget rien ne lui est passé. J'active les informations de débogage et les informations de débogage sont<!-- END OUTPUT from 'themes/bootstrap/templates/block/block--system-branding-block.html.twig' <!-- FILE NAME SUGGESTIONS: x block--sliderblock.html.twig * block--slider-block.html.twig * block--tcdev.html.twig * block.html.twig --> <!-- BEGIN OUTPUT from 'themes/gttc_2016/templates/block--sliderblock.html.twig' --> <h2>Block-</h2>
Yusef
Vos variables ne sont pas lues par block--sliderblock.html.twig. Ce modèle fonctionne avec son propre ensemble de variables. (Si vous souhaitez utiliser cette brindille, vous devrez le copier à partir du thème principal ou de base et vous verrez alors quelles variables sont à l'intérieur). Vos variables définies dans le tableau de rendu de la fonction de construction se retrouveront dans tcdev.html.twig. Avez-vous créé ce fichier de brindille?
4k4
3

Pour que je trouve, vous voulez écraser un modèle de bloc par défaut avec 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 y placer votre modèle.

Faites maintenant savoir à Drupal que vous stockez le modèle dans votre module. en your_module.moduleajouter 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 de brindilles 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 de thème par -:
mymodule-block.html.twig

N'oubliez pas de vider le cache.


Avec l'aide de la réponse écrite par Nicensindans ce post:
Drupal 8 bloc personnalisé (module) créer un fichier de modèle de brindille

Mojtaba Reyhani
la source
1
Qu'en est-il des variables demandées par OP?
leymannx
1

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é le débogage des brindilles et désactivé le cache dans services.yml. Même en effaçant le cache, je rencontrais ce problème, mais j'ai été résolu une fois que j'ai activé cette configuration dans 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
Julian Mancera
la source