2016-03-28 15 views
1

Veri uzmanları için bazı filtreler oluşturmaya çalışıyorum. Kullanıcının etiket listesinden bir veya birden çok filtre seçmesini ve ardından bu filtrelere dayanarak bir nesne listesi çıkarmasını isterim. TümBiçim, bir CheckboxsetField'ın sonuçlarını SilverStripe'de virgülle ayrılmış bir dize olarak nasıl edinebilirim?

public function index(SS_HTTPRequest $request) 
{ 
    // ... 
    if($tagsParam = $request->getVar('tags')) { 
     $articles = new ArrayList(); 
     $tagids = explode(",", $tagsParam); 
     foreach($tagids AS $tagid) { 
      $tag = Category::get()->byID($tagid); 
      $articleitems = $tag->getManyManyComponents('Articles')->sort('Date DESC'); 
      foreach($articleitems AS $articleitem) { 
       $articles->push($articleitem); 
      } 
     } 
    } 
    $data = array (
     'Articles' => $articles 
    ); 
    if($request->isAjax()) { 
     return $this->customise($data)->renderWith('ListItems'); 
    } 
    return $data; 
} 

O kod mysite.com/?tags=1,2,3 gibi bir URL'ye sahip çalışıyor ... gönderiliyor params URL'ye dayalı verileri kapmak için bu kodu kullanarak iyidir

Sorunum, CheckBoxSetField ile oluşturulan filtrelere dayanarak bu URL'yi oluşturmaya çalışmakla birlikte gelir. İşte benim kod bunun için bir ...

public function ArticlesSearchForm() 
{ 
    $tagsmap = $this->getTags()->map('ID', 'Title')->toArray(); 
    $form = Form::create(
     $this, 
     'ArticlesSearchForm', 
     FieldList::create(
      CheckboxSetField::create('tags') 
       ->setSource($tagsmap) 
     ), 
     FieldList::create(
      FormAction::create('doArticlesSearch','Search') 
     ) 
    ); 

    $form->setFormMethod('GET') 
     ->setFormAction($this->Link()) 
     ->disableSecurityToken() 
     ->loadDataFrom($this->request->getVars()); 

    return $form; 
} 

kullanıcı bu form gönderdiğinde, oluşturulan URL = mysite.com?tags%5B1%5D=1 & etiketler% 5b2% 5D çizgisinde bir şeydir 2 & action_doArticlesSearch = Arama Açıkçası, değerleri bir dizi olarak iletiyor. Basit bir virgülle ayrılmış listeyi nasıl geçebilirim?

cevap

2

CheckboxSetField'un dönüşünü değiştirmeye çalışmak yerine, kodunuzu değiştirmenizi öneririz. Verilen Zaten burada bir diziye virgülle ayrılmış listesi listesini dönüştürüyoruz.END_STRONG:

$tagids = explode(",", $tagsParam);

Böyle bir şey, bu adımı atlar:

public function index(SS_HTTPRequest $request) 
{ 
    // ... 
    if($tagsParam = $request->getVar('tags')) { 
     $articles = new ArrayList(); 
     //This has a minor risk of going bad if $tagsParam is neither an 
     //array of a comma-separated list 
     $tagids = is_array($tags) ? $tagsParam : explode(",", $tagsParam); 
+0

Ah, o çalışıyor! Yine de temiz URL'yi tercih ederim, ancak herhangi bir gün çalışmamaya çalışacağım;) Teşekkürler! Bu aşağıya bakmakta olan herkes için, $ tagid değişkenini '$ tagids = is_array ($ tagsParam) olarak güncellemeniz gerekecek mi? $ tagsParam: patlayabilir (",", $ tagsParam); ' – andrewhoule

İlgili konular