From 74378fe74d0ede1652189a1f932b678107b4e317 Mon Sep 17 00:00:00 2001 From: Chauncey McAskill Date: Fri, 15 Dec 2017 10:41:52 -0500 Subject: [PATCH] Fix TemplateableTrait, Part 2 Removed structure values processing in `saveTemplateOptions()`; processing already handled in `ModelStructureProperty::save()`. Changes: - Added `translateTemplateOptionsModel()` for recurisvely translating generic models - Changed `saveTemplateOptions()` to prepare structure only once - Moved translating of property values on generic models from `saveTemplateOptions()` to `templateOptionsStructure()` --- src/Charcoal/Cms/TemplateableTrait.php | 54 +++++++++++++++++++------- 1 file changed, 40 insertions(+), 14 deletions(-) diff --git a/src/Charcoal/Cms/TemplateableTrait.php b/src/Charcoal/Cms/TemplateableTrait.php index 12e29636..3b378065 100644 --- a/src/Charcoal/Cms/TemplateableTrait.php +++ b/src/Charcoal/Cms/TemplateableTrait.php @@ -13,6 +13,7 @@ use Charcoal\Property\PropertyInterface; use Charcoal\Property\SelectablePropertyInterface; use Charcoal\Property\Structure\StructureMetadata; +use Charcoal\Property\ModelStructureProperty; use Charcoal\Property\TemplateOptionsProperty; use Charcoal\Property\TemplateProperty; @@ -182,6 +183,34 @@ final protected function assertValidTemplateStructureDependencies() } } + /** + * Convert the given model's multilingual property values into {@see \Charcoal\Translator\Translation} objects. + * + * @param ModelInterface $obj The object to parse. + * @param boolean $recursive Whether we should traverse structure properties. + * @return ModelInterface The localized object. + */ + protected function translateTemplateOptionsModel(ModelInterface $obj, $recursive = false) + { + foreach ($obj->properties() as $propertyIdent => $property) { + $val = $obj[$propertyIdent]; + if ($property->l10n()) { + $val = $this->translator()->translation($obj[$propertyIdent]); + $obj[$propertyIdent] = $val; + } elseif ($property instanceof ModelStructureProperty) { + $o = $prop->structureVal($obj[$propertyIdent]); + + if ($o instanceof Model) { + $o = $this->translateTemplateOptionsModel($o); + } + + $obj[$propertyIdent] = $o; + } + } + + return $obj; + } + /** * Retrieve the default template propert(y|ies). * @@ -277,22 +306,14 @@ protected function saveTemplateOptions(array $properties = null) $properties = $this->defaultTemplateProperties(); } - $this->prepareTemplateOptions($properties); + if ($this->areTemplateOptionsFinalized === false) { + $this->areTemplateOptionsFinalized = true; + $this->prepareTemplateOptions(); + } $key = 'template_options'; $prop = $this->property($key); - if ($prop->structureModelClass() === Model::class) { - $struct = $this->propertyValue($key); - $struct = $prop->structureVal($struct, $this->templateOptionsMetadata()); - foreach ($struct->properties() as $propertyIdent => $property) { - $val = $struct[$propertyIdent]; - if ($property->l10n()) { - $val = $this->translator()->translation($struct[$propertyIdent]); - } - - $struct[$propertyIdent] = $property->save($val); - } - } + $prop->setStructureMetadata($this->templateOptionsMetadata()); } /** @@ -325,7 +346,12 @@ public function templateOptionsStructure() $key = 'template_options'; $prop = $this->property($key); $val = $this->propertyValue($key); + $obj = $prop->structureVal($val, $this->templateOptionsMetadata()); + + if ($obj instanceof Model) { + $obj = $this->translateTemplateOptionsModel($obj); + } - return $prop->structureVal($val, $this->templateOptionsMetadata()); + return $obj; } }