2017-02-24 14 views
2

私は自分のDataObjectにdateプロパティを持っています。SilverStripe。 ModelAdminの日付範囲で検索

ModelAdminで日付範囲で検索するにはどうすればよいですか?
または「日付が2007-13-01と2007から17までの間にあるすべての項目を検索「日付がより2007-13-01と2007-17-01未満であるすべての項目を検索」:例えば

-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); 
}