Передача текущего идентификатора узла в шаблон блока

У меня есть модуль с пользовательским блоком MyCustomBlock.php, который получает нуль текущей страницы и передает значение шаблону блока:

$node = \Drupal::routeMatch()->getParameter('node');
$nid = $node->nid->value;
return array(
  'currentnid' => $nid,
);

Внутри шаблона я печатаю переданное значение {{currentnid}}, но оно работает только при очистке кеша! Например, если я загружаю страницу с помощью nid 5, она печатает 5, но если я перейду на страницу с nid 3, она напечатает 5. Очистка страницы кеша и перезагрузки с помощью nid 3. Я получаю значение 3, напечатанное. Я думаю, что это проблема с системой кэширования шаблонов в D8, знаете ли вы об этом?

4 голоса | спросил Gabriele 29 Jpm1000000pmFri, 29 Jan 2016 22:38:52 +030016 2016, 22:38:52

2 ответа


4

Блоки кэшируются. Однако блоки также контекстно-зависимы в Drupal 8. На странице документации относительно Контекстов кэша:

  

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

Страница документации Документация по кэшу является хорошим для всех.

Плагин блока должен реализовывать getCacheContexts. Я думаю, что в этом случае это должно быть либо «route.name», либо «url.path». Возможно, вам придется немного вникать в это для вашего конкретного случая использования.

  public function getCacheContexts() {
    return array('route.name');
  }
ответил mradcliffe 29 Jpm1000000pmFri, 29 Jan 2016 23:21:11 +030016 2016, 23:21:11
5

Правильный способ сделать это - использовать контексты. Контексты плагинов, а не кеш-контексты.

Аналогично NodeType , добавьте что-то вроде этого в свою аннотацию к плагину:

* context = {
*  "node" = @ContextDefinition("entity:node", label = @Translation("Node"))
* }

И затем получите узел, используя $ this-> getContextValue ('node').

Это имеет два преимущества:

  • Ваш блок напрямую не зависит от глобального состояния. Его можно, например, использовать также в диспетчере страниц с другим узлом.
  • Drupal автоматически понимает, что ваш блок зависит от того, какой узел передан. Если вы используете текущий узел, он будет меняться по маршруту, если это будет, например, быть узлом из статического контекста менеджера страниц, это не так. Он также будет включать теги кэша, если узел будет изменен таким образом, который повлияет на ваш вывод.
ответил Berdir 30 Jpm1000000pmSat, 30 Jan 2016 16:58:09 +030016 2016, 16:58:09

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132