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
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.