netresearch / contexts
TYPO3 的上下文 - 可以根据多个条件在前端修改页面行为
Requires
- ext-pdo: *
- typo3/cms-backend: ^11.5
- typo3/cms-core: ^11.5
- typo3/cms-extbase: ^11.5
- typo3/cms-extensionmanager: ^11.5
- typo3/cms-frontend: ^11.5
Requires (Dev)
- phpro/grumphp: ^1.13.0
- phpstan/phpstan: ^1.10
- phpstan/phpstan-deprecation-rules: ^1.1
- phpstan/phpstan-phpunit: ^1.3
- phpstan/phpstan-strict-rules: ^1.5
- phpunit/phpunit: ^9.5
- squizlabs/php_codesniffer: ^3.7
- ssch/typo3-rector: ^1.4.1
README
多渠道上下文
根据可配置的 "上下文" 显示和隐藏页面和内容元素。使用上下文,TYPO3 能够实现多渠道输出。
上下文示例
- 屏幕尺寸小于 500px
- 浏览器在平板电脑或手机上运行
- 位置在某个地方附近 15km
- 用户来自某些国家之一
- 用户通过 GET 参数
affID=foo
访问网站 - 用户 IP 与给定的规则匹配
- 已设置会话变量
- 任何其他规则的组合
除了上下文规则之外,此扩展还提供了一个 API,可以在自己的扩展中使用上下文。
设置
- 安装并激活扩展
contexts
- 清除 TYPO3 缓存
可选:安装扩展 contexts_geolocation
以使用基于位置的上下文规则(大陆、国家、区域)和 contexts_wurfl
以使用基于设备的规则(类型检查:手机、平板电脑、电视等;屏幕尺寸、设备/浏览器类型)。
创建和使用上下文
创建上下文
-
以管理员身份登录 TYPO3 后台
-
转到 Web/列表视图,根页面(ID 0)
-
创建新记录:TYPO3 上下文 -> 上下文
- 给它一个标题,例如 "Affiliate ID: foo"
- 选择类型:"GET 参数"
- GET 参数名称:
affID
- 参数值:
foo
- 激活 "将结果存储在用户会话中"
- 保存并关闭
使用上下文
- 转到 Web/页面,选择一个页面
- 编辑内容元素
- 选择 "上下文" 选项卡
- 对于上下文 "Affiliate ID: foo",选择 "可见:是"
- 保存
查看页面。内容元素不可见。
现在将 ?affID=foo
添加到 URL 并加载它。内容元素现在可见。
现在您可以访问其他页面。当您回来时,内容元素仍然可见 - 即使 GET 参数不再在 URL 中 - 因为已激活 "将结果存储在用户会话中"。
上下文类型
contexts
扩展附带了一些简单的上下文。所有这些都存储在表 tx_contexts_contexts
中。
域名
当用户访问的域名在配置的列表中时,将匹配域名上下文。
如果网站在多个域名上可用,或者在开发/测试/生产系统上部署,这很有用 - 您可以选择仅在开发系统上显示内容元素。
域名匹配
您可以每行使用一个域名。
如果域名不以点开头,它将仅完全匹配:www.example.org
不会匹配配置的域名 example.org
。
可以在域名名前使用点。在这种情况下,所有子域名都将匹配:some.www.example.org
匹配配置的域名 .example.org
。
GET 参数
检查是否存在可用的 GET 参数并具有特定的值。
激活 "将结果存储在用户会话中" 以在页面之间导航时保持上下文。
当参数值字段为空时,任何非空参数值都会激活上下文。
IP 地址
匹配用户的IP地址。支持IPv4和IPv6。
支持的表示法
- 完整地址:
80.76.201.32
- 前缀:
80.76.201.32/27
,FE80::/16
- 通配符:
80.76.201.*
,80.76.*.37
,80.76.*.*
HTTP 头部
检查HTTP头是否可用并具有特定值。
激活 "将结果存储在用户会话中" 以在页面之间导航时保持上下文。
当参数值字段为空时,任何非空参数值都会激活上下文。
逻辑上下文组合
使用逻辑运算符组合其他上下文。
通过其别名引用上下文,并且可以使用以下符号组合
- 逻辑与:
&&
- 逻辑或:
||
- 否定:
!
- 括号用于分组表达式的一部分:
(...)
会话变量
此上下文检查是否存在具有给定名称的会话变量(不是NULL)。
Fluid 模板实现
在流体模板中实现上下文查询的示例:
<div xmlns="http://www.w3.org/1999/xhtml" xmlns:contexts="http://typo3.org/ns/Tx_Contexts_ViewHelpers"> <f:if condition="{contexts:matches(alias:'mobile')}"> <f:then>is Mobile</f:then> <f:else>is not Mobile</f:else> </f:if> </div>
TypoScript 实现
在TypoScript中实现上下文查询的示例:
[contextMatch("mobile")]
# do something, it's a mobile browser
[END]
测试
composer update vendor/bin/phpcs Classes/ --standard=PSR12 vendor/bin/phpstan analyse --configuration phpstan.neon vendor/bin/rector --dry-run