aplia / filter
适用于eZ publish旧版本的灵活且可扩展的属性过滤器
Requires
- php: >=5.3
- composer/composer: >=1.0
README
为eZ publish旧版本内容对象提供高级过滤器支持。该过滤器支持嵌套结构,具有AND
和OR
操作等。它有效地替换了其他特定过滤器扩展,如OWOrFilter
,以及常规属性过滤器。
该扩展以apliafilter
名称安装,并提供名为NestedFilterSet
的属性过滤器。
安装
使用composer安装此扩展
composer require aplia/filter
用法
在列出内容对象时,可以通过将其作为扩展属性过滤器安装,然后使用params
定义嵌套结构来启用此过滤器。然后,该结构将被转换为SQL查询并添加到正常内容对象查询中。
例如,在模板中可以这样做
{fetch('content', 'list',
hash(
'parent_node_id', 2,
'depth', 20,
'limit', 10,
'sort_by', array('published', false()),
'class_filter_type', 'include',
'class_filter_array', array('article'),
'extended_attribute_filter', hash(
'id', 'NestedFilterSet',
'params', array(
array(array('article/type'), $type),
)
)
)
)}
PHP中的类似示例
\eZContentObjectTreeNode::subTreeByNodeId( array( 'Depth' => 20, 'Limit' => 10, 'SortBy' => ['published', false], 'ClassFilterType' => 'include', 'ClassFilterArray' => ['article'], 'ExtendedAttributeFilter' => [ 'id' => 'NestedFilterSet', 'params' => array( 'cond' => 'OR', 'attrs' => array( ) ), ], ), 2 );
NestedFilterSet
一种扩展属性过滤器,允许使用嵌套结构,并统一属性过滤器和扩展属性过滤器。该过滤器可以通过自定义类进行扩展,从而绕过只能使用一个扩展属性过滤器的问题。该过滤器还支持同时对多个内容类进行过滤,在这种情况下,它将与属性表进行外连接。
以下元素可以被扩展
- 数据类型
- 修改器
- 属性
请参阅filter.ini.append进行配置。
语法
每个属性过滤器的语法是一个包含属性名和值的数组,例如。
['name', 'foo']
属性名也可以包含修改器和运算符(默认为=
)。例如。
['my_class/size:>', 5]
支持的运算符与eZ publish中属性过滤器相同。
=
!=
>
>=
<
<=
in
not_in
like
not_like
between
not_between
过滤器的参数可以是
['cond' => 'and'/'or', 'attrs' => [...]
这定义了一个具有每个过滤器之间and
或or
条件的属性过滤器列表。可以通过仅提供属性过滤器列表来提供简写,它将默认为and
作为条件。
attrs
列表中的条目定义为具有key
和value
的数组,如下所示
[ 'name' => 'foo', 'folder/title' => 'bar', ]
或者定义为每个条目都是一个包含属性名和值的数组的数组,如下所示
[ ['name', 'foo'], ['folder/title' => 'bar'], ]
后一种形式允许将属性名作为名称的数组,在这种情况下,它将使用or
条件对所有具有属性名进行过滤。
[ [['folder/title', 'article/title'] => 'bar'], ]
长形式如下
[ [ 'cond' => 'or', 'attrs' => [ 'folder/title' => 'bar', 'article/'title' => 'bar', ], ] ]
属性条目还可以包含数组键call
,这意味着使用回调来获取过滤器结构。回调可以返回正常结构,就像扩展属性过滤器一样,或者返回新的属性过滤器结构。如果没有使用cond
键,它将假定and
条件并将其包装在长形式结构中。call
的值是PHP支持的任何回调结构。
一个完整的示例
[ ['folder/is_public', true], [ 'cond' => 'or', 'attrs' => [ 'folder/title' => 'bar', 'article/'title' => 'bar', ], ], [ 'call' => ['MyClass', 'makeFilter'], ] ]
数据类型
这些是内容类数据类型的手柄,允许使用动态属性名称。查找内容类属性,并使用第一个支持数据类型的手柄来创建连接和过滤器。
支持以下专用数据类型
- ezobjectrelation
- ezobjectrelationlist
- ezselection
此外,它支持以下扩展的数据类型
- eztags - 对eztags关键字id进行过滤
其他的数据类型将回退到默认处理器,该处理器使用sort_key_string
或sort_key_int
。
使用带命名空间前缀的类名指定数据类型处理器。
修改器
修饰符是简单的回调,可以围绕字段或值包装SQL函数。
修饰符在属性字符串中指定,位于运算符之前或之后。created:date
将created
字段包装在DATE()
SQL调用中,而created:=:date
将包装匹配的值。
修饰符还可以以过滤器array()
的形式指定,作为第四个参数。例如。
['folder/name', '=', 'A', ['pre' => 'first_letter']]
修饰符必须在filter.ini
中定义,并指向类中的一个静态方法,然后该方法将接收一个参数,即字段名称,并且方法必须返回一个字符串,其中包含修改字段的SQL代码。
例如,要获取第一个字母,可以这样做
首先定义过滤器名称,并将类的完整命名空间+::
和方法名称放置在其中。
#filter.ini [Handlers] Modifiers[first_letter]=MyClass::firstLetter
然后定义代码
<?php class MyClass { public static firstLetter($field) { return "SUBSTRING($field, 1, 1)"; } }
属性
可以通过定义属性名称和使用作为处理器的类来添加自定义属性。在调用属性处理器之前,将解析修饰符和运算符。
许可证
此库是开源软件,根据MIT许可证授权。