Passar variável para arquivo de modelo de bloco personalizado

11

Eu quero criar meu bloco personalizado com conteúdo personalizado no Drupal 8, no começo eu crio um bloco com apenas um texto simples e funciono corretamente, meu problema é como posso passar minha variável personalizada para ele? Eu vi algum tutorial sobre isso, meu nome do módulo é tcdeve esse é o conteúdo do .modulearquivo.

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

e meu 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 finalmente meu arquivo de modelo block--sliderblock.html.twig

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

Mas o resultado é apenas "Meu bloco personalizado". O problema é que as variáveis ​​não são passadas para o arquivo de modelo. Onde está minha culpa?

agradeço qualquer ajuda

Yusef
fonte

Respostas:

15

Sua matriz de retorno não contém um #theme chave. Então, no momento, você não está usando um arquivo de modelo.

E você provavelmente tem uma mistura entre o bloco externo e a temática do conteúdo dentro do bloco. Seu modelo interno tem o nome tcdev, porque esse é o nome que você definiu na parte superior da matriz em*_theme() e tcdev.html.twig é o local em que suas variáveis ​​terminam.

Seu código seria semelhante ao seguinte.

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>

Você escreveu que viu alguns tutoriais sobre isso. Provavelmente, trata-se de dois tópicos diferentes e você está tentando aplicá-los ao mesmo tempo.

O modelo personalizado no primeiro link é tcdev.html.twig. O que você está tentando fazer com o método no segundo link é para block - sliderblock.html.twig.

4k4
fonte
Mas block--sliderblock.html.twig, renderizado, o problema é como passar minha variável para ela !!!? o que você sugere para mim de acordo com meu código? ? tnx pela atenção
Yusef 02/06
Você quer o conteúdo das variáveis ​​dentro de um bloco? Então isso não está conectado a um modelo de bloco, porque é para a parte externa do bloco. ( block--sliderblock.html.twigPrestados, porque você usou o nome de uma sugestão de tema, este tornaria mesmo que o bloco seria totalmente vazia, você pode tentar este)
4k4
Tentei alterar seu código para tornar as coisas mais claras, espero que funcione, não depurei.
4k4
Aplico seu código, reconstruo o cache, mas ainda leio block--sliderblock.html.twige nada passou para ele. Eu permitir que informações de depuração e informações de depuração é<!-- 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
Suas variáveis ​​não são lidas por block--sliderblock.html.twig. Este modelo trabalha com seu próprio conjunto de variáveis. (Se você quiser usar esse galho, precisará copiá-lo do tema principal ou base e depois ver quais variáveis ​​estão dentro). Suas variáveis ​​definidas na matriz de renderização da função de compilação serão finalizadas tcdev.html.twig. Você criou esse arquivo galho?
4k4
3

Como descobri, você deseja sobrescrever um modelo de bloco padrão por um modelo de bloco (módulo) personalizado e depois passar suas variáveis ​​para ele. Antes de tudo, certifique-se de sobrescrever seu modelo corretamente, porque parece que o seu modelo de bloco atual é gerado pelo seu Diretório de temas (não módulo):

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

Para fazer isso primeiro, você deve criar um diretório chamado templates/ na raiz de seus módulos e, em seguida, colocar seu modelo lá.

Agora informe ao Drupal que você armazena o modelo em seu módulo. em your_module.moduleadicionar esta função:

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, tenha cuidado com o local onde você coloca seu arquivo de galho e o nome dele. Crie um diretório de modelos no diretório do módulo e substitua o _nome da função de tema por -:
mymodule-block.html.twig

Não se esqueça de limpar o cache.


Com a ajuda da resposta escrita por Nicensinneste post:
Drupal 8 bloco personalizado (módulo) criar arquivo de modelo de galho

Mojtaba Reyhani
fonte
1
E as variáveis ​​solicitadas pelo OP?
Leymannx
1

Também cheguei a esse ponto. As variáveis ​​não parecem ser passadas para o modelo de bloco. Eu tenho quase o mesmo código que você; no meu caso, ativei a depuração do galho e desabilitei o cache no services.yml. Mesmo limpando o cache, eu estava tendo esse problema, mas foi resolvido depois que eu ativei essa configuração no meu ambiente de desenvolvimento.

twig.config:    
# Not recommended in production environments
# @default false
debug: true
# Not recommended in production environments
# @default null
auto_reload: true
Julian Mancera
fonte