web-dev-qa-db-fra.com

Modifier le contenu du bloc

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?

4
user7011

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;
}
5
Net

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

4
drugan