大伟哥最近做行业站的时候,有个需求,是希望注册用户在网站上填写的个人联系方式如手机号码、QQ号码等,只对网站的处于登录状态的注册用户可见,而对于搜索引擎和匿名访客,则不显示这些字段信息。这样的话,一方面可以在一定程度上保护用户的私人信息,另一方面也能够激励访客注册成为会员,增强网站的互动性。
Drupal群里的热心网友给出了两个实现方法,一个是使用 field permissions 模块,另一个是直接使用字段的主题覆写实现。
大伟哥首先试用了 field permissions 模块,这个模块把Drupal的权限管理粒度从默认的节点级权限下放到了字段级,允许管理员对任意实体的不同字段分配不同的权限给不同的角色用户,经过设置,完全可以实现对未登录用户隐藏指定字段内容的目的。
然而,field permissions 的字段隐藏,是该字段的标签和值一起隐藏,对未登录的匿名用户来说完全看不到有这项内容。
但是大伟哥还想再多实现一点,让未登录的匿名用户,看到的是“手机号码:登录后可见”这样的样式。也就是说即使不登录,也能看到有这么一项,只是内容需要登录后才可以查看。如此一来,是不是会让访客有那么一刹那产生一点注册成为会员的冲动呢?
经过测试,这个需求可以通过简单的主题覆写实现。思路就是在该字段的twig模版里加一个判断,看看当前的访客是不是已经登录了,如果是登录用户,就直接输出字段标签和字段值,如果是匿名用户,就输出字段标签加上登录后可见的提示。
以下是具体操作步骤:
1.找到原来负责展示该字段的twig模版,并用新的twig文件覆写。这个通过可以开启twig debug功能实现。大伟哥这里要改的是用户字段,经过debug查看,发现当前字段是由core/themes/classy/templates/field/field.html.twig控制输出的,而且模版覆盖的顺序如下:
<!-- FILE NAME SUGGESTIONS: * field--user--field-mobile_phone--user.html.twig * field--user--field-mobile_phone.html.twig * field--user--user.html.twig * field--field-mobile_phone.html.twig * field--integer.html.twig x field.html.twig -->
本着最小化影响的原则,大伟哥复制web/core/themes/classy/templates/field/field.html.twig这个文件到自定义主题的template目录,并更改文件名为field--user--field-mobile_phone--user.html.twig,完整文件路径为:document_root/web/themes/custom/theme_name/templates/field--user--field-mobile_phone--user.html.twig
2.修改field--user--field-mobile_phone--user.html.twig文件,在输出字段的地方加入{% if logged_in %}判断并保存:
<div{{ attributes.addClass(classes) }}> <div{{ title_attributes.addClass(title_classes) }}>{{ label }}</div> {% if multiple %} <div class="field__items"> {% endif %} {% for item in items %} {% if logged_in %} <div{{ item.attributes.addClass('field__item') }}>{{ item.content }}</div> {% else %} <div{{ item.attributes.addClass('field__item') }}>登录后可见</div> {% endif %} {% endfor %} {% if multiple %} </div>
3. 将该文件原样复制并重命名,可以覆写其他需要同样操作的字段。
4. 清除Drupal 缓存, 让新的twig模版生效。以匿名用户的身份打开网页,效果是这样的:
总结:
1. Drupal 牛掰, Drupal Yes.
2. Twig 牛掰, Twig Yes.
3.大伟哥牛掰,大伟哥YES.(手动狗头,捂脸,逃……)
- 添加新评论
- 268 阅读
评论
大伟锅真是国内drupal骨灰级砖家兼布道者。
添加新评论