Przekaż zmienną do pliku szablonu bloku niestandardowego

11

Chcę utworzyć własny blok z niestandardową zawartością w Drupal 8, na początku tworzę blok z prostym tekstem i działam poprawnie, mój problem polega na tym, jak mogę przekazać do niego zmienną niestandardową? Widziałem kilka samouczków na ten temat, nazwa mojego modułu to tcdevi to jest zawartość .modulepliku.

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

i mój 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'
        );
}
}

i wreszcie mój plik szablonu block--sliderblock.html.twig

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

Ale wynikiem jest tylko „Mój blok niestandardowy”. Problem polega na tym, że zmienne nie są przekazywane do pliku szablonu, gdzie jest moja wina?

doceniam każdą pomoc

Yusef
źródło

Odpowiedzi:

15

Twoja tablica zwrotna nie zawiera #themeklucza. W tej chwili w ogóle nie używasz pliku szablonu.

I prawdopodobnie masz pomieszanie między blokiem zewnętrznym a tematycznym umieszczaniem zawartości wewnątrz bloku. Twój szablon w środku ma nazwę tcdev, ponieważ jest to nazwa zdefiniowana na górze tablicy w *_theme(), a tcdev.html.twig to miejsce, w którym kończą się twoje zmienne.

Twój kod wyglądałby następująco.

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>

Napisałeś, że widziałeś kilka samouczków na ten temat. Prawdopodobnie chodziło o dwa różne tematy i próbujesz je zastosować jednocześnie.

Szablon niestandardowy w pierwszym łączu to tcdev.html.twig. To, co próbujesz zrobić za pomocą metody z drugiego łącza, to blok - sliderblock.html.twig.

4k4
źródło
Ale block--sliderblock.html.twigrenderowane, problem polega na tym, jak przekazać do niego moją zmienną !!!? co mi sugerujesz według mojego kodu. ? Dziękujemy za uwagę
Yusef
Chcesz zawartość zmiennych w bloku? To nie jest połączone z szablonem bloku, ponieważ jest to na zewnątrz bloku. ( block--sliderblock.html.twigrenderowane, ponieważ użyłeś nazwy sugestii motywu, renderowałoby to nawet, gdyby blok był całkowicie pusty, możesz spróbować)
4k4
Próbowałem zmienić kod, aby wszystko było bardziej przejrzyste, mam nadzieję, że to zadziała, ale go nie debugowałem.
4k4
Stosuję twój kod, odbudowuję pamięć podręczną, ale nadal czytam block--sliderblock.html.twigi nic do niej nie przeszło. Włączam informacje o debugowaniu, a informacje o debugowaniu to<!-- 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
Twoje zmienne nie są odczytywane przez block--sliderblock.html.twig. Te szablony działają z własnym zestawem zmiennych. (Jeśli chcesz użyć tej gałązki, musisz ją skopiować z motywu podstawowego lub podstawowego, a następnie zobaczysz, jakie zmienne są w środku). Twoje zmienne ustawione w tablicy renderowania funkcji kompilacji skończą się w tcdev.html.twig. Czy utworzyłeś ten plik gałązki?
4k4
3

Tak więc znalazłem, że chcesz zastąpić domyślny szablon bloku niestandardowym szablonem bloku (modułu), a następnie przekazać do niego zmienne, przede wszystkim musisz upewnić się, że nadpisujesz szablon poprawnie, ponieważ wydaje się, że bieżący szablon bloku jest generowany z twojego Katalog motywów (nie moduł):

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

Aby to zrobić, najpierw należy utworzyć katalog o nazwie templates/w katalogu głównym modułów, a następnie umieścić tam szablon.

Teraz powiadom Drupala, że ​​przechowujesz szablon w swoim module. w your_module.moduledodać tę funkcję:

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

Na koniec uważaj na to, gdzie umieścisz plik gałązki i jak go nazwiesz. Utwórz katalog szablonów w katalogu modułu i zamień _nazwę funkcji motywu na -:
mymodule-block.html.twig

Nie zapomnij wyczyścić pamięci podręcznej.


Za pomocą odpowiedzi napisanej Nicensinw tym poście:
Drupal 8 niestandardowy blok (moduł) utwórz plik szablonu gałązki

Mojtaba Reyhani
źródło
1
Co ze zmiennymi, o które prosił OP?
leymannx
1

Doszedłem też do tego punktu. Zmienne nie wydają się być przekazywane do szablonu bloku. Mam prawie taki sam kod jak ty, w moim przypadku włączyłem debugowanie gałązek i wyłączyłem pamięć podręczną w services.yml. Nawet czyszczenie pamięci podręcznej miałem ten problem, ale został rozwiązany, gdy aktywowałem tę konfigurację w moim środowisku programistycznym.

twig.config:    
# Not recommended in production environments
# @default false
debug: true
# Not recommended in production environments
# @default null
auto_reload: true
Julian Mancera
źródło