Pase la variable al archivo de plantilla de bloque personalizado


11

Quiero crear mi bloque personalizado con contenido personalizado en Drupal 8, al principio creo un bloque con solo texto simple y funciona correctamente, mi problema es cómo puedo pasarle mi variable personalizada. Vi un tutorial al respecto, mi nombre de Módulo es tcdevy este es el contenido del .modulearchivo.

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

y mi 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'
        );
}
}

y finalmente mi archivo de plantilla block--sliderblock.html.twig

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

Pero el resultado es solo "My Custom Block-". El problema es que las variables no se pasan al archivo de plantilla, ¿dónde está mi culpa?

aprecio cualquier ayuda

Respuestas:


15

Su matriz de retorno no contiene una #themeclave. Así que por el momento no estás usando un archivo de plantilla.

Y es probable que tenga una confusión entre el bloque externo y el contenido del bloque. Su plantilla en el interior tiene el nombre tcdev, porque ese es el nombre que definió en la parte superior de la matriz *_theme(), y tcdev.html.twig es donde terminarán sus variables.

Su código se vería como el siguiente.

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>

Usted escribió que vio algunos tutoriales al respecto. Probablemente se trata de dos temas diferentes, y está tratando de aplicarlos al mismo tiempo.

La plantilla personalizada en el primer enlace es tcdev.html.twig. Lo que está intentando hacer con el método en el segundo enlace es para el bloque: sliderblock.html.twig.


Pero block--sliderblock.html.twig, el problema es cómo pasarle mi variable. ¿Qué me sugieres según mi código? ? tnx por su atención
Yusef

¿Quieres el contenido de las variables dentro de un bloque? Entonces esto no está conectado a una plantilla de bloque, porque esto es para el exterior del bloque. ( block--sliderblock.html.twigprocesado, porque usaste el nombre de una sugerencia de tema, esto se procesaría incluso si el bloque estuviera totalmente vacío, puedes probar esto)
4k4

Traté de cambiar su código para aclarar las cosas, espero que esto funcione, no lo depuré.
4k4

Aplico su código, reconstruyo el caché, pero aún leo block--sliderblock.html.twigy no le pasé nada. Habilito la información de depuración y la información de depuración es<!-- 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

Sus variables no son leídas por block--sliderblock.html.twig. Esta plantilla funciona con su propio conjunto de variables. (Si desea utilizar esta rama, tendrá que copiarla del tema principal o base y luego verá qué variables hay dentro). Sus variables establecidas en la matriz de representación de la función de compilación terminarán en tcdev.html.twig. ¿Creaste este archivo de ramita?
4k4

3

Así que descubrí que desea sobrescribir una plantilla de bloque predeterminada con una plantilla de bloque (módulo) personalizada, y luego pasarle las variables, primero debe asegurarse de sobrescribir su plantilla correctamente porque parece que su plantilla de bloque actual ha salido de su Directorio de temas (no módulo):

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

Para hacer esto primero, debe crear un directorio llamado templates/en la raíz de sus módulos y luego colocar su plantilla allí.

Ahora dígale a Drupal que almacena la plantilla en su módulo. en your_module.moduleagregar esta función:

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

Finalmente, tenga cuidado sobre dónde coloca su archivo de ramita y cómo lo nombra. Cree un directorio de plantillas en el directorio de su módulo y reemplace el _nombre de la función en el tema con -:
mymodule-block.html.twig

No te olvides de borrar el caché.


Con la ayuda de la respuesta escrita Nicensinen esta publicación:
Drupal 8 custom block (module) crea un archivo de plantilla de ramita


1
¿Qué pasa con las variables que solicitó OP?
leymannx

1

Llegué a este punto también. Las variables no parecen pasar a la plantilla de bloque. Tengo casi el mismo código que usted, en mi caso habilité la depuración de ramitas y deshabilité el caché en services.yml. Incluso borrando la memoria caché estaba teniendo este problema, pero me resolvieron una vez que activé esta configuración en mi entorno de desarrollo.

twig.config:    
# Not recommended in production environments
# @default false
debug: true
# Not recommended in production environments
# @default null
auto_reload: true
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.