Drupal 7忽略模板中的$ _SESSION

时间:2018-12-03 20:10:37

标签: session drupal drupal-7

我正在使用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 :(得分:1)

不要搞乱Reddit上提到的/u/maiznieks之类的会话。它会影响性能。

过去,我不得不做类似的事情,并且采用了/ u / maiznieks提到的方法。就是这样

  • 通过Drupal.settings.上的JS返回数组中的所有URL
  • 检查是否设置了cookie。
    • 如果不是,请进行设置并将其值设置为0。
    • 如果已设置,则获取值,将值增加一,然后将其保存到cookie中。
  • 有了该值,现在您有了一个索引。
  • 检查是否存在image[index]
    • 如果有,请向用户显示。
    • 如果没有,请重置index为0并显示。将0保存到cookie。

您继续缓存。您会在每次页面加载时继续向用户显示新图像。

您可以将当前视图设置为每5分钟进行一次随机排序。然后,您只需要更新上述逻辑即可替换该映像。这样,您可以使没有JS的用户也可以使用类似的功能,而其余功能仍保留此功能。

如果愿意,您可以将以上Cookie替换为HTML5本地存储。

答案 1 :(得分:0)

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