drupal笔记之block缓存踩坑

39 篇文章 0 订阅

今天有一个功能:在特定页面的footer内容会产生变化
当前footer是使用block做的,放置在footer的,这样所有页面的footer都是一样的。现在页面pageA的footer需要也其他页面不一样。

思路:
1、在hook中用字符串替换方式替换指定内容
修改简单,但是不易于后期维护
2、创建一个新的footer block(new_footer),在hook中判断页面,如果是pageA页面就获取new_footer 的内容,将$variables中原有的footer内容换掉
3、创建一个新的footer block(new_footer),在hook中判断页面,如果是pageA页面就获取new_footer 的内容,然后赋值给新的字段变量,然后在覆写footer模板,根据页面判断,取对应的变量。

我这里尝试了方法2和方法3,都有一个问题:因为缓存的原因,所有页面显示的都是缓存的footer block内容,比如我清除缓存之后,县访问首页,footer是原来的内容,但是再访问pageA的时候,footer仍然是员阿里的内容,并没有替换为new_footer 的内容。
解决方法:
hook_preprocess_block hook中,清除指定block的缓存:

function theme_preprocess_block(&$vars) {
  if ($vars['elements']['#id'] == 'footer') {
    $vars['#cache']['max-age'] = 0;
  }
}

PS: 如果你是drupal9.3,恭喜你,你可能会踩到新的坑:
我的项目就是9.0升级到9.3,所以当我刷新block的缓存后,我发现footer block的ID由 block-footertext 变成了 block-footertext–2,然后我的样式就出问题了。

解决方案:
1、在footer block上添加自定义的唯一class,所有样式使用自定义的class。这个要最开始就考虑到才好。我这个不方便使用这个方法。
2、给drupal打补丁,参考:
Update to Drupal 9.3.0 adding --2 suffix to (views-) block-ID’s

我打补丁的时候又遇到了问题:
因为我没有composer权限,所以我用了命令 patch p1 < 0001-PM-autocomplet.patch 来打补丁,结果:
提示让我输入文件路径,我一脸懵逼:什么文件路径?我不是给了吗?
然后去搜索,找到这个:
apply patch when asked File to patch, what should I do?
大概这个意思:
patch -p1必须满足几个条件。
您必须位于内核源代码树的顶级目录中。该-p1选项将从文件名中删除一个路径组件,因此a/include/linux/pm_qos.h将被视为include/linux/pm_qos.h. 这是一个必须从当前工作目录解析的相对路径。
该文件include/linux/pm_qos.h必须存在于您尝试修补的内核版本中。
如果不满足 1 和 2,patch则将找不到要应用的文件,并以交互方式要求您提供路径名。
然后当然是:
该include/linux/pm_qos.h文件必须与生成补丁的文件“足够相似”,否则补丁将无法应用。
相同的说明分别适用于补丁中提到的所有其他文件

最后实在没搞明白这个路径是什么,我根据补丁包的内容,直接找到对应的文件,按照补丁包修改了对应的文件。这个方法只适合小补丁,要是修改的文件跟多就非常麻烦了。

最后补充一下如何使用composer打补丁,参考:
通过 Composer 应用 Drupal 8 补丁而不更新 Drupal Core

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值