2014-07-14 7 views
0

Plone은 filtering search results using a date range의 가능성을 제공합니다. 표준 날짜 범위는 최소 날짜 만 사용하여 설정되므로 오늘 날짜와 과거 날짜 사이의 범위가됩니다.Plone의 날짜 범위를 사용하여 콘텐츠를 검색하는 방법

기간을 시작일과 종료일로 설정하는 옵션을 추가해야합니다.

두 개의 날짜 선택기가 표시되는 추가 옵션을 추가하려고했지만이 두 값을 사용하기 위해 변수 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')]" 

다른 사람들이 이전과 같은 요구 사항을 발견 한 적이 있습니까? 어떻게 그걸 해결 했니? 이것이 코어에 포팅되어야 하는가?

+0

색인 (이름), 색인 유형은 무엇입니까? – sdupton

+0

내가 참조하고있는 색인은'created'입니다. – hvelarde

답변

1

http://docs.plone.org/develop/plone/searching_and_indexing/query.html#querying-by-date 내가이 조사 시간을 보냈을 나는 작업 솔루션을 .

먼저 Zope와 ZPT의 작동 방식을 이해해야합니다. 당신은 몇 가지 매개 변수를 변환 할 조프을 말하고있다 created.query:record:list:date처럼 뭔가 폼 요소의 이름을 때 :

  • 기록을 기록 속성
  • 목록에 변수를 변환, 파이썬에 변수로 변환 목록
  • 날짜은, 자세한 내용은 DateTime 개체

에 문자열로 변환 이에 대한 정보는 Advanced Zope Scripting을 참조하십시오.

그래서, 매개 변수가 자동으로 파이썬이 같은 사전 레코드로 변환됩니다

'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 datepicker 위젯과 연결됩니다.조프 마법이 일어나는 곳

  • 모두 입력 요소

    여기에 다른 같은 이름 (created.query:record:list:date:ignore_empty를) 공유는 다음과 같은 이름을 가진 모든 입력 요소의 값이 같은 고유의 목록 기록에 변환됩니다

  • '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)를 설정 (I이 변환을 추가 다른 입력 요소에도 해당).

  • query-date-range 요소를 클릭하면 날짜 선택기를 초기화해야합니다. 다른 요소 중 하나를 클릭하면 목록에 추가되지 않도록이 값을 지울 필요가 있습니다.

  • @sdupton에 의해 앞서 언급 한 쿼리 유형에 따라 range 요소의 값도 변경합니다.

코드의 JavaScript 부분을 확실히 향상시킬 수 있습니다. 내 기술은 실제로 제한되어 있습니다.

2

범위 매개 변수를 사용하여 색인 이름에 대한 쿼리 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() 

뭔가 :

+0

예,이 작업을 수행 할 수 있습니다. 그러나 알고 싶은 것은 쿼리 변수에 두 매개 변수 (startDT, endDT)를 전달할 방법이 있는지 아니면해야합니까? 나중에 파이썬 코드에서 쿼리를 생성하십시오. – hvelarde

+0

@hvelarde : @@ search? SearchableText = test & created.query : record : list : date = 2012/07/15 & created.query : record : list : date = 2015의 줄에 따라 URL을 작성해야한다고 생각합니다. /07/15 & created.range : record = min : max' (더하기 이스케이프). –

+0

@UlrichSchwarz 내 대답보기 – hvelarde