J'essaie de modifier un bloc de module personnalisé, sans succès. Ma classe de blocs est la suivante.
class BreadcrumbBlock extends BlockBase {
public function build() {
return [
'#theme' => 'breadcrumb_block',
'#content' => array('value' => 1),
'#cache' => array(
'contexts' => array('url'),
),
];
}
.....
Dans hook_block_view_alter()
où puis-je modifier le bloc? Où sont $data['subject']
Et $data['content']
Dans un bloc?
Je pense que vous devez utiliser un 'pre_render'. Quelque chose comme: http://www.drupal8.ovh/en/tutoriels/150/change-drupal-8-powered-by-block
use Drupal\Core\Render\Markup;
function yourmodule_block_view_alter(array &$build, \Drupal\Core\Block\BlockPluginInterface $block) {
if ($block->getBaseId() === 'system_powered_by_block') {
$build['#pre_render'][] = '_yourmodule_block_poweredby_prerender';
}
}
function _yourmodule_block_poweredby_prerender(array $build) {
$build['content']['#markup'] = Markup::create('Your text');
return $build;
}
Une autre méthode qui peut être utilisée pour modifier n'importe quel bloc sans rappel #pre_render supplémentaire. Notez que la fonction de rappel personnalisée est appelée après le système Drupal\block\BlockViewBuilder :: preRender () et peut ne pas être rendue correctement. Par exemple, si vous ajoutez du contenu à un bloc vide en utilisant la méthode du commentaire ci-dessus, le titre du bloc sera perdu.
Accédez au dossier src de votre module et créez le fichier OverrideAnyBlockContent.php avec le contenu suivant:
<?php
namespace Drupal\YOUR_MODULE;
/**
* Helper class to override any block content in a HOOK_block_view_alter().
*/
class OverrideAnyBlockContent {
/**
* The render array.
*
* @var array
* @see https://www.drupal.org/docs/8/api/render-api/render-arrays
*/
protected $renderArray;
public function __construct(array $render_array) {
$this->renderArray = $render_array;
}
public function getPlugin() {
return $this;
}
public function build() {
return $this->renderArray;
}
}
Puis dans VOTRE_MODULE.module fichier:
function YOUR_MODULE_block_view_alter(array &$build, Drupal\Core\Block\BlockPluginInterface $block) {
if ($block->getBaseId() === 'system_powered_by_block') {
// @see https://www.drupal.org/docs/8/api/render-api/render-arrays
$render_array = [
'#type' => 'markup',
'#markup' => "Any text, HTML, {$php_variable}, whatever, ....",
];
// Uncomment the line below if you need to merge new render array with the
// original one.
// $render_array += $build['#block']->getPlugin()->build();
// Now block will be pre-rendered using new render array. No additional
// '#pre_render' callback is required.
// @see Drupal\block\BlockViewBuilder::preRender()
$build['#block'] = new Drupal\YOUR_MODULE\OverrideAnyBlockContent($render_array);
}
}
Tiré du problème du module d'exemples: https://www.drupal.org/node/2893964