Sulu CMS:如何使用特定属性的特定值搜索/过滤特定类型的内容?

时间:2017-06-13 12:12:22

标签: sulu

情况简述:

  • 我们正在运行分叉版本的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居住者的实际房屋。

现在我想知道是否有办法专门获取,例如所有遵循特定属性模式的house_occupants_occupant内容(例如:他们的{ {1}}属性值为'female'且其gender参数为> = 1990/01/01),无需加载每个date_of_birth,然后在其中找到house页面孩子们,然后循环遍历该模板的house_occupants个孩子,并根据他们的性别和出生日期属性过滤出这样的内容。

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

props

我可以看到$this->pdo->query("SELECT identifier, props FROM phpcr_nodes WHERE props LIKE '%>house_occupants_occupant<%'"); 包含表示XML文档的字符串值,该文档以某种方式转换为具有属性 - 值对的整个模板,但是关于标记级别以及某些属性如何与某些值相关,它是模糊的。所以理论上我可以使用特定的XML解析器将其变成人类可读的东西,这样对于我的props数据我可以得到类似的东西:

house_occupants_occupant

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

所以我的问题有点双重:

  • 我可以使用什么特定于Sulu的XML解析器将此house列中的XML字符串值转换为人类可读的,具有适当的属性值对?
  • 和/或希望:有没有办法可以避免所有这些废话,只需使用较低级别的方法检索特定模板类型的内容特定值< / em> for 特定属性

1 个答案:

答案 0 :(得分:0)

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

这使您可以编写符合要求的查询。