来自 Codeigniter 和 Expression Engine 的新手,我不知道如何在 exp:channel:entries 标签上执行复杂的过滤器。
我对此过滤器感兴趣
status
start_on
stop_before
你如何为这样的复杂条件实现过滤器?
(status=X|Y|Z AND start_on=A AND stop_before=B) OR (status=X AND start_on=C AND stop_before=D)
这甚至可能吗?
来自 Codeigniter 和 Expression Engine 的新手,我不知道如何在 exp:channel:entries 标签上执行复杂的过滤器。
我对此过滤器感兴趣
status
start_on
stop_before
你如何为这样的复杂条件实现过滤器?
(status=X|Y|Z AND start_on=A AND stop_before=B) OR (status=X AND start_on=C AND stop_before=D)
这甚至可能吗?
遗憾的是,您只能使用该search=
参数搜索“文本输入”、“文本区域”和“下拉列表”字段。因此,您需要为此使用查询模块。
如果您只是查询这些参数,您应该能够从exp_channel_titles
表中获取您需要的条目 id,然后使用类似Stash插件的东西entry_id
将结果的 's 馈送到常规频道条目标签中。是的,这种方式名义上是另外一个查询,但是由于 EE 相当大量地抽象了 db 模式,因此另一种选择是迷失在一堆JOIN
s 中。
所以像(伪代码,不会按原样工作):
获取条目,状态只是 exp_channel_titles 中的一个字符串,entry_date
是您想要的日期列 - 它存储为 unix 时间戳,因此您需要DATE( FROM_UNIXTIME(entry_date))
根据过滤数据的格式选择它。
{exp:stash:set name="filtered_ids"}{exp:query sql="SELECT entry_id
FROM exp_channel_titles
WHERE status LIKE ...<your filter here>"
backspace="1"
}{entry_id}|{/exp:query}{/exp:stash:set}
稍后在模板中:
{exp:channel:entries
entry_id="{exp:stash:get name="filtered_ids"}"
}
{!--loop --}
{/exp:channel:entries}
是的,与您在纯 CI 中可能习惯的相比,这是一团糟,但权衡的是您从 EE 中免费获得的所有东西(CP、模板、成员管理等)。
顺便说一句,Stash 很棒 - 可用于大量缓解大多数 EE 性能问题/解决解析顺序问题
如果您使用日期,您可能会发现DT 插件很有用。
您可以使用循环中的search=
参数获得很多此功能。{exp:channel:entries...}
我不清楚你将如何获得你所寻求的复杂性,所以你最终可能会诉诸于此query module
。