Где указать контекст кеша для работы на всех страницах? - PullRequest
0 голосов
/ 16 января 2020

Я хотел бы настроить свой веб-сайт Drupal 8 таким образом, чтобы в любое время параметр запроса «refcode» использовался для посещения моего сайта, и это значение реплицировалось во все ссылки меню на этой странице. Например, использование https://www.example.com?refcode=joe добавит «? Refcode = joe» ко всем ссылкам меню на этой странице. Когда кто-то заходит на сайт с использованием определенного кода ссылки, то использование ссылок меню для перемещения по сайту сохранит этот код возврата, а использование ссылок меню для перехода от сайта также сохранит этот код ссылки на внешние ссылки меню.

Когда кеш пуст, этот код работает:

function mymodule_link_alter( &$variables )
{
    if ( $refcode = \Drupal::request( )->query->get( 'refcode' ) )
        $variables['options']['query']['refcode'] = $refcode;
}

Когда страница кэшируется, это не так. Я попытался добавить это:

$variables['#cache']['contexts'][] = 'url.query_args:refcode';

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

1 Ответ

0 голосов
/ 22 января 2020

Я наконец понял это. Я должен определить, какие типы блоков и какие типы узлов могут ссылаться на параметр запроса refcode и обновить для них настройки кэша:

function mymodule_preprocess_block( &$variables )
{
    if ( $variables['base_plugin_id'] == 'system_menu_block' )
        $variables['#cache']['contexts'][] = 'url.query_args:refcode';
}

function mymodule_preprocess_node( &$variables )
{
    if ( $variables['node']->bundle( ) == 'main' )
        $variables['#cache']['contexts'][] = 'url.query_args:refcode';
}
...