From 292a0ff0647ced938bae5d7a524a49a23d7462ea Mon Sep 17 00:00:00 2001 From: prookie Date: Thu, 1 Oct 2020 00:03:11 +0200 Subject: [PATCH 1/2] fix transfer of value from default language in untranslatable fields Fixes https://github.com/TimOetting/kirby-builder/issues/152 Solution is not the prettiest, but seems to work (at least for my use case). Probably does not work in nested builders. --- index.php | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 74 insertions(+), 5 deletions(-) diff --git a/index.php b/index.php index 7f5b984..b318ba5 100755 --- a/index.php +++ b/index.php @@ -66,9 +66,10 @@ function fieldFromPath($fieldPath, $page, $fields) { * @param array $values * @param array $fieldsets * @param \Kirby\Api\Model|null $model + * @param string|null $builderKey * @return array */ -function getPanelReadyValues ($values, $fieldsets, $model = null) { +function getPanelReadyValues ($values, $fieldsets, $model = null, $builderKey = null) { $vals = []; if ($values == null) { return $vals; @@ -81,7 +82,18 @@ function getPanelReadyValues ($values, $fieldsets, $model = null) { } $vals[] = $form->values(); } - return $vals; + + $defaultLanguage = kirby()->languages()->default(); + + if( kirby()->language()->code() === $defaultLanguage->code() ) { + // if default language, just keep default logic from plugin + return $vals; + } + + $defaultTranslation = $model->translation($defaultLanguage->code()); // @TODO: actually not sure if $model really is always a Page object! + $defaultData = Kirby\Data\Data::decode($defaultTranslation->content()[$builderKey], 'yaml'); + + return fixUntranslatableValueInheritance($vals, $defaultData, $fieldsets); } /** @@ -166,7 +178,7 @@ function getEnhancedBlockConfig($properties, $model) { return $this->value; } else { $values = $this->value != null ? Yaml::decode($this->value) : Yaml::decode($this->default); - return getPanelReadyValues($values, $this->fieldsets, $this->model()); + return getPanelReadyValues($values, $this->fieldsets, $this->model(), $this->name); } }, 'cssUrls' => function() { @@ -377,7 +389,36 @@ function getEnhancedBlockConfig($properties, $model) { ], 'fieldMethods' => [ 'toBuilderBlocks' => function ($field) { - return $field->toStructure(); + /** @var \Kirby\Cms\Field $field */ + + $defaultLanguage = kirby()->languages()->default(); + + if( kirby()->language()->code() === $defaultLanguage->code() ) { + // if default language, just keep default logic from plugin + return $field->toStructure(); + } + + if( is_array($field->value()) ) { + // this is a nested builder, which will already be transformed at this point + return $field->toStructure(); + } + + /** @var \Kirby\Cms\Page $parentPage */ + $parentPage = $field->parent(); // @TODO: actually not sure if this really is always a Page object! + + $translatedData = Kirby\Data\Data::decode($field->value, 'yaml'); + + $defaultTranslation = $parentPage->translation($defaultLanguage->code()); + $defaultData = Kirby\Data\Data::decode($defaultTranslation->content()[$field->key()], 'yaml'); + + $blueprint = $parentPage->blueprint(); + $fieldDefinition = $blueprint->field($field->key()); + + $fieldsets = extendRecursively($fieldDefinition['fieldsets'], $parentPage); + $fieldsets = getEnhancedBlockConfig($fieldsets, $parentPage); + + $translatedData = fixUntranslatableValueInheritance($translatedData, $defaultData, $fieldsets); + return new \Kirby\Cms\Structure($translatedData, $field->parent()); } ] ]); @@ -403,4 +444,32 @@ function extendRecursively($properties, $page, $currentPropertiesName = null, &$ } } return $properties; -} \ No newline at end of file +} + +function fixUntranslatableValueInheritance(array $translatedData, array $defaultData, array $fieldsets) { + $defaultDataMapped = []; + foreach( $defaultData as $index => $data ) { + // map page builder elements for easier lookup later + $defaultDataMapped[$data['_uid']] = $data; + } + + foreach( $translatedData as $index => &$data ) { + $blockKey = $data['_key']; + + if( !($fieldset = $fieldsets[$blockKey]) ) { + continue; + } + + $blockUid = $data['_uid']; + + foreach( $fieldset['fields'] as $fieldName => $fieldConfig ) { + if( isset($fieldConfig['translate']) && !$fieldConfig['translate'] ) { + // "do not translate" is set, so replace translated value with default value + // use matching page builder in default language element via uid and $defaultDataMapped + $translatedData[$index][$fieldName] = $defaultDataMapped[$blockUid][$fieldName]; + } + } + } + + return $translatedData; +} From 2e2f01e97992dccbcdf4a8e5d3a8b6b9ab5c3052 Mon Sep 17 00:00:00 2001 From: prookie Date: Fri, 2 Oct 2020 18:57:59 +0200 Subject: [PATCH 2/2] fix code in cases elements do not have a base language entry --- index.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/index.php b/index.php index b318ba5..35263ef 100755 --- a/index.php +++ b/index.php @@ -466,7 +466,9 @@ function fixUntranslatableValueInheritance(array $translatedData, array $default if( isset($fieldConfig['translate']) && !$fieldConfig['translate'] ) { // "do not translate" is set, so replace translated value with default value // use matching page builder in default language element via uid and $defaultDataMapped - $translatedData[$index][$fieldName] = $defaultDataMapped[$blockUid][$fieldName]; + if( isset($defaultDataMapped[$blockUid]) ) { + $translatedData[$index][$fieldName] = $defaultDataMapped[$blockUid][$fieldName]; + } } } }