<?php /** * ComplexTableField with a radio button column, designed to edit a has_one join. * * This [RelationTable](RelationTable) allows you to show a **1-to-1** or **1-to-many** relation with a group of * DataObjects as a (readonly) tabular list (similiar to [ComplexTableField](ComplexTableField)). Its most useful when * you want to manage the relationship itself thanks the **radio buttons** present on each line of the table. * * Moreover, you have the possibility to uncheck a radio button in order to make the relation as null. * * <b>Usage</b> * * <code> * $tablefield = new HasOneComplexTableField( * $this, * 'MyOnlyFruit', * 'Fruit', * array( * 'Name' => 'Name', * 'Color' => 'Color' * ), * 'getCMSFields_forPopup' * ); * </code> * * **Notice** : You still have different ways to customize the popup window as in the parent-class * [ComplexTableField](ComplexTableField). * * This field is made to manage a **has_one** relation. In the SilverStripe relation between DataObjects, you can use * this relation for **1-to-1** and **1-to-many** relations. * By default, a HasOneComplexTableField manages a **1-to-many** relation. If you want to specify that the relation * that you manage is a **1-to-1** relation, add this code : * * <code> * $tablefield->setOneToOne(); * </code> * * @package forms * @subpackage fields-relational */ class HasOneComplexTableField extends HasManyComplexTableField { public $itemClass = 'HasOneComplexTableField_Item'; public $isOneToOne = false; public function getParentIdName($parentClass, $childClass) { return $this->getParentIdNameRelation($parentClass, $childClass, 'has_one'); } public function getControllerJoinID() { return $this->controller->{$this->joinField}; } public function saveInto(DataObjectInterface $record) { $fieldName = $this->name; $fieldNameID = $fieldName . 'ID'; $record->$fieldNameID = 0; if($val = $this->value[ $this->htmlListField ]) { if($val != 'undefined') $record->$fieldNameID = $val; } $record->write(); } public function setOneToOne() { $this->isOneToOne = true; } public function isChildSet($childID) { return DataObject::get($this->controllerClass(), '"' . $this->joinField . "\" = '$childID'"); } public 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; } } /** * Single record of a {@link HasOneComplexTableField} field. * @package forms * @subpackage fields-relational */ class HasOneComplexTableField_Item extends ComplexTableField_Item { public function MarkingCheckbox() { $name = $this->parent->getName() . '[]'; $isOneToOne = $this->parent->isOneToOne; $joinVal = $this->parent->getControllerJoinID(); $childID = $this->item->ID; if($this->parent->IsReadOnly || ($isOneToOne && $joinVal != $childID && $this->parent->isChildSet($childID))) 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}\"/>"; } }