Drupal 7 игнорирует $ _SESSION в шаблоне - PullRequest
0 голосов
/ 03 декабря 2018

Я работаю над простым скриптом в пользовательской теме в Drupal 7, который должен просто вращаться по разному фоновому изображению каждый раз, когда пользователь загружает страницу.Это мой код в [view].tpl.php, который выбирает, какое изображение использовать.

$img_index = (!isset($_SESSION["img_index"]) || is_null($_SESSION["img_index"])) ? 1 : $_SESSION["img_index"] + 1;
if ($img_index > 2) {
 $img_index = 0;
}

$_SESSION["img_index"] = $img_index;

Довольно простые вещи, и они прекрасно работают, пока Drupal запускает сессию.Однако, если я удаляю свой сеансовый файл cookie, то всегда показывает одно и то же изображение, сеанс никогда не запускается.

Я предполагаю, что, поскольку этот код находится в файле представления, код представления кэшируется для анонимных пользователей и, следовательно, сеанс никогда не запускается, но я не могу понять, как иначе сделать то, что яхочу.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Не связывайтесь с сессией, как / u / maiznieks , упомянутой в Reddit.Это повлияет на производительность.

В прошлом мне приходилось делать нечто подобное, и я использовал такой подход, как / u / maiznieks.Это примерно так:

  • Вернуть все URL-адреса в массиве через JS на Drupal.settings.
  • Проверить, установлен ли файл cookie.
    • Если это не так, установите его и установите для него значение 0.
    • Если оно установлено, получите значение, увеличьте значение на единицу и сохраните его в файле cookie.
  • С этим значением теперь у вас есть индекс.
  • Проверьте, существует ли image[index]
    • Если это так, покажите это пользователю.
    • Если этого не произойдет, сбросьте index в 0 и покажите это.Сохраните 0 в cookie.

Вы продолжаете кэшировать.Вы продолжаете показывать пользователю новые изображения на каждой странице загрузки.

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

При желании вы можете заменить указанные выше файлы cookie локальным хранилищем HTML5.

0 голосов
/ 07 декабря 2018

@ hobberwickey, я предлагаю создать пользовательский модуль и внедрить в него hook_boot () .Согласно drupal, процесс загрузки будет вызывать сеансовый слой каждый раз после слоя кэша.hook_boot может быть вызван на страницах кеша, а также перед процессом начальной загрузки.Вы можете получить больше информации здесь .

...