【问题标题】:Sulu CMS: how to search/filter for content of a specific type with specific values for specifc attributes?Sulu CMS:如何使用特定属性的特定值搜索/过滤特定类型的内容?
【发布时间】:2017-06-13 12:12:21
【问题描述】:

情况的简短描述:

  • 我们正在运行一个分叉版本的 Sulu 1.5.2、PHP 7.1、Windows 服务器环境、与 PostgreSQL 的数据库连接
  • 我们有一个网站结构/树,我们在顶层有house 模板;每个房子有一个house_rooms和一个house_occupants模板;每个house_rooms 模板有N 个house_rooms_room 模板,每个house_occupants 模板有N 个house_occupants_occupant 模板。这代表一栋有 N 个房间和 N 个居住者的实际房屋。

现在我想知道是否有办法专门获取,例如 all 遵循某种属性模式的house_occupants_occupant 内容(例如:他们的gender具有值“女性”的属性及其date_of_birth 参数>= 1990/01/01),无需加载每个house,然后在子级中找到其house_occupantspage,然后循环遍历该模板的@987654334 @children 并根据他们的性别和出生日期属性过滤由此产生的内容。

我已经发现有一个ContentRepository 类可以::findAll()::findByUuids(),但似乎没有办法过滤特定属性(如模板类型、模板属性... )。所以我采取了一种迂回的方式创建自己的“存储库”,它直接对数据库中的phpcr_nodes 表进行 PDO 查询,专门扫描props 属性以查找某个模板名称的出现:

$this->pdo->query("SELECT identifier, props FROM phpcr_nodes WHERE props LIKE '%>house_occupants_occupant<%'");

我可以看到props包含一个字符串值,该字符串值表示一个 XML 文档,该文档以某种方式转换为具有属性值对的整个模板,但是它在标记级别以及某些属性与某些值的关系方面是模糊的。所以理论上我可以使用特定的 XML 解析器将其转换为人类可读的内容,这样对于我的 house_occupants_occupant 数据,我可以得到如下内容:

// what I would get after putting the props through a certain XML parser:
$xmlHumanReadableData = [
    '<the_uuid_of_occupant_1>' => [
        ...
        'gender' => 'female',
        'date_of_birth' => '1992-05-18T00:00:00.000+00:00',
        ...
    ],
    ... //etcetera etcetera
];

如果需要,我可以过滤可读数据以确定我想要保留哪些内容,将 node-uuid 添加到某个 $theUuids 变量中,然后使用 Sulu 的 ContentRepository::findByUuids($theUuids) 方法检索实际内容。这将“仅”需要 2 个查询和一些 PHP 数组过滤,这比从某个父级开始循环遍历所有子级内容并这样做直到遍历所有父级及其所有子级要好得多。 ..(当然,例如,如果您想搜索所有house 节点,其中至少一个house_occupants_occupant 节点代表不到10 岁的孩子,那么开销当然会增加,因为您需要额外的查询来“设置”最终查询中使用的过滤器数据。但仍然:比循环所有内容要好得多... ;-) )

所以我的问题是双重的:

  • 什么是特定于 Sulu 的 XML 解析器,我可以使用它来将 props 列中的 XML 字符串值转换为人类可读的内容,并具有适当的属性-值对?
  • 并且/或者,希望:有没有一种方法可以避免所有这些废话,而只使用一种不太低级的方法来检索具有 特定值的 特定模板类型 的内容 表示特定属性 ?

【问题讨论】:

    标签: sulu


    【解决方案1】:

    您找到的ContentRepository 已经是我们对页面的一些要求的抽象。您的要求已经非常具体,因此您应该使用 SQL-2 编写自己的查询,query language for PHPCR

    这应该使您能够编写符合您要求的查询。

    【讨论】:

    • 感谢您的回复。一旦我试了一下,我会阅读并回到这篇文章:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 2021-04-17
    • 2021-01-28
    相关资源
    最近更新 更多