<?php class HasOneComplexTableField extends ComplexTableField { public $joinField; protected $addTitle; protected $htmlListEndName = 'CheckedList'; // If you change the value, do not forget to change it also in the JS file protected $htmlListField = 'selected'; // If you change the value, do not forget to change it also in the JS file protected $template = 'RelationComplexTableField'; protected $itemClass = 'HasOneComplexTableField_Item'; function __construct( $controller, $name, $sourceClass, $fieldList, $detailFormFields = null, $sourceFilter = "", $sourceSort = "", $sourceJoin = "") { parent::__construct( $controller, $name, $sourceClass, $fieldList, $detailFormFields, $sourceFilter, $sourceSort, $sourceJoin ); $this->Markable = true; $this->joinField = $this->getParentIdName( $this->controller->ClassName, $this->sourceClass ); } function getQuery( $limitClause = null ) { if( $this->customQuery ) { $query = $this->customQuery; $query->select[] = "{$this->sourceClass}.ID AS ID"; $query->select[] = "{$this->sourceClass}.ClassName AS ClassName"; $query->select[] = "{$this->sourceClass}.ClassName AS RecordClassName"; } else { $query = singleton( $this->sourceClass )->extendedSQL( $this->sourceFilter, $this->sourceSort, $limitClause, $this->sourceJoin ); // Add more selected fields if they are from joined table. $SNG = singleton( $this->sourceClass ); foreach( $this->FieldList() as $k => $title ) { if( ! $SNG->hasField( $k ) && ! $SNG->hasMethod( 'get' . $k ) ) $query->select[] = $k; } } return clone $query; } function sourceItems() { if($this->sourceItems) return $this->sourceItems; $limitClause = ''; if( isset( $_REQUEST[ 'ctf' ][ $this->Name() ][ 'start' ] ) && is_numeric( $_REQUEST[ 'ctf' ][ $this->Name() ][ 'start' ] ) ) $limitClause = $_REQUEST[ 'ctf' ][ $this->Name() ][ 'start' ] . ", $this->pageSize"; else $limitClause = "0, $this->pageSize"; $dataQuery = $this->getQuery( $limitClause ); $records = $dataQuery->execute(); $items = new DataObjectSet(); foreach( $records as $record ) { if( ! get_class( $record ) ) $record = new DataObject( $record ); $items->push( $record ); } $dataQuery = $this->getQuery(); $records = $dataQuery->execute(); $unpagedItems = new DataObjectSet(); foreach( $records as $record ) { if( ! get_class( $record ) ) $record = new DataObject( $record ); $unpagedItems->push( $record ); } $this->unpagedSourceItems = $unpagedItems; $this->totalCount = ( $this->unpagedSourceItems ) ? $this->unpagedSourceItems->TotalItems() : null; return $items; } function getControllerJoinID() { return $this->controller->{$this->joinField}; } function saveInto( DataObject $record ) { $fieldName = $this->name; $fieldNameID = $fieldName . 'ID'; if( $val = $this->value[ $this->htmlListField ] ) $record->$fieldNameID = $val; else $record->$fieldNameID = 0; $record->write(); } function setAddTitle( $addTitle ) { if( is_string( $addTitle ) ) $this->addTitle = $addTitle; } function Title() { return $this->addTitle ? $this->addTitle : parent::Title(); } function ExtraData() { $val = $this->getControllerJoinID() ? $this->getControllerJoinID() : ''; $inputId = $this->id() . '_' . $this->htmlListEndName; return <<<HTML <input id="$inputId" name="{$this->name}[{$this->htmlListField}]" type="hidden" value="$val"/> HTML; } } class HasOneComplexTableField_Item extends ComplexTableField_Item { function MarkingCheckbox() { $name = $this->parent->Name() . '[]'; $joinVal = $this->parent->getControllerJoinID(); $childID = $this->item->ID; if( $this->parent->IsReadOnly || ! $this->Can( 'edit' ) ) return "<input class=\"radio\" type=\"radio\" name=\"$name\" value=\"{$this->item->ID}\" disabled=\"disabled\"/>"; else if( $joinVal == $childID ) return "<input class=\"radio\" type=\"radio\" name=\"$name\" value=\"{$this->item->ID}\" checked=\"checked\"/>"; else return "<input class=\"radio\" type=\"radio\" name=\"$name\" value=\"{$this->item->ID}\"/>"; } } ?>