Session Drupal 7忽略模板中的$\会话

Session Drupal 7忽略模板中的$\会话,session,drupal,drupal-7,Session,Drupal,Drupal 7,我正在Drupal7中的自定义主题中编写一个简单的脚本,该脚本应该在用户每次加载页面时通过不同的背景图像进行旋转。这是我在[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; }

我正在Drupal7中的自定义主题中编写一个简单的脚本,该脚本应该在用户每次加载页面时通过不同的背景图像进行旋转。这是我在
[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,然后始终显示相同的图像,则会话将永远不会启动


我假设,由于此代码位于视图文件中,视图代码正在为匿名用户进行缓存,因此会话从未启动,但我不知道如何以其他方式执行我想要的操作

@hobberwickey,我建议创建一个自定义模块并在模块中实现。根据drupal引导过程,会话层每次都会在缓存层之后调用。hook_boot可以在缓存页中调用,也可以在引导过程之前调用。您可以获取更多信息。

不要像Reddit上提到的那样干扰会话。这将影响性能

我过去也曾做过类似的事情,采用了/u/maiznieks提到的方法。是这样的

  • 通过
    Drupal.settings上的JS返回数组中的所有URL。
  • 检查是否设置了cookie。
    • 如果不是,则将其设置并将其值设置为0
    • 如果已设置,则获取值,将值增加1,然后将其保存到cookie
  • 有了这个值,现在就有了索引
  • 检查是否存在
    图像[索引]
    • 如果有,则向用户显示
    • 如果没有,则将索引重置为0并显示该值。将0保存到cookie
你继续缓存。每次加载页面时,您都会不断向用户显示新图像

您可以将当前视图设置为每5分钟进行一次随机排序。然后,您只需更新上面的逻辑即可替换该图像。通过这种方式,您可以为没有JS的用户保留类似的功能,但在其余部分仍然保留此功能


如果愿意,您可以用HTML5本地存储替换上面的cookie

你最终想要实现什么?