Variable an benutzerdefinierte Blockvorlagendatei übergeben


11

Ich möchte meinen benutzerdefinierten Block mit benutzerdefiniertem Inhalt in Drupal 8 erstellen. Zu Beginn erstelle ich einen Block mit nur einfachem Text und arbeite ordnungsgemäß. Mein Problem ist, wie ich meine benutzerdefinierte Variable an ihn übergeben kann. Ich habe ein Tutorial darüber gesehen, mein Modulname ist tcdevund dies ist der Inhalt der .moduleDatei.

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

und mein 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'
        );
}
}

und schließlich meine Vorlagendatei block--sliderblock.html.twig

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

Das Ergebnis ist jedoch nur "My Custom Block-". Das Problem ist, dass Variablen nicht an die Vorlagendatei übergeben werden. Wo liegt mein Fehler?

schätzen jede Hilfe

Antworten:


15

Ihr Rückgabearray enthält keinen #themeSchlüssel. Im Moment verwenden Sie also überhaupt keine Vorlagendatei.

Und Sie haben wahrscheinlich eine Verwechslung zwischen dem äußeren Block und dem Thema des Inhalts innerhalb des Blocks. Ihre Vorlage enthält den Namen tcdev, da dies der Name ist, den Sie oben im Array definiert haben *_theme(), und in tcdev.html.twig landen Ihre Variablen.

Ihr Code würde wie folgt aussehen.

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>

Sie haben geschrieben, dass Sie einige Tutorials darüber gesehen haben. Wahrscheinlich handelte es sich um zwei verschiedene Themen, und Sie versuchen, sie gleichzeitig anzuwenden.

Die benutzerdefinierte Vorlage im ersten Link lautet tcdev.html.twig. Was Sie mit der Methode im zweiten Link versuchen, ist für block - sliderblock.html.twig.


Aber block--sliderblock.html.twiggerendert, das Problem ist, wie ich meine Variable an sie weitergebe !!!? Was schlagen Sie mir gemäß meinem Code vor? ? tnx für Ihre Aufmerksamkeit
Yusef

Sie möchten den Inhalt der Variablen in einem Block? Dann ist dies nicht mit einer Blockvorlage verbunden, da dies für die Außenseite des Blocks gilt. ( block--sliderblock.html.twiggerendert, weil Sie den Namen eines Themenvorschlags verwendet haben, würde dies gerendert, selbst wenn der Block völlig leer wäre, können Sie dies versuchen)
4k4

Ich habe versucht, Ihren Code zu ändern, um die Dinge klarer zu machen. Ich hoffe, das funktioniert. Ich habe ihn nicht debuggt.
4k4

Ich wende Ihren Code an, erstelle den Cache neu, lese aber immer noch aus block--sliderblock.html.twigund nichts wurde an ihn übergeben. Ich aktiviere Debug-Informationen und Debug-Informationen sind<!-- 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

Ihre Variablen werden nicht von gelesen block--sliderblock.html.twig. Diese Vorlage arbeitet mit einem eigenen Satz von Variablen. (Wenn Sie diesen Zweig verwenden möchten, müssen Sie ihn aus dem Kern- oder Basisthema kopieren, und dann sehen Sie, welche Variablen sich darin befinden.) Ihre im Render-Array der Build-Funktion festgelegten Variablen enden in tcdev.html.twig. Haben Sie diese Zweigdatei erstellt?
4k4

3

Damit ich herausgefunden habe, dass Sie eine Standardblockvorlage mit einer benutzerdefinierten Blockvorlage (Modulvorlage) überschreiben und dann Ihre Variablen an diese übergeben möchten, müssen Sie zunächst sicherstellen, dass Ihre Vorlage korrekt überschrieben wird, da Ihre aktuelle Blockvorlage anscheinend von Ihrer ausgegeben wird Themenverzeichnis (kein Modul):

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

Dazu sollten Sie zuerst ein Verzeichnis erstellen, das templates/im Stammverzeichnis Ihres Moduls aufgerufen wird, und dann Ihre Vorlage dort ablegen.

Lassen Sie Drupal nun wissen, dass Sie die Vorlage in Ihrem Modul speichern. in your_module.modulehinzufügen diese Funktion:

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

Achten Sie abschließend darauf, wo Sie Ihre Zweigdatei ablegen und wie Sie sie nennen. Erstellen Sie ein Vorlagenverzeichnis in Ihrem Modulverzeichnis und ersetzen Sie den _Namen der Themenfunktion durch -:
mymodule-block.html.twig

Vergessen Sie nicht, den Cache zu leeren.


Mit Hilfe der Antwort von Nicensinin diesem Beitrag:
Drupal 8 benutzerdefinierten Block (Modul) erstellen Sie eine Zweigvorlagendatei


1
Was ist mit den Variablen, nach denen OP gefragt hat?
Leymannx

1

Ich bin auch an diesen Punkt gekommen. Die Variablen scheinen nicht an die Blockvorlage übergeben zu werden. Ich habe fast den gleichen Code wie Sie. In meinem Fall habe ich das Debuggen von Zweigen aktiviert und den Cache in services.yml deaktiviert. Selbst beim Löschen des Caches hatte ich dieses Problem, wurde aber behoben, als ich diese Konfiguration in meiner Entwicklungsumgebung aktivierte.

twig.config:    
# Not recommended in production environments
# @default false
debug: true
# Not recommended in production environments
# @default null
auto_reload: true
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.