Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

Data Model Questions

Generate array for GroupedDropdownField


Reply

2 Posts   1536 Views

Avatar
JackAttack

16 December 2009 at 7:14am (Last edited: 16 December 2009 5:02pm), Community Member, 12 Posts

Hi,

Hoping someone can help me... I need to generate an array of arrays in order to populate a GroupedDropdownField on a form.

I have an TrekPage class that lets users add multiple TrekDates via a DataObjectManager, each with a StartDate and EndDate field. I'd love to be able to write a function that iterates through the available TrekPages and creates an array for each consisting of dates, each of which is the result of a function that determines the range of the TrekDate's StartDate & EndDate (like this http://silverstripe.org/template-questions/show/267739#post267739).

i know i can use things like $this->toArray(); (http://doc.silverstripe.org/doku.php?id=dataobjectset) but haven't had much luck so far. And sorry if the above isn't explained very clearly, I'm new to a lot of this..

Thanks,
jack

Avatar
JackAttack

16 December 2009 at 5:01pm (Last edited: 16 December 2009 6:25pm), Community Member, 12 Posts

Ok this is what I'm up to so far

1. creates a form with new GroupedDropdownField
2. function makes an array of arrays for each TrekPage (event page) consisting dates returned by the DateRange function. This array is inserted into the third parameter of the GroupedDropdownField.
3. on BookingPage.ss I have $BookingForm which should display a <select> drop-down with dates organised into <optgroups> for each TrekPage.

BookingPage.php
...

function BookingForm() {
      return new Form($this, 'BookingForm', new FieldSet(
         new GroupedDropdownField(
             'trek',
            'Trek/Date',             
             $treksArray
         ),

...

}

function getTreksArray() {
         $trekPage = DataObject::get('TrekPage');
         $treksArray = array();
         foreach($trekPage as $trek) {
            $trekData = array();
            foreach($trek->TrekDate as $trekDate) {
               $dateRange = DateRange($trekDate);
               $trekData->push($dateRange);
            }
            return $trekData;
         }
         return $treksArray;
      }
   
   function DateRange($date) {
      $start = new Date();
      $start->setValue($date->StartDate);
   
      if (!is_null($this->EndDate)) { // Check if there is an end date
       $end = new Date();
       $end->setValue($date->EndDate);
       return $start->RangeString($end);
      } else {
       return $start->Long();
      }
   }