У мене виникло питання, коли блок, який повинен бути унікальним на кожній сторінці, не для користувачів, які вийшли з системи. Проблема - це плагін спеціального блоку, який я маю на сторінці пошуку переглядів, яка містить власні фільтри (на зразок власної заміни для відкритих фільтрів. Блок, розміщений через / admin / structure / block).
На основі того, що я дізнався про Drupal 8, я додав контексти кешу до свого масиву збирання:
public function build() {
$search_form = \Drupal::formBuilder()->getForm('Drupal\mymodule\Form\SearchForm');
return [
'search_form' => $search_form,
'#cache' => ['contexts' => ['url.path', 'url.query_args']]
];
}
Але здається, що це повинно бути невірним, оскільки при виході з нього блок буде кешований під час першого перегляду, а коли URL-адреса змінюється, не відображається нова версія блоку.
Я подумав, що причиною проблеми може стати сторінка перегляду, але навіть коли я вимкнув кешування на сторінці перегляду, проблема залишилася.
Мені вдалося виправити проблему кількома способами, наприклад, за допомогою гачка prepcess_block:
function mymodule_preprocess_block__mycustomsearchblock(&$variables) {
$variables['#cache']['contexts'][] = 'url.path';
$variables['#cache']['contexts'][] = 'url.query_args';
}
Але це мене непокоїло, що я не міг просто помістити кеш-контексти в масив збірки мого блоку.
Оскільки мій блок поширює BlockBase, я вирішив спробувати метод getCacheContexts (), тим більше, що я бачив, як деякі модулі в ядрі роблять це таким чином.
public function getCacheContexts() {
return Cache::mergeContexts(parent::getCacheContexts(), ['url.path', 'url.query_args']);
}
Це також виправлено проблему, але що цікаво, коли я видаю змінні у функції блоку попередньої обробки, вони не відображаються у $ змінних ['# кеш'] ['контексти'], але вони відображаються в $ змінних ['елементи '] [' # кеш '] [' контексти ']
array:5 [▼
0 => "languages:language_interface"
1 => "theme"
2 => "url.path"
3 => "url.query_args"
4 => "user.permissions"
]
Я намагаюся розібратися, як це працює, і чому це не працює від функції збірки.
Дивлячись на /core/modules/block/src/BlockViewBuilder.php на функцію viewMultiple (), схоже, вона витягує теги кешу з сутності та плагіна:
'contexts' => Cache::mergeContexts(
$entity->getCacheContexts(),
$plugin->getCacheContexts()
),
Отже, це пояснює, чому додавання методу getCacheContexts () до мого блокового плагіну додає контексти до мого блоку. Крім того, дивлячись на метод preRender у тому ж класі, схоже, що він не використовує масив кешу у функції збирання блоків, що мене бентежить, оскільки, здається, спосіб додавання кешування в Drupal 8 - це додавання #cache елемент для візуалізації елементів.
Отже, моє питання:
1) Чи додаються контексти кешу безпосередньо в масив в блочному плагіні?
2) Якщо так, чи існує спосіб цього, чи потрібно додати його до дочірнього елемента масиву збірки?
3) Якщо контекст, що додається безпосередньо, ігнорується, чи додає getCacheContexts () спосіб перейти на блокові плагіни у користувацьких модулях?