IF you pass your source as an array, you pass values as an array too. * Likewise objects are handled the same. */ class CheckboxSetField extends OptionsetField { protected $disabled = false; /** * Object handles arrays and dosets being passed by reference */ function Field() { $values = $this->value; // Get values from the join, if available if(is_object($this->form)) { $record = $this->form->getRecord(); if(!$values && $record->hasMethod($this->name)) { $funcName = $this->name; $join = $record->$funcName(); foreach($join as $joinItem) $values[] = $joinItem->ID; } } $source = $this->source; if(!is_array($source) && !is_a($source, 'SQLMap')){ // Source and values are DataObject sets. if(is_array($values)) { $items = $values; } else { if($values&&is_a($values, "DataObjectSet")){ foreach($values as $object){ if( is_a( $object, 'DataObject' ) ) $items[] = $object->ID; } }elseif($values&&is_string($values)){ $items = explode(',', $values); $items = str_replace('{comma}', ',', $items); } } } else { // Sometimes we pass a singluar default value // thats ! an array && !DataObjectSet if(is_a($values,'DataObjectSet') || is_array($values)) $items = $values; else{ $items = explode(',',$values); $items = str_replace('{comma}', ',', $items); } } if(is_array($source)){ // Commented out to fix "'Specific newsletters' option in 'newsletter subscription form' page type does not work" bug // See: http://www.silverstripe.com/bugs/flat/1675 // unset($source[0]); unset($source['']); } $odd = 0; $options = ''; foreach($source as $index => $item) { if(is_a($item,'DataObject')) { $key = $item->ID; $value = $item->Title; } else { $key = $index; $value = $item; } $odd = ($odd + 1) % 2; $extraClass = $odd ? "odd" : "even"; $extraClass .= " val" . str_replace(' ','',$key); $itemID = $this->id() . "_" . ereg_replace('[^a-zA-Z0-9]+','',$key); if($items){ in_array($key,$items) ? $checked = " checked=\"checked\"" : $checked = ""; } $this->disabled ? $disabled = " disabled=\"disabled\"" : $disabled = ""; $options .= "