web-dev-qa-db-ja.com

ブロックコンテンツの変更

カスタムモジュールブロックを変更しようとしていますが、成功しません。私のブロッククラスは次のとおりです。

_class BreadcrumbBlock extends BlockBase {

public function build() {
    return [
        '#theme' => 'breadcrumb_block',
        '#content' => array('value' => 1),
        '#cache' => array(
                'contexts' => array('url'),
        ),
    ];
 }
 .....
_

hook_block_view_alter()では、どこでブロックを変更できますか?ブロック内の_$data['subject']_と_$data['content']_はどこにありますか?

4
user7011

「pre_render」を使用する必要があると思います。次のようなもの: 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

追加の#pre_renderコールバックなしでブロックを変更するために使用できる別のメソッド。カスタムコールバック関数は、システムDrupal\block\BlockViewBuilder :: preRender()の後で呼び出され、正しくレンダリングされない場合があることに注意してください。たとえば、上記のコメントのメソッドを使用して空のブロックにコンテンツを追加すると、ブロックのタイトルが失われます。

モジュールのsrcフォルダーに移動し、OverrideAnyBlockContent.phpファイルを作成します次の内容で:

<?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;
  }

}

次に、YOUR_MODULE.moduleファイルで:

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);
  }
}

サンプルモジュールの問題から取得: https://www.drupal.org/node/2893964

4
drugan