Рейтинг:0

изменить пользовательский блок с помощью hook_entity_type_view_alter()

флаг gb

В Drupal 9 я пытаюсь использовать hook_ENTITY_TYPE_view_alter() для изменения поля тела пользовательского блока.

Однако я не знаю, как получить доступ к данным в $сборка массив, чтобы изменить его. Это частичный дамп $сборка множество. Я хочу изменить HTML-ссылки в тело поле.

массив (8) {
  ["#block_content"]=> объект(Drupal\block_content\Entity\BlockContent)#4946 (30) {
    ["тема": защищено] => NULL 
    ["значения":защищено]=> массив(17) { 
      ["id"]=> массив(1) { ["x-default"]=> строка(1) "4" } 
      ["revision_id"]=> массив(1) { ["x-default"]=> строка(1) "4" } 
      ["тип"]=> массив(1) { ["x-по умолчанию"]=> строка(5) "базовый" } 
      ["uuid"]=> массив (1) { ["x-default"] => строка (36) "f0c17429-584a-4221-995c-c00f4c41c714" } 
      ["langcode"]=> array(1) { ["x-default"]=> string(2) "en" } 
      ["revision_user"]=> array(1) { ["x-default"]=> NULL } 
      ["revision_created"]=> array(1) { ["x-default"]=> string(10) "1632243859" } 
      ["revision_log"]=> array(1) { ["x-default"]=> NULL } 
      ["revision_default"]=> массив(1) { ["x-default"]=> строка(1) "1" } 
      ["isDefaultRevision"]=> array(1) { ["x-default"]=> string(1) "1" } 
      ["статус"]=> массив(1) { ["x-по умолчанию"]=> строка(1) "1" } 
      ["информация"]=> array(1) { ["x-default"]=> строка(11) "Добавить содержимое" } 
      ["изменено"]=> массив(1) { ["x-по умолчанию"]=> строка(10) "1632457827" } 
      ["default_langcode"]=> массив(1) { ["x-default"]=> строка(1) "1" } 
      ["revision_translation_affected"]=> array(1) { ["x-default"]=> string(1) "1" } 
      ["повторно используемый"]=> массив(1) { ["x-по умолчанию"]=> строка(1) "1" } 
      ["тело"]=> массив(1) {
        ["x-по умолчанию"]=> массив(1) {
          [0]=> массив(3) {
            ["значение"]=> строка(652) "[…]" 
            ["резюме"]=> строка(0) "" 
            ["формат"]=> строка(11) "sbn_toolbar"
          }
        }
      }
    }
  }
}

Я не могу найти прямого ответа на этот вопрос через мои поиски. Самое близкое, что я подошел к тому, что я пытаюсь сделать, это этот код.

$build['content']['#markup'] = Markup::create('Ваш текст здесь');

Это терпит неудачу с этой ошибкой.

sbn_block_content_view_alter (массив, объект, объект) (строка: 539)
Drupal\Core\Extension\ModuleHandler->alter('block_content_view', Массив, Объект, Объект) (Строка: 305)
Drupal\Core\Entity\EntityViewBuilder->buildMultiple(Array) (строка: 29)
Drupal\block_content\BlockContentViewBuilder->viewMultiple (массив, 'полный', NULL) (строка: 17)
Drupal\block_content\BlockContentViewBuilder->view(Object, 'full') (строка: 187)
Drupal\block_content\Plugin\Block\BlockContentBlock->build() (строка: 105)
Drupal\layout_builder\EventSubscriber\BlockComponentRenderArray->onBuildRender(Object, 'section_component.build.render_array', Object) call_user_func(Array, Object, 'section_component.build.render_array', Object) (строка: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'section_component.build.render_array') (строка: 90)
Drupal\layout_builder\SectionComponent->toRenderArray(Array, ) (строка: 86)
Drupal\layout_builder\Section->toRenderArray(Array) (строка: 317)
Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay->buildSections(Object) (строка: 276)
Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay->buildMultiple(Array) (строка: 340)
Drupal\Core\Entity\EntityViewBuilder->buildComponents(Array, Array, Array, 'полный') (строка: 282)
Drupal\Core\Entity\EntityViewBuilder->buildMultiple(Array) (строка: 239)
Drupal\Core\Entity\EntityViewBuilder->сборка(массив) call_user_func_array (массив, массив) (строка: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Обратные вызовы Render #pre_render должны быть методами класса, реализующего \Drupal\Core\Security\TrustedCallbackInterface, или быть анонимной функцией. Обратный вызов был %s. См. https://www.drupal.org/node/2966725', 'исключение', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Строка: 781)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Массив, Массив) (Строка: 372)
Drupal\Core\Render\Renderer->doRender(Array, ) (Строка: 200)
Drupal\Core\Render\Renderer->render(Array, ) (строка: 241)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent{закрытие}() (строка: 573)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (строка: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (строка: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (строка: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (строка: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (строка: 163)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (строка: 80)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (строка: 57)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (строка: 47)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (строка: 106)
Drupal\page_cache\StackMiddleware\PageCache->pass(Object, 1, 1) (строка: 85)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (строка: 47)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (строка: 52)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (строка: 23)
Stack\StackedHttpKernel->дескриптор (объект, 1, 1) (строка: 706)
Drupal\Core\DrupalKernel->дескриптор (объект) (строка: 19)

4uk4 avatar
флаг cn
Сообщение об ошибке отсутствует. Это только трассировка стека с вашим крючком наверху. Вероятно, синтаксическая ошибка. Если вы хотите изменить поле body, сначала попробуйте создать дамп $build['body'].
SomebodySysop avatar
флаг gb
var_dump($build['body]) дает мне тот же вывод, что и var_dump($build) выше. Мой вопрос: как изменить значение тела в $ build?
apaderno avatar
флаг us
Было бы полезно увидеть более одной строки этой реализации `hook_ENTITY_TYPE_view_alter()`. Это также помогло бы увидеть сообщение об ошибке, а не трассировку стека, как сказал @ 4k4.
apaderno avatar
флаг us
Кроме того, вывод `var_dump($build)` был урезан до части, которая не очень полезна.
SomebodySysop avatar
флаг gb
Мой вопрос был отредактирован. Мне просто нужен пример использования hook_entity_type_view_alter() для изменения тела пользовательского блока.
Razeem Ahmad avatar
флаг ru
Попробуйте получить доступ к полю body, используя `$build['#block_content']->body->value`

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.