aplia / query
在 eZ publish 旧版中执行内容查询的简化 API
Requires
- php: >=5.3
- aplia/support: ^1.0.0
- composer/composer: >=1.0
Replaces
- aplia/contentquery: *
README
在 eZ publish 旧版中执行内容查询的简化 API。
安装
使用 Composer 安装
composer require aplia/query
概述
它分为三个主要区域。
- 分页
- 排序
- 筛选
所有类都支持 eZ 模板属性系统,可以直接传递到模板中。
QuerySet
此类将所有其他系统的功能结合到一个易于使用的接口中。一旦实例化,就可以使用几种方法来筛选集合并返回一个新的 queryset 实例。
迭代器使用
查询集充当迭代器,可以直接传递给 foreach 语句。
<?php $set = new QuerySet(); foreach ($set as $node) { echo $node->attribute('name'), "\n"; }
查询集是懒加载的,只有在需要时才会评估。它还会缓存结果,因此在第二次迭代(不更改任何筛选条件)时不会访问数据库。
链式和克隆
大多数方法在完成后返回查询集实例,以允许链式调用多个方法。
例如
<?php $set = new QuerySet(); $newSet = $set->depth(1)->sortByField('a-z'); // $set and $newSet are the same instance
查询集还可以被指示为对所做的每个更改创建新的克隆,这意味着链式方法将创建新的副本,而原始实例保持不变。
<?php $set = new QuerySet(array('useClone' => true)); $newSet = $set->depth(1)->sortByField('a-z'); // $set and $newSet are different instances
要显式创建一个新克隆,请调用 copy()
<?php $set = new QuerySet(); $newSet = $set->copy()->depth(1)->sortByField('a-z'); // $set and $newSet are different instances
列出所有子节点
例如,列出根节点的所有子节点
<?php $set = new QuerySet(); foreach ($set as $node) { echo $node->attribute('name'), "\n"; }
列出特定内容类
仅列出根节点的文章
<?php $set = new QuerySet(); $set = $set->classes('article'); foreach ($set as $node) { echo $node->attribute('name'), "\n"; } // or $set = new QuerySet(array('classes' => array('article'))); foreach ($set as $node) { echo $node->attribute('name'), "\n"; }
列出树结构
列出给定节点(节点 ID 42)的整个树
<?php $set = new QuerySet(); $set = $set->depth(false)->parentNode(42); foreach ($set as $node) { echo $node->attribute('name'), "\n"; } // or $set = new QuerySet(array('depth' => false, 'parentNodeId' => 42)); foreach ($set as $node) { echo $node->attribute('name'), "\n"; }
列出特定深度
使用运算符列出特定深度
<?php $set = new QuerySet(); $set = $set->depth(2, '>='); foreach ($set as $node) { echo $node->attribute('name'), "\n"; } // or $set = new QuerySet(array('depth' => false, 'depthOperator' => '>=')); foreach ($set as $node) { echo $node->attribute('name'), "\n"; }
更改排序顺序
将排序顺序改为字母顺序
<?php $set = new QuerySet(); $set = $set->sortByField('a-z'); foreach ($set as $node) { echo $node->attribute('name'), "\n"; }
创建新的排序字段并按该字段排序
<?php $set = new QuerySet(); $set = $set->sortChoices(array('age' => 'created'))->sortByField('-age'); foreach ($set as $node) { echo $node->attribute('name'), "\n"; }
使用常规排序数组
<?php $set = new QuerySet(); $set = $set->sortByArray(array( array('published', 1), )); foreach ($set as $node) { echo $node->attribute('name'), "\n"; }
分页结果
使用分页并获取特定页面
<?php $set = new QuerySet(); $set = $set->pageLimit(50)->page(5); foreach ($set as $node) { echo $node->attribute('name'), "\n"; }
按字段筛选
按字段筛选
<?php $set = new QuerySet(); $set = $set ->defineFilter('title', 'string', 'article/title') ->filter('title', 'My title'); foreach ($set as $node) { echo $node->attribute('name'), "\n"; }
筛选器也可以通过使用 NestedFilter 的高级语法定义字段或值上的修饰符。
例如,要使用名为 first_letter
的修饰符,将属性名称更改为包含一个 冒号
,然后是修饰符,最后是另一个 冒号
和运算符。修饰符必须在 filter.ini
中首先定义,并指向一个有效静态方法;有关修饰符的更多信息,请参阅 aplia/query
包。
例如,找到所有以 M
开头的文章
<?php $set = new QuerySet(); $set = $set ->defineFilter('title', 'string', 'article/title:first_letter:=') ->filter('title', 'M'); foreach ($set as $node) { echo $node->attribute('name'), "\n"; }
从数据库定义筛选器
从内容类加载筛选器
<?php $set = new QuerySet(); $set = $set ->classes('article') ->loadFilters() ->filter('article/title', 'My title'); foreach ($set as $node) { echo $node->attribute('name'), "\n"; }
自定义嵌套筛选器
如果默认筛选器系统太有限,则可以使用自定义筛选器。它们是嵌套筛选器,传递给 NestedFilter 系统(aplia/query
包),该系统支持使用筛选器进行任意嵌套的 AND/OR 结构。
在查询集上调用 addFilter
方法并传递您想要的筛选器。多次调用它将筛选器组合在一起。
自定义筛选器可以与普通筛选器一起使用。
<?php $set = new QuerySet(); $set = $set ->classes('article') ->addFilter( array('article/title', 'My title', '=') ) foreach ($set as $node) { echo $node->attribute('name'), "\n"; }
访问结果对象
要显式获取结果对象(例如,用于模板),请使用 result()
。
<?php $set = new QuerySet(); $result = $set->result();
结果对象包含足够的信息用于模板,例如显示总数、使用的筛选器和列出条目。
显式访问条目
查询集充当迭代器,但如果您需要直接获取条目列表,请调用 items()
。
<?php $set = new QuerySet(); foreach ($set->items() as $node) { echo $node->attribute('name'), "\n"; }
控制可见性
关闭默认可见性规则
<?php $set = new QuerySet(); $set = $set ->visibilty(false); foreach ($set as $node) { echo $node->attribute('name'), "\n"; } // or $set = new QuerySet(array('useVisibility' => false)); foreach ($set as $node) { echo $node->attribute('name'), "\n"; }
仅列出隐藏项目(这将关闭默认规则)
<?php $set = new QuerySet(); $set = $set ->filter('visible', false); foreach ($set as $node) { echo $node->attribute('name'), "\n"; }
限制为主节点
将结果限制为主节点
<?php $set = new QuerySet(); $set = $set ->onlyMainNodes(); foreach ($set as $node) { echo $node->attribute('name'), "\n"; } // or $set = new QuerySet(array('mainNodeOnly' => true)); foreach ($set as $node) { echo $node->attribute('name'), "\n"; }
控制角色/策略
关闭所有基于角色的策略
<?php $set = new QuerySet(); $set = $set ->policies(false); foreach ($set as $node) { echo $node->attribute('name'), "\n"; } // or $set = new QuerySet(array('useRoles' => false)); foreach ($set as $node) { echo $node->attribute('name'), "\n"; }
基于自定义策略数组筛选
<?php $policies = array(/*...*/); $set = new QuerySet(); $set = $set ->policies($policies); foreach ($set as $node) { echo $node->attribute('name'), "\n"; } // or $policies = array(/*...*/); $set = new QuerySet(array('policies' => $policies)); foreach ($set as $node) { echo $node->attribute('name'), "\n"; }
分页
BaseNumPagination
定义了所有分页具体类的主体接口。
一个具体实现是 PageNumPagination
,它提供了基于数字页码(1及以上)的分页。
排序
排序由 SortOrder
类处理,它提供了一种定义API可能排序列的方法,以及选择哪个排序列和顺序。
筛选
...
结果
查询运行后,返回一个结果对象,它是 Result
类型,包含查询的所有结果,包括项目、总数、页对象、排序顺序和筛选器。
许可
辅助库是开源软件,采用MIT许可。