Skip to content

Instantly share code, notes, and snippets.

@pmichelazzo
Created March 11, 2022 08:36
Show Gist options
  • Save pmichelazzo/0b8bf05aa6067a31a95f5dfa4ee8412c to your computer and use it in GitHub Desktop.
Save pmichelazzo/0b8bf05aa6067a31a95f5dfa4ee8412c to your computer and use it in GitHub Desktop.
Como passar parâmetros para blocos programaticamente.

Passando valores para blocos

Imagine que você criou um bloco em seu módulo que é usado em diversas partes do site mas que, precisa apresentar dados diferentes dependendo de onde está sendo apresentado. É possível?

Resposta: sim. Existe um parâmetro que muitos esquecem e que pode ser usado para tal finalidade. Vejamos

Exemplo

Você possui um controller que carrega um bloco padrão:

      $build['meu_bloco'] = \Drupal::service('plugin.manager.block')
        ->createInstance('meu_modulo_bloco_padrao')
        ->build();

      $return = [
        '#theme' => 'meu_modulo_bloco_padrao',
        '#bloco' => $build,
      ];

      return $return;

Noutro controller, você precisa chamar o mesmo bloco passando um determinado valor, como por exemplo, um ID de usuário. Então:

      // O ID do usuário atual é obtido via método get do controller.
      $uid['uid'] = $this->currentUser()->id();
      $build['meu_bloco'] = \Drupal::service('plugin.manager.block')
        ->createInstance('meu_modulo_bloco_padrao', $uid)
        ->build();

      $return = [
        '#theme' => 'meu_modulo_bloco_padrao',
        '#bloco' => $build,
      ];

      return $return;

Com isso em mãos, no código de seu bloco terá:

  public function build() {
    // Obtém as configurações do blocos.
    $config = $this->getConfiguration();
    // Como não sabemos de onde o bloco está sendo chamado,
    // verificamos se a chave "uid" encontra-se no array da configuração.
    if (array_key_exists('uid', $config)) {
      // Executa o código com o uid recebido do controller.
      print $config['uid'];
    }

Com essa dica, o mesmo bloco pode ser usado em diferentes partes do site com configurações dinâmicas, sem necessidade de quebrar a cabeça.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment