Блок opigno_documents_last_group_block находится в opigno_learning_path/src/Plugin/Block/DocumentsLastGroupBlock.php, который выглядит так:
<?php
пространство имен Drupal\opigno_learning_path\Plugin\Block;
используйте Drupal\Core\Block\BlockBase;
используйте Drupal\Core\Url;
/**
* Предоставляет блок документов lastgroupblock.
*
* @Блокировать(
* id = "opigno_documents_last_group_block",
* admin_label = @Translation("DocumentsLastGroupBlock"),
* категория = @Translation("Пользовательский")
* )
*/
класс DocumentsLastGroupBlock расширяет BlockBase {
/**
* @var \Drupal\Component\Plugin\Context\ContextInterface[]|смешанный
*/
защищенный $groupId;
/**
* {@inheritdoc}
*/
общедоступная функция сборки () {
$this->groupId = $gid = $this->configuration["group"];
$tid = _tft_get_group_tid($gid);
$content = _tft_folder_content($tid, FALSE, $gid);
$content = array_slice($content ?: [], 0, 4);
foreach ($content as $index => $item) {
$контент[$индекс] = [
'#theme' => 'opigno_documents_last_group_item',
'#type' => $item["type"] == 'file' ? 'Папка',
'#item' => $item,
'#label' => $item["имя"],
'#link' => $this->itemLink($item),
];
}
$сборка['контент'] = [
'#theme' => 'opigno_documents_last_group_block',
'контент' => $контент,
];
вернуть $сборку;
}
(...)
и прикреплен в LearningPathController в этом модуле:
/**
* Блок учебных документов.
*/
общедоступная функция trainingContentDocuments(&$content, $group) {
// $TFTController = новый TFTController();
// $listGroup = $TFTController->listGroup($group->id());
$tft_url = Url::fromRoute('tft.group', ['group' => $group->id()])->toString();
$content['tabs'][] = $tft_url = [
'#markup' => '<div class="see-all see-all-files"><a href="' . $tft_url . '">' . $this->t('Посмотреть все') . '</a></div>',
];
$block_render = $this->attachBlock('opigno_documents_last_group_block', ['group' => $group->id()]);
$block_render["content"]['link'] = $tft_url;
$content['tab_content']['documents'] = (isset($block_render["content"]["content"]) && !empty($block_render["content"]["content"])) ? [
'#type' => 'контейнер',
'#атрибуты' => [
'id' => 'документы',
],
'заблокировать' => [
'контент' => $block_render["контент"],
],
] : [];
}
Я попытался расширить его в пользовательском модуле: web/modules/custom/npx_files/src/Plugin/Block/NpxFilesDocumentsLastGroupBlock.php:
<?php
пространство имен Drupal\npx_files\Plugin\Block;
используйте Drupal\opigno_learning_path\Plugin\Block;
Блок opigno_documents_last_group_block находится в opigno_learning_path/src/Plugin/Block/DocumentsLastGroupBlock.php, который выглядит так:
<?php
пространство имен Drupal\opigno_learning_path\Plugin\Block;
используйте Drupal\Core\Block\BlockBase;
используйте Drupal\Core\Url;
/**
* Предоставляет блок документов lastgroupblock.
*
* @Блокировать(
* id = "opigno_documents_last_group_block",
* admin_label = @Translation("DocumentsLastGroupBlock"),
* категория = @Translation("Пользовательский")
* )
*/
класс DocumentsLastGroupBlock расширяет BlockBase {
/**
* @var \Drupal\Component\Plugin\Context\ContextInterface[]|смешанный
*/
защищенный $groupId;
/**
* {@inheritdoc}
*/
общедоступная функция сборки () {
$this->groupId = $gid = $this->configuration["group"];
$tid = _tft_get_group_tid($gid);
$content = _tft_folder_content($tid, FALSE, $gid);
$content = array_slice($content ?: [], 0, 4);
foreach ($content as $index => $item) {
$контент[$индекс] = [
'#theme' => 'opigno_documents_last_group_item',
'#type' => $item["type"] == 'file' ? 'Папка',
'#item' => $item,
'#label' => $item["имя"],
'#link' => $this->itemLink($item),
];
}
$сборка['контент'] = [
'#theme' => 'opigno_documents_last_group_block',
'контент' => $контент,
];
вернуть $сборку;
}
(...)
и прикреплен в LearningPathController в этом модуле:
/**
* Блок учебных документов.
*/
общедоступная функция trainingContentDocuments(&$content, $group) {
// $TFTController = новый TFTController();
// $listGroup = $TFTController->listGroup($group->id());
$tft_url = Url::fromRoute('tft.group', ['group' => $group->id()])->toString();
$content['tabs'][] = $tft_url = [
'#markup' => '<div class="see-all see-all-files"><a href="' . $tft_url . '">' . $this->t('Посмотреть все') . '</a></div>',
];
$block_render = $this->attachBlock('opigno_documents_last_group_block', ['group' => $group->id()]);
$block_render["content"]['link'] = $tft_url;
$content['tab_content']['documents'] = (isset($block_render["content"]["content"]) && !empty($block_render["content"]["content"])) ? [
'#type' => 'контейнер',
'#атрибуты' => [
'id' => 'документы',
],
'заблокировать' => [
'контент' => $block_render["контент"],
],
] : [];
}
Я попытался расширить его в пользовательском модуле: web/modules/custom/npx_files/src/Plugin/Block/NpxFilesDocumentsLastGroupBlock.php, но на самом деле он не срабатывает (я не уверен, что я могу даже расширить это таким образом):
<?php
пространство имен Drupal\npx_files\Plugin\Block;
используйте Drupal\opigno_learning_path\Plugin\Block;
/**
* Предоставляет блок документов lastgroupblock.
*
* @Блокировать(
* id = "opigno_documents_last_group_block",
* admin_label = @Translation("DocumentsLastGroupBlock"),
* категория = @Translation("Пользовательский")
* )
*/
класс NpxFilesDocumentsLastGroupBlock расширяет DocumentsLastGroupBlock {
общедоступная функция сборки () {
возвращаться [
'#markup' => $this->t('Привет, мир!'),
];
}
}
Однако это не вызывает блокировку, как можно расширить это?
Кэш очищен и модуль включен, конечно.
класс NpxFilesDocumentsLastGroupBlock расширяет DocumentsLastGroupBlock {
общедоступная функция сборки () {
возвращаться [
'#markup' => $this->t('Привет, мир!'),
];
}
}
Кэш очищен и модуль, конечно же, включен.
Я попытался предварительно обработать этот блок плагина с помощью hook_preprocess_block, но он не запускается этим хуком, только его «родительский» блок. Также этот блок не срабатывает hook_block_build_alter (только его родитель). Я могу добраться до этого блока с помощью hook_block_alter, но это не очень помогает, так как я не могу поместить туда какие-то дополнительные переменные, я думаю.
Может ли кто-нибудь указать мне в правильном направлении? Я хотел бы либо добавить дополнительные переменные в этот блок, либо указать, чтобы он отображал какой-то другой блок, либо отключить его/отключить программно перед рендерингом.Я потратил много времени, пытаясь узнать об этом и пробуя разные крючки, но пока безуспешно.