rasteiner / k3-whenquery
条件性地显示字段和部分。更好。
Requires
- getkirby/cms: >=3.8
- getkirby/composer-installer: ^1.2
README
条件性地显示字段和部分。更好。
安装
下载
下载并将此存储库复制到 /site/plugins/k3-whenquery
。
Git 子模块
git submodule add https://github.com/rasteiner/k3-whenquery.git site/plugins/k3-whenquery
Composer
composer require rasteiner/k3-whenquery
使用
将 whenQuery
属性添加到您的字段和部分。此查询中的表达式将在浏览器中实时评估,当评估结果为 假值 时将隐藏部分或字段。
title: Woofler page fields: foosables: type: select label: Foosables options: gerryconas: Gerryconas peterwands: Peterwands perlskippies: Perl Skippies barsters: type: range label: Barsters warning: type: info label: Woofling warning text: Having more than 30 Barsters is **not recommended** while wooffling Gerryconas. theme: negative whenQuery: foosables = 'gerryconas' && barsters > 30
表达式语言语法
没有赋值和函数调用(尽可能无害)。由于没有赋值,=
是一个相等比较(没有 ==
)。
支持的运算符
... = ...
: 等于... != ...
: 不等于... < ...
: 小于... > ...
: 大于... <= ...
: 小于等于... >= ...
: 大于等于... =~ ...
: 在某物中搜索某物(见下文)... ?? ...
: 空值合并运算符... ? ... : ...
: 三元运算符... || ...
: 逻辑或... && ...
: 逻辑与... + ...
: 字符串连接或数字相加... - ...
: 数字相减... * ...
: 数字相乘... / ...
: 数字相除... % ...
: 余数运算符(...)
: 优先级分组...[...]
: 可选下标运算符(计算成员访问).
: 可选标识符成员访问... ::map(...)
: 数组map
运算符(见下文)... ::filter(...)
: 数组filter
运算符(见下文)... ::count(...)
: 数组count
运算符(见下文)... ::any(...)
: 数组any
运算符(见下文)... ::all(...)
: 数组all
运算符(见下文)... ::reduce(...)
: 数组 Reducer(见下文)
成员访问始终是“可选的”:如果访问未定义的属性,它永远不会抛出错误;它只会评估为 undefined
。简而言之,.
的行为类似于 JavaScript 的 ?.
,而 a[something]
的行为类似于 a?.[something]
。
搜索运算符 =~
是一个多功能工具:它根据操作数的类型表现不同
"string" =~ "tri"
: 字符串与字符串,如果字符串包含另一个字符串,则返回true
[a,b,c] =~ a
: 元素与数组,如果数组中存在元素,则返回true
。此情况还可以选择以相反的顺序编写:a =~ [a,b,c]
[a,b,c] =~ [b,c]
: 数组与数组,如果右侧所有元素都存在于左侧数组中,则返回true
12 =~ 2
: 数字与数字,如果“左”能被“右”整除(left % right = 0
),则返回true
"string" =~ /inG$/i
: 正则表达式与字符串,如果字符串与正则表达式匹配,则返回true
。正则表达式仅与搜索运算符结合使用时才有用。
还支持字符串、数字、布尔值(true
、false
)、对象和数组字面量。
数组运算符
::map(expr)
:将数组中的每个元素替换为右侧表达式::filter(expr)
:通过评估右侧表达式来过滤数组::count(expr)
:计算数组中所有返回右侧表达式为真的元素的数量::any(expr)
:如果数组中至少有一个元素返回右侧表达式为真,则返回true
,否则返回false
::all(expr)
:如果数组中所有元素返回右侧表达式为真,则返回true
,否则返回false
通用语法
数组运算符由3部分组成
- 在左侧是它们操作的数组
- 在
::
之后是操作名称 - 在括号之间是评估每个数组元素的表达式。
在括号内,符号$
代表"当前"元素。
示例
fields: blocks: type: blocks imagesEncouragement: type: info label: Nice job! text: Good! You have at least 13 images in this post. This will be a **great** post. theme: positive whenQuery: blocks ::count($.type = 'image') >= 13
数组归约器
数组归约器是接受一个数组并返回单个值的函数。它们可以用于聚合数组中的值。语法与数组运算符类似,但::reduce(expr, ?initial)
接受一个可选的初始值。如果没有提供初始值,则使用数组的第一个元素。在括号内,符号$
代表"当前"元素,而$1
代表"前一个"迭代(即"累加器")的返回值。数组始终从左到右遍历。
示例
fields: percentages: type: structure fields: percent: type: number after: "%" percentagesEncouragement: type: info label: Math GENIUS! text: Great job! The sum of all percentages is exactly 100%. theme: positive whenQuery: percentages ::reduce($1 + $.percent, 0) = 100
不使用初始值的示例用法
whenQuery: percentages ::map($.percent) ::reduce($1 + $) = 100
变量查找
内容变量
默认情况下,任何有效的标识符都指向"当前"字段集。这意味着页面字段可能会在查询执行时被结构或块中的具有相同名称的其他字段覆盖。如果在当前字段集中找不到字段,则查询在页面字段中执行。
模型变量
站点、页面、文件和用户是"模型"。除了内容之外,它们还有可能在查询中非常有用的其他属性。这些属性可以通过在其名称前加下划线(_
)来访问,当(并且仅在)查询在其相应的视图中执行时。
可访问的站点属性
_title
:站点的标题
可访问的页面属性
_status
:页面的状态('草稿'、'未列出'或'列出'之一)_id
:页面的id_title
:页面的标题
可访问的用户属性
_id
:用户的id_email
:用户的电子邮件_name
:用户的姓名_username
:用户的用户名(可以是姓名或电子邮件作为后备)_language
:用户的语言_role
:用户的角色名称(例如,"Admin"以大写"A"开头)_avatar
:用户的头像url_account
:布尔值,表示这是否是当前用户的账户
可访问的文件属性
_dimensions.width
:如果文件是图像,则图像的宽度_dimensions.height
:如果文件是图像,则图像的高度_dimensions.ratio
:如果文件是图像,则图像的比率_dimensions.orientation
:如果文件是图像,则"横向"、"正方形"或"纵向"之一_extension
:文件的扩展名(例如:"jpg"、"png"、"gif")_filename
:文件的名称_mime
:文件的MIME类型_niceSize
:文件的友好大小(例如:"1.2 MB"、"2.3 KB")_template
:文件模板_type
:文件类型,可以是“archive”、“audio”、“code”、“document”、“image”、“video”或null_url
:指向文件的媒体URL
示例
fields: date: type: date dateInfo: type: info label: Heads up! text: This page is listed, its date will be ignored for sorting. theme: positive whenQuery: date && _status = 'listed'
已知问题
- 此插件扩展并替换了默认的
Blocks
和Layout
字段类型。这意味着它与其他执行相同功能的插件不兼容。