Passa la variabile al file modello di blocco personalizzato


11

Voglio creare il mio blocco personalizzato con contenuto personalizzato in Drupal 8, all'inizio creo il blocco con solo un semplice testo su di esso e funziona correttamente, il mio problema è come posso passarci la mia variabile personalizzata? Ho visto qualche tutorial a riguardo, il mio nome del modulo è tcdeve questo è il contenuto del .modulefile.

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

e la mia 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'
        );
}
}

e infine il mio file modello block--sliderblock.html.twig

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

Ma il risultato è solo "Il mio blocco personalizzato-". Il problema è che le variabili non vengono passate al file modello, dov'è la mia colpa?

apprezzare qualsiasi aiuto

Risposte:


15

La matrice di ritorno non contiene una #themechiave. Quindi al momento non stai usando un file modello.

E probabilmente hai un mix tra il blocco esterno e il tema del contenuto all'interno del blocco. Il tuo template interno ha il nome tcdev, perché quello è il nome che hai definito nella parte superiore dell'array in *_theme(), e tcdev.html.twig è dove finiranno le tue variabili.

Il tuo codice sarebbe simile al seguente.

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>

Hai scritto di aver visto alcuni tutorial a riguardo. Probabilmente si trattava di due argomenti diversi e si sta tentando di applicarli contemporaneamente.

Il modello personalizzato nel primo collegamento è tcdev.html.twig. Quello che stai cercando di fare con il metodo nel secondo link è per block - sliderblock.html.twig.


Ma block--sliderblock.html.twigreso, il problema è come passare la mia variabile ad esso !!!? cosa mi consigliate secondo il mio codice. ? grazie per l'attenzione
Yusef

Vuoi il contenuto delle variabili all'interno di un blocco? Quindi questo non è collegato a un modello di blocco, perché è per l'esterno del blocco. ( block--sliderblock.html.twigreso, perché hai usato il nome di un suggerimento di tema, questo renderebbe anche se il blocco fosse completamente vuoto, puoi provare questo)
4k4

Ho provato a cambiare il tuo codice per rendere le cose più chiare, spero che funzioni, non ho eseguito il debug.
4k4,

Applico il tuo codice, ricostruisco la cache, ma continuo a leggere block--sliderblock.html.twige non gli è passato nulla. Abilito le informazioni di debug e le informazioni di debug sono<!-- 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

Le tue variabili non vengono lette da block--sliderblock.html.twig. Questo modello funziona con un proprio set di variabili. (Se vuoi usare questo ramoscello, dovresti copiarlo dal tema principale o base e poi vedi quali sono le variabili all'interno). Le variabili impostate nell'array di rendering della funzione build finiranno in tcdev.html.twig. Hai creato questo file ramoscello?
4k4

3

Quindi, ho scoperto, vuoi sovrascrivere un modello di blocco predefinito con un modello di blocco personalizzato (modulo) e quindi passarci le variabili, prima di tutto devi assicurarti di sovrascrivere correttamente il tuo modello perché sembra che il tuo modello di blocco corrente sia stato generato dal tuo Directory dei temi (non modulo):

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

Per fare questo prima devi creare una directory chiamata templates/nella radice dei tuoi moduli e poi posizionare lì il tuo modello.

Ora fai sapere a Drupal che memorizzi il modello nel tuo modulo. in your_module.moduleaggiungi questa funzione:

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

Infine, fai attenzione a dove metti il ​​tuo file ramoscello e come lo chiami. Creare una directory di modelli nella directory del modulo e sostituire il _nome della funzione del tema con -:
mymodule-block.html.twig

Non dimenticare di cancellare la cache.


Con l'aiuto della risposta scritta Nicensinin questo post:
Drupal 8 blocco personalizzato (modulo) crea un file modello ramoscello


1
E le variabili richieste dall'OP?
leymannx,

1

Sono arrivato anche a questo punto. Le variabili non sembrano essere passate al modello di blocco. Ho quasi lo stesso codice di te, nel mio caso ho abilitato il debug del ramoscello e disabilitato la cache in services.yml. Anche cancellando la cache stavo riscontrando questo problema ma sono stato risolto una volta attivato questa configurazione nel mio ambiente di sviluppo.

twig.config:    
# Not recommended in production environments
# @default false
debug: true
# Not recommended in production environments
# @default null
auto_reload: true
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.