Как создать блок, который извлекает содержимое текущего узла?


Хорошо, итак, я знаю, что в блоках Drupal 8 есть такие вещи, называемые "контекстами", которые позволяют ядру очищать кэш на мелкозернистой основе. Я не могу найти никакого достойного объяснения того, как они работают, или как получить от них переменные страницы, или что-то еще.

Моя цель - создать тип блока, который отображает поля или режим отображения текущего узла в содержимом блока. Я видел в другом месте, как можно было бы получить текущий узел, но я не совсем понимаю, как это должно быть возвращайтесь в контексты кэша. Я знаю, что #кэш в массивах визуализации существует, но есть также множество методов из ContextAwarePluginInterface, которые я не уверен, что они делают. Есть ли какая-то документация, которой мне не хватает?

Author: kiamlaluno, 2015-11-15

4 answers

Существуют два совершенно разных вида контекстов.

Контексты кэша, которые не имеют к этому никакого отношения. Они не используются для аннулирования чего-либо, но чем-то отличаются (например, кэш по-разному для разных разрешений пользователей). Теги кэша предназначены для аннулирования.

Вы имеете в виду контексты плагинов. И да, блоки могут использовать их с короткого времени (они всегда могли, но модуль block.module не поддерживал его должным образом). Как сказал @larowlan, core использует их в основном для условий видимости, но это работает одинаково для блоков.

Одним из таких примеров, на который вы можете посмотреть, является условие типа узла. Что вам нужно сделать, это добавить контекстную аннотацию, а затем вы можете использовать ее как $this->getContextValue('node'). Преимущество этого заключается в том, что ваш блок более гибкий и вам не нужно точно знать, откуда берется узел, это зависит от пользователя, который его настраивает.

Обратите внимание, что в настоящее время это не отображается в пользовательском интерфейсе, если на самом деле не существует более одного узла на выбор.

 9
Author: Berdir, 2015-11-15 08:57:28

Для использования узла в блоке я использую контекст. Например: этот блок отображает ссылки для редактирования и удаления текущего узла:

/**
 * @file
 * Contains \Drupal\my_module\Plugin\Block\NodeMenuBlock.
 */

namespace Drupal\my_module\Plugin\Block;

use Drupal\Core\Block\BlockBase;
use Drupal\Core\Link;
use Drupal\Core\Url;

/**
 * @Block(
 *   id = "node_menu_block",
 *   admin_label = @Translation("Node Menu Block"),
 *   category = @Translation("My Group"),
 *   context = {
 *     "node" = @ContextDefinition(
 *       "entity:node",
 *       label = @Translation("Current Node")
 *     )
 *   }
 * )
 */
class NodeMenuBlock extends BlockBase {
  /**
   * {@inheritdoc}
   */
  public function build() {
    $node = $this->getContextValue('node');
    $nid_fld = $node->nid->getValue();
    $nid = $nid_fld[0]['value'];

    $markup = '';
    $links = ['entity.node.edit_form' => 'Edit', 'entity.node.delete_form' => 'Delete', ];
    foreach($links as $rout=>$text) {
      $url = Url::fromRoute($rout, array('node' => $nid));
      $link = Link::fromTextAndUrl(t($text), $url)->toRenderable();
      $link['#attributes'] = array('class' => array('button', 'button-action'));
      $markup .= render($link).' ';
    }

    $block = [
      '#type' => 'markup',
      '#markup' => $markup,
    ];
    return $block;
  }

}
 8
Author: Verter, 2016-06-24 11:05:10

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

 1
Author: larowlan, 2015-11-15 05:11:21

Проверьте модуль содержимого узла блока: https://www.drupal.org/project/block_node

Введение

Этот модуль предоставляет блок, который может отображать либо текущий узел, либо указанный узел в заданном режиме просмотра.

Возможные варианты использования

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

Установка

Установите как обычно, в идеале с помощью composer. Включите модуль.

Конфигурация

Разместите блок, используя страницу компоновки блока, как вы обычно размещаете любой блок.

Параметры конфигурации:

Использовать текущий узел

  • Если флажок установлен, текущий узел будет отображаться в блоке, если блок размещен на странице узла.

Узел для отображения

  • Поиск узла для дисплей. При выборе этого узла он будет отображаться в блоке.

Режим просмотра

  • Выберите режим просмотра из доступных опций. Узел, отображаемый в блоке, будет отображаться в этом режиме просмотра.
  • Другие настройки являются стандартными настройками блока.
 0
Author: tekNorah, 2020-06-15 09:13:00