代码之家  ›  专栏  ›  技术社区  ›  hvelarde

如何使用Plone上的日期范围搜索内容

  •  0
  • hvelarde  · 技术社区  · 11 年前

    Plone为您提供了 filtering search results using a date range 。正常日期范围是通过仅使用最小日期来设置的,因此范围介于今天和过去的某个日期之间。

    我需要添加设置开始日期和结束日期的日期范围的选项。

    我正在考虑添加一个额外的选项,当选择该选项时,将显示两个日期选择器,但我不知道如何设置 created.query:record:list:date 变量使用这两个值。

    我试过在 query 变量,然后我得到:

    Error Value: Invalid DateTime "[DateTime('2000/07/14 00:00:00 GMT-3'), DateTime('2014/07/14 00:00:00 GMT-3')]"
    

    以前有没有其他人发现过这样的要求?你是怎么解决的?是否应将其移植到核心?

    2 回复  |  直到 11 年前
        1
  •  2
  •   sdupton    11 年前

    您可能希望为索引名称传递一个查询dict——带有一个范围参数。假设您的索引被“修改”,并且您需要一个最小值和最大值的范围,例如:

    >>> from DateTime import DateTime
    >>> from Products.CMFCore.utils import getToolByName
    >>> catalog = getToolByName(site)
    >>> startDT = DateTime(2010,12,1)
    >>> endDT = DateTime(2013,12,1)
    >>> query = {
    ...     'modified': {
    ...         query: (startDT, endDT),
    ...         range: 'min:max',
    ...         }
    ...     }
    ... 
    >>> result = catalog.unrestrictedSearchResults(query)  # or .search()
    

    此处记录了类似的内容: http://docs.plone.org/develop/plone/searching_and_indexing/query.html#querying-by-date

        2
  •  1
  •   hvelarde    11 年前

    我花了一些时间调查这个问题,我有一个可行的解决方案。

    首先我们需要了解Zope和 ZPT 工作当您使用类似于 created.query:record:list:date 您告诉Zope进行一些参数转换:

    • 记录 ,将变量转换为记录属性
    • 列表 ,将变量转换为Python列表
    • 日期 ,将字符串转换为DateTime对象

    有关详细信息,请查看 Advanced Zope Scripting .

    因此,参数会自动转换为Python中的字典记录,如下所示:

    'created': {'query': [DateTime('2014/07/09 00:00:00 GMT-3')], 'range': 'min'}
    

    我的错误是假设我必须在一个请求变量上传递所有列表元素。

    我在表单末尾添加的代码如下所示:

    <input type="radio"
           id="query-date-range"
           name="created.query:record:list:date:ignore_empty"
           tal:attributes="value python:'';
                           checked python:checked=='' and 'checked' or '';"
           />
    <label for="query-date-range" i18n:translate="time_range">Time range</label>
    <input type="text"
           id="range-start"
           name="created.query:record:list:date:ignore_empty">
    <input type="text"
           id="range-end"
           name="created.query:record:list:date:ignore_empty">
    <script>
    var today = new Date();
    var yesterday = new Date();
    yesterday.setDate(yesterday.getDate() - 1);
    var start = yesterday.toLocaleDateString().slice(0, 10);
    var end = today.toLocaleDateString().slice(0, 10);
    $(document).ready(function() {
        $("#range-start").datepicker();
        $("#range-end").datepicker();
        $('#range-start').hide();
        $('#range-end').hide();
    });
    
    $('input:radio').change(function() {
        var option = $('input:radio:checked', '#searchform').val();
        if (option === '') {
            $('#range-start').val(start);
            $('#range-start').show();
            $('#range-end').val(end);
            $('#range-end').show();
            $('#range').val('min:max');
        }
        else {
            $('#range-start').val('');
            $('#range-start').hide();
            $('#range-end').val('');
            $('#range-end').hide();
            $('#range').val('min');
        };
    });
    </script>
    

    特别注意以下事项:

    • 开始和结束日期是与jQueryUI日期选择器小部件相关联的输入元素。

    • 两个输入元素共享相同的名称( created.query:record:list:date:ignore_empty )另一个是Zope魔术发生的地方:具有相同名称的所有输入元素的值都转换为一个唯一的列表记录,如下所示:

    'created': {'query': [DateTime('2014/07/15 00:00:00 GMT-3'), DateTime('2014/07/16 00:00:00 GMT-3')], 'range': 'min:max'}
    
    • 我们设置了一个额外的参数转换器( ignore_empty ),这只是避免了将没有值集的元素添加到列表中(我也将此转换器添加到其他输入元素中)。

    • 当我们点击 query-date-range 元素,我们必须初始化日期选择器;当我们单击任何其他元素时,我们需要清除这些值,以避免将它们添加到列表中。

    • 我们还更改 range 元素。

    代码的JavaScript部分肯定会得到增强;我的技能真的很有限。

    推荐文章