rasteiner/k3-whenquery

条件性地显示字段和部分。更好。

安装数: 8,576

依赖项: 0

建议者: 0

安全: 0

星标: 64

关注者: 7

分支: 1

开放问题: 4

语言: TypeScript

类型: kirby-plugin

0.5.0 2023-05-23 14:11 UTC

This package is auto-updated.

Last update: 2024-09-16 16:08:50 UTC


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。正则表达式仅与搜索运算符结合使用时才有用。

还支持字符串、数字、布尔值(truefalse)、对象和数组字面量。

数组运算符

  • ::map(expr):将数组中的每个元素替换为右侧表达式
  • ::filter(expr):通过评估右侧表达式来过滤数组
  • ::count(expr):计算数组中所有返回右侧表达式为真的元素的数量
  • ::any(expr):如果数组中至少有一个元素返回右侧表达式为真,则返回true,否则返回false
  • ::all(expr):如果数组中所有元素返回右侧表达式为真,则返回true,否则返回false
通用语法

数组运算符由3部分组成

  1. 在左侧是它们操作的数组
  2. ::之后是操作名称
  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'

已知问题

  • 此插件扩展并替换了默认的BlocksLayout字段类型。这意味着它与其他执行相同功能的插件不兼容。