0

来自 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)

这甚至可能吗?

4

3 回答 3

1

遗憾的是,您只能使用该search=参数搜索“文本输入”、“文本区域”和“下拉列表”字段。因此,您需要为此使用查询模块。

如果您只是查询这些参数,您应该能够从exp_channel_titles表中获取您需要的条目 id,然后使用类似Stash插件的东西entry_id将结果的 's 馈送到常规频道条目标签中。是的,这种方式名义上是另外一个查询,但是由于 EE 相当大量地抽象了 db 模式,因此另一种选择是迷失在一堆JOINs 中。

所以像(伪代码,不会按原样工作):

获取条目,状态只是 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 性能问题/解决解析顺序问题

于 2012-10-05T09:59:49.983 回答
0

如果您使用日期,您可能会发现DT 插件很有用。

于 2012-10-23T23:33:42.280 回答
0

您可以使用循环中的search=参数获得很多此功能。{exp:channel:entries...}

我不清楚你将如何获得你所寻求的复杂性,所以你最终可能会诉诸于此query module

于 2012-10-04T11:22:12.507 回答