From 0791b387b81aa4a3e6a931fe10d60d0d7a795d80 Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Tue, 11 Apr 2017 18:06:23 +1200 Subject: [PATCH] API Update serialisation of JSON tree data Update TreeDropdownField schema --- src/Forms/TreeDropdownField.php | 58 +++++++++++++++---- src/ORM/Hierarchy/MarkedSet.php | 21 +++++-- .../Forms/Includes/TreeDropdownField_HTML.ss | 2 +- 3 files changed, 64 insertions(+), 17 deletions(-) diff --git a/src/Forms/TreeDropdownField.php b/src/Forms/TreeDropdownField.php index 0eaa8077b..c71929c48 100644 --- a/src/Forms/TreeDropdownField.php +++ b/src/Forms/TreeDropdownField.php @@ -55,6 +55,10 @@ use InvalidArgumentException; */ class TreeDropdownField extends FormField { + protected $schemaDataType = self::SCHEMA_DATA_TYPE_SINGLESELECT; + + protected $schemaComponent = 'TreeDropdownField'; + private static $url_handlers = array( '$Action!/$ID' => '$Action' ); @@ -317,20 +321,13 @@ class TreeDropdownField extends FormField */ public function Field($properties = array()) { - $item = DataObject::singleton($this->sourceObject); - $emptyTitle = _t( - 'DropdownField.CHOOSE_MODEL', - '(Choose {name})', - ['name' => $item->i18n_singular_name()] - ); - $record = $this->Value() ? $this->objectForKey($this->Value()) : null; if ($record instanceof ViewableData) { $title = $record->obj($this->labelField)->forTemplate(); } elseif ($record) { $title = Convert::raw2xml($record->{$this->labelField}); } else { - $title = $emptyTitle; + $title = $this->getEmptyTitle(); } // TODO Implement for TreeMultiSelectField @@ -343,7 +340,7 @@ class TreeDropdownField extends FormField $properties, array( 'Title' => $title, - 'EmptyTitle' => $emptyTitle, + 'EmptyTitle' => $this->getEmptyTitle(), 'Metadata' => ($metadata) ? Convert::raw2json($metadata) : null, ) ); @@ -430,7 +427,8 @@ class TreeDropdownField extends FormField return [ 'name' => $this->getName(), 'id' => $child->obj($this->keyField), - 'title' => $child->obj($this->labelField), + 'title' => $child->getTitle(), + 'treetitle' => $child->obj($this->labelField), 'disabled' => $this->nodeIsDisabled($child), 'isSubTree' => $isSubTree ]; @@ -627,4 +625,44 @@ class TreeDropdownField extends FormField $copy->setSourceObject($this->sourceObject); return $copy; } + + public function getSchemaStateDefaults() + { + // Check label for field + $record = $this->Value() ? $this->objectForKey($this->Value()) : null; + $selectedlabel = null; + + $data = parent::getSchemaStateDefaults(); + $data['data']['emptyTitle'] = $this->getEmptyTitle(); + if ($record) { + $data['data']['valueObject'] = [ + 'id' => $record->getField($this->keyField), + 'title' => $record->getTitle(), + 'treetitle' => $record->obj($this->labelField)->getSchemaValue(), + ]; + } + + return $data; + } + + public function getSchemaDataDefaults() + { + $data = parent::getSchemaDataDefaults(); + $data['data']['urlTree'] = $this->Link('tree'); + return $data; + } + + /** + * @return string + */ + protected function getEmptyTitle() + { + $item = DataObject::singleton($this->sourceObject); + $emptyTitle = _t( + 'DropdownField.CHOOSE_MODEL', + '(Choose {name})', + ['name' => $item->i18n_singular_name()] + ); + return $emptyTitle; + } } diff --git a/src/ORM/Hierarchy/MarkedSet.php b/src/ORM/Hierarchy/MarkedSet.php index 198df1e54..141e0eca6 100644 --- a/src/ORM/Hierarchy/MarkedSet.php +++ b/src/ORM/Hierarchy/MarkedSet.php @@ -361,17 +361,26 @@ class MarkedSet $output = $data; // Serialise node - $output['node'] = $serialiseEval($data['node']); + $serialised = $serialiseEval($data['node']); // Force serialisation of DBField instances - if (is_array($output['node'])) { - foreach ($output['node'] as $key => $value) { + if (is_array($serialised)) { + foreach ($serialised as $key => $value) { if ($value instanceof DBField) { - $output['node'][$key] = $value->getSchemaValue(); + $serialised[$key] = $value->getSchemaValue(); } } - } elseif ($output['node'] instanceof DBField) { - $output['node'] = $output['node']->getSchemaValue(); + + // Merge with top level array + unset($output['node']); + $output = array_merge($output, $serialised); + } else { + if ($serialised instanceof DBField) { + $serialised = $serialised->getSchemaValue(); + } + + // Replace node with serialised value + $output['node'] = $serialised; } // Replace children with serialised elements diff --git a/templates/SilverStripe/Forms/Includes/TreeDropdownField_HTML.ss b/templates/SilverStripe/Forms/Includes/TreeDropdownField_HTML.ss index c802b3061..4e73265f7 100644 --- a/templates/SilverStripe/Forms/Includes/TreeDropdownField_HTML.ss +++ b/templates/SilverStripe/Forms/Includes/TreeDropdownField_HTML.ss @@ -13,7 +13,7 @@
  • - {$title} + {$treetitle} $SubTree
  • <% end_loop %>