【发布时间】: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