2017-02-24 5 views
2

DataObject에 date 속성이 있습니다.실버 스트라이프. ModelAdmin의 날짜 범위로 검색

ModelAdmin에서 날짜 범위별로 검색하려면 어떻게해야합니까?

예 : "날짜가 2007-13-01 년 이상이고 2007-17-01 년 미만인 모든 항목 검색"
"또는"날짜가 2007-13-01과 2007-17 사이 인 모든 항목 검색 -01 "

현재로서는 GreaterTranFilter 또는 LessThanFilter 만 검색 할 수 있지만 둘 다 검색 할 수는 없습니다.

class MyObject extends DataObject { 
    private static $db = [ 
     "Date" => "Date", 
    ]; 
    private static $summary_fields = [ 
     "Date" => "Date", 
    ]; 

    private static $searchable_fields = [ 
     "Date" => [ 
      "field" => "DateField", 
      "filter" => "GreaterThanFilter", 
      "title" => 'Date from ...' 
     ], 
    ]; 
} 

또한 필드가

DateField: 
    default_config: 
    showcalendar: true 

어떻게 날짜 범위로 검색하는 예를 줄 수있는 달력 (날짜 선택기)를 사용해야합니다 검색?

+0

신속한 Google 검색을 통해 https://gist.github.com/dljoseph/de44dce46b2194661381이 도움이 될 것입니다. – wmk

답변

4

WithinRangeFilter이 있지만 설정을 사용하는 경우 매우 멀리 떨어져 있습니다. 이는 절차 적으로 구현해야 할 필요가있는 사항입니다.

getSearchContext()을 오버로드하여 범위 필터를 추가 한 다음 getList()을 오버로드하고 날짜 범위에 대한 q 요청 매개 변수를 확인하여 목록에 적용하십시오.

public function getSearchContext() 
{ 
    $context = parent::getSearchContext(); 
    $context->getFields()->push(DateField::create('q[Start]','Start')); 
    $context->getFields()->push(DateField::create('q[End]','End')); 

    return $context; 
} 

public function getList() 
{ 
    $list = parent::getList(); 
    $params = $this->getRequest()->requestVar('q'); 

    $filters = []; 
    if(isset($q['Start'])) { 
     $filters['Date:LessThanOrEqual'] = $q['Start']; 
    } 
    if(isset($q['End'])) { 
     $filters['Date:GreaterThanOrEqual'] = $q['End']; 
    } 

    return $list->filter($filters); 
}