aplia/query

在 eZ publish 旧版中执行内容查询的简化 API

v1.7.1 2020-01-06 09:37 UTC

This package is auto-updated.

Last update: 2024-09-06 21:05:23 UTC


README

在 eZ publish 旧版中执行内容查询的简化 API。

Latest Stable Version Minimum PHP Version

安装

使用 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许可。