Игнорировать кэш в функции предварительной обработки


У меня есть тип контента "домашняя страница", содержащий один узел, который используется на домашней странице. Этот узел имеет многозначное поле изображения, и мне нужно случайным образом выбрать одно из этих изображений для отображения на главной странице при каждом посещении сайта. Я написал логику для этого в функции THEME_preprocess_node в моем файле THEME.theme. Это работает нормально, но сайт, о котором идет речь, все еще находится в режиме разработки, при этом большая часть кэширования отключена. Я беспокоюсь, что как только сайт заработает и кэширование будет активированный, он будет обслуживать домашнюю страницу из кэша и, следовательно, всегда показывать одно и то же изображение, пока не истечет срок действия кэшированной версии страницы.

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

Вот код, который я написал для этого:

  $imgages = $node->get('field_frontpage_header_image');
  $random = $imgs->get(rand(0, $imgages->count() - 1))->getValue();
  $img = File::load($random['target_id']);
  $variables['random_header_image'] = ImageStyle::load('frontpage_header')->buildUrl($img->getFileUri());

Затем я использую {{ random_header_image }} в шаблоне ветки. Может быть, я смогу изменить эту переменную на массив визуализации с настройка кэша max-age => 0? Не уверен, что это работает в функциях предварительной обработки...

Спасибо!

 2
Author: MoritzLost, 2018-01-17

1 answers

Если у вас ограниченный набор изображений, то я бы просто написал пользовательский форматер, который отображает, например, тег изображения с атрибутом данных, в котором есть ваш список путей к изображениям (возможно, с первым изображением, уже установленным в качестве запасного варианта, отличного от JS). тогда вам просто понадобится небольшой кусочек JS, который случайным образом выбирает один из них и устанавливает его в качестве фактического атрибута src. Тогда ваша страница будет полностью кэширована, и, хотя все еще может быть заметная задержка до появления изображения, это может даже это происходит со статическими ссылками на изображения при более медленных соединениях.

И это, безусловно, будет намного быстрее, чем запрос ajax.

Подход с заполнителями также может сработать, и Drupal поддерживает такой тип из коробки с динамическим кэшем страниц, для этого не требуется обратный прокси-сервер или что-то в этом роде. но тогда вам придется отключить внутренний кэш страницы на этой странице. См. http://www.qed42.com/blog/lazy-builders-drupal8 для примера на этот счет.

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

 2
Author: Berdir, 2018-01-18 21:28:03