Настройка тега кеша и аннулирование кеша блока с помощью перехватчика и события?Php

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Настройка тега кеша и аннулирование кеша блока с помощью перехватчика и события?

Сообщение Anonymous »

Я пытаюсь настроить это без использования плагина видимости блоков, и это работает для пользователя, но внутренне я хотел бы иметь лучший контроль, используя свои собственные теги кэша.
Мой проблема в том, что я не могу найти правильную комбинацию того, где вставить тег кеша в блок, чтобы иметь возможность сделать его недействительным позже. Я пробовал различные перехватчики блоков и до сих пор события kernel.request и kernel.finish_request. Последний идет после перехватчиков и по-прежнему делает кеш недействительным (когда я делаю это в общем случае, т. е. не использую свои собственные теги кеша), так что это хорошее начало.
Общая цель — иметь возможность альтернативный блок, который пользователь видит при последующих просмотрах той же страницы. Итак, скажем, на домашней странице при первом просмотре может отображаться блок A, при следующем просмотре блок B, третий блок C, а затем вернуться к блоку A и так далее.
С кешем выключен (т.е. в режиме разработки) работает нормально. Кроме того, аннулирование кеша без ссылки на мои собственные теги с обычным кешированием также работает нормально. Но я бы хотел сделать это, используя свои собственные теги кеша.
Выбор отображаемого блока определяется в хукеook_block_access(), поэтому перед этим мне нужно подготовить готовую настройку. event.
Я открыт для другого подхода к использованию блочных перехватчиков, если это не очень хорошая идея, поэтому альтернативные идеи приветствуются. Однако, если мне просто нужно что-то настроить, и это будет работать, даже лучше.
Причина, по которой я используюook_block_view_alter(), а не более ранний хук, заключается в том, что до этого я заметил что идентификатор блока может еще не быть (или, может быть, я что-то пропустил, и если да, то, пожалуйста, поправьте меня) в более ранних хуках, и мне нужен идентификатор блока.
Ниже показано, что у меня есть. далеко.
// In the .module file...

/**
* Implements hook_block_view_alter().
*/
function my_module_block_view_alter(array &$build, BlockPluginInterface $block) {
// 3rd hook to get called in the block hooks
if (array_key_exists('#id', $build) ) {
$ci = MyController::getInfo($build['#id']);
if ($ci['CanControl'] !== []) {
$controlId = &$ci['CanControl']['id'];
$build['#cache']['tags'][] = $controlId;
$build['#cache']['tags'][] = "$controlId:$build[#id]");
}
}
}

// In an event subscriber module off the kernel.FinishRequest event.

class BlockCacheManager implements EventSubscriberInterface {

// EVENT SUBSCRIBER STUFF THEN...

public function kernelFinishRequest(Event $event) {
// Ignore AJAX calls
if (!Drupal::request()->isXmlHttpRequest()) {

// CODE THAT GETS THE RELEVANT BLOCK IDs THEN...

$blocks = Block::loadMultiple($blockIds);
$tags = [];
foreach ($blocks as $block) {
$bTags = $block->getCacheTagsToInvalidate(); // My tags are not here
$bTags2 = $block->getCacheTags(); // nor here
$tags = array_merge($tags, $block->getCacheTagsToInvalidate());
}

// What I would like to to do is below but my tags don't show up with
// $block->getCacheTags() or $block->getCacheTagsToInvalidate() as
// indicated above.
foreach ($blockIds as $blockId) {
$cacheTags[] = "$controlId:$build[#id]";
}
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/765 ... -and-an-ev
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»