diff --git a/bundle/Resources/config/validation.yml b/bundle/Resources/config/validation.yml index 2f3a3b348..55cec011b 100644 --- a/bundle/Resources/config/validation.yml +++ b/bundle/Resources/config/validation.yml @@ -25,11 +25,11 @@ EzSystems\RepositoryForms\Data\ContentTypeData: choices: [0, 1] names: - Expression: - expression: "value and value[this.mainLanguageCode] matches '/^.{1,255}$/'" + expression: "value and value[this.languageCode] matches '/^.{1,255}$/'" message: "ez.content_type.names" descriptions: - Expression: - expression: "!value or value[this.mainLanguageCode] matches '/^.{0,255}$/'" + expression: "!value or value[this.languageCode] matches '/^.{0,255}$/'" message: "ez.content_type.descriptions" fieldDefinitionsData: - Valid: ~ @@ -50,11 +50,11 @@ EzSystems\RepositoryForms\Data\FieldDefinitionData: message: "ez.content_type.identifier.pattern" names: - Expression: - expression: "value and value[this.contentTypeData.mainLanguageCode] matches '/^.{1,255}$/'" + expression: "value and value[this.contentTypeData.languageCode] matches '/^.{1,255}$/'" message: "ez.field_definition.names" descriptions: - Expression: - expression: "!value or value[this.contentTypeData.mainLanguageCode] matches '/^.{0,255}$/'" + expression: "!value or value[this.contentTypeData.languageCode] matches '/^.{0,255}$/'" message: "ez.field_definition.descriptions" position: - Type: diff --git a/lib/Content/View/Builder/ContentEditViewBuilder.php b/lib/Content/View/Builder/ContentEditViewBuilder.php index 15a20c12c..412a949ae 100644 --- a/lib/Content/View/Builder/ContentEditViewBuilder.php +++ b/lib/Content/View/Builder/ContentEditViewBuilder.php @@ -82,7 +82,7 @@ public function buildView(array $parameters) $location = $this->resolveLocation($parameters); $content = $this->resolveContent($parameters, $location, $language); $contentInfo = $content->contentInfo; - $contentType = $this->loadContentType((int) $contentInfo->contentTypeId); + $contentType = $this->loadContentType((int) $contentInfo->contentTypeId, $language->languageCode); $form = $parameters['form']; $isPublished = null !== $contentInfo->mainLocationId && $contentInfo->published; @@ -178,14 +178,15 @@ private function loadLanguage(string $languageCode): Language * Loads ContentType with id $contentTypeId. * * @param int $contentTypeId + * @param string $languageCode * * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType * * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException */ - private function loadContentType(int $contentTypeId): ContentType + private function loadContentType(int $contentTypeId, string $languageCode): ContentType { - return $this->repository->getContentTypeService()->loadContentType($contentTypeId); + return $this->repository->getContentTypeService()->loadContentType($contentTypeId, [$languageCode]); } /** diff --git a/lib/Data/ContentTypeData.php b/lib/Data/ContentTypeData.php index 830f50ebd..32da6b615 100644 --- a/lib/Data/ContentTypeData.php +++ b/lib/Data/ContentTypeData.php @@ -33,6 +33,13 @@ class ContentTypeData extends ContentTypeUpdateStruct implements NewnessCheckabl */ protected $fieldDefinitionsData = []; + /** + * Language Code of currently edited contentTypeDraft. + * + * @var string|null + */ + public $languageCode = null; + protected function getIdentifierValue() { return $this->contentTypeDraft->identifier; @@ -43,6 +50,18 @@ public function addFieldDefinitionData(FieldDefinitionData $fieldDefinitionData) $this->fieldDefinitionsData[] = $fieldDefinitionData; } + public function replaceFieldDefinitionData(string $fieldDefinitionIdentifier, FieldDefinitionData $fieldDefinitionData) + { + $currentFieldDefinition = array_filter( + $this->fieldDefinitionsData, + function (FieldDefinitionData $fieldDefinitionData) use ($fieldDefinitionIdentifier) { + return $fieldDefinitionIdentifier === $fieldDefinitionData->identifier; + } + ); + + $this->fieldDefinitionsData[key($currentFieldDefinition)] = $fieldDefinitionData; + } + /** * Sort $this->fieldDefinitionsData first by position, then by identifier. */ diff --git a/lib/Data/Mapper/ContentTypeDraftMapper.php b/lib/Data/Mapper/ContentTypeDraftMapper.php index 38321e642..e94e1b6b9 100644 --- a/lib/Data/Mapper/ContentTypeDraftMapper.php +++ b/lib/Data/Mapper/ContentTypeDraftMapper.php @@ -8,9 +8,11 @@ */ namespace EzSystems\RepositoryForms\Data\Mapper; +use eZ\Publish\API\Repository\Values\Content\Language; use eZ\Publish\API\Repository\Values\ValueObject; use EzSystems\RepositoryForms\Data\ContentTypeData; use EzSystems\RepositoryForms\Data\FieldDefinitionData; +use Symfony\Component\OptionsResolver\OptionsResolver; class ContentTypeDraftMapper implements FormDataMapperInterface { @@ -24,6 +26,16 @@ class ContentTypeDraftMapper implements FormDataMapperInterface */ public function mapToFormData(ValueObject $contentTypeDraft, array $params = []) { + $optionsResolver = new OptionsResolver(); + $this->configureOptions($optionsResolver); + $params = $optionsResolver->resolve($params); + + /** @var \eZ\Publish\API\Repository\Values\Content\Language $language */ + $language = $params['language'] ?? null; + + /** @var \eZ\Publish\API\Repository\Values\Content\Language|null $baseLanguage */ + $baseLanguage = $params['baseLanguage'] ?? null; + $contentTypeData = new ContentTypeData(['contentTypeDraft' => $contentTypeDraft]); if (!$contentTypeData->isNew()) { $contentTypeData->identifier = $contentTypeDraft->identifier; @@ -40,13 +52,27 @@ public function mapToFormData(ValueObject $contentTypeDraft, array $params = []) $contentTypeData->names = $contentTypeDraft->getNames(); $contentTypeData->descriptions = $contentTypeDraft->getDescriptions(); + $contentTypeData->languageCode = $language ? $language->languageCode : $contentTypeDraft->mainLanguageCode; + + if ($baseLanguage && $language) { + $contentTypeData->names[$language->languageCode] = $contentTypeDraft->getName($baseLanguage->languageCode); + $contentTypeData->descriptions[$language->languageCode] = $contentTypeDraft->getDescription($baseLanguage->languageCode); + } + foreach ($contentTypeDraft->fieldDefinitions as $fieldDef) { + $names = $fieldDef->getNames(); + $descriptions = $fieldDef->getDescriptions(); + if ($baseLanguage && $language) { + $names[$language->languageCode] = $fieldDef->getName($baseLanguage->languageCode); + $descriptions[$language->languageCode] = $fieldDef->getDescription($baseLanguage->languageCode); + } + $contentTypeData->addFieldDefinitionData(new FieldDefinitionData([ 'fieldDefinition' => $fieldDef, 'contentTypeData' => $contentTypeData, 'identifier' => $fieldDef->identifier, - 'names' => $fieldDef->getNames(), - 'descriptions' => $fieldDef->getDescriptions(), + 'names' => $names, + 'descriptions' => $descriptions, 'fieldGroup' => $fieldDef->fieldGroup, 'position' => $fieldDef->position, 'isTranslatable' => $fieldDef->isTranslatable, @@ -62,4 +88,19 @@ public function mapToFormData(ValueObject $contentTypeDraft, array $params = []) return $contentTypeData; } + + /** + * @param \Symfony\Component\OptionsResolver\OptionsResolver $optionsResolver + * + * @throws \Symfony\Component\OptionsResolver\Exception\UndefinedOptionsException + * @throws \Symfony\Component\OptionsResolver\Exception\AccessException + */ + private function configureOptions(OptionsResolver $optionsResolver) + { + $optionsResolver + ->setDefined(['language']) + ->setDefined(['baseLanguage']) + ->setAllowedTypes('baseLanguage', ['null', Language::class]) + ->setAllowedTypes('language', Language::class); + } } diff --git a/lib/FieldType/Mapper/AuthorFormMapper.php b/lib/FieldType/Mapper/AuthorFormMapper.php index 819445087..6896f39d0 100644 --- a/lib/FieldType/Mapper/AuthorFormMapper.php +++ b/lib/FieldType/Mapper/AuthorFormMapper.php @@ -29,6 +29,7 @@ class AuthorFormMapper implements FieldDefinitionFormMapperInterface, FieldValue */ public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, FieldDefinitionData $data) { + $isTranslation = $data->contentTypeData->languageCode !== $data->contentTypeData->mainLanguageCode; $fieldDefinitionForm ->add( 'defaultAuthor', @@ -44,6 +45,7 @@ public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, Field 'property_path' => 'fieldSettings[defaultAuthor]', 'label' => 'field_definition.ezauthor.default_author', 'translation_domain' => 'ezrepoforms_content_type', + 'disabled' => $isTranslation, ] ); } @@ -58,7 +60,8 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) $fieldSettings = $fieldDefinition->getFieldSettings(); $formConfig = $fieldForm->getConfig(); $names = $fieldDefinition->getNames(); - $label = $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')) ?: reset($names); + $label = $fieldDefinition->getName($formConfig->getOption('languageCode')) + ?: $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')); $fieldForm ->add( @@ -66,7 +69,7 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) ->create('value', AuthorFieldType::class, [ 'default_author' => $fieldSettings['defaultAuthor'], 'required' => $fieldDefinition->isRequired, - 'label' => $label, + 'label' => $label ?? reset($names), ]) ->setAutoInitialize(false) ->getForm() diff --git a/lib/FieldType/Mapper/BinaryFileFormMapper.php b/lib/FieldType/Mapper/BinaryFileFormMapper.php index 7228f618d..2daf51faa 100644 --- a/lib/FieldType/Mapper/BinaryFileFormMapper.php +++ b/lib/FieldType/Mapper/BinaryFileFormMapper.php @@ -35,6 +35,7 @@ public function __construct(FieldTypeService $fieldTypeService, MaxUploadSize $m public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, FieldDefinitionData $data) { + $isTranslation = $data->contentTypeData->languageCode !== $data->contentTypeData->mainLanguageCode; $fieldDefinitionForm ->add('maxSize', IntegerType::class, [ 'required' => false, @@ -51,6 +52,7 @@ public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, Field 'min' => 0, 'max' => $this->maxUploadSize->get(MaxUploadSize::MEGABYTES), ], + 'disabled' => $isTranslation, ]); } @@ -60,7 +62,8 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) $formConfig = $fieldForm->getConfig(); $fieldType = $this->fieldTypeService->getFieldType($fieldDefinition->fieldTypeIdentifier); $names = $fieldDefinition->getNames(); - $label = $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')) ?: reset($names); + $label = $fieldDefinition->getName($formConfig->getOption('languageCode')) + ?: $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')); $fieldForm ->add( @@ -70,7 +73,7 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) BinaryFileFieldType::class, [ 'required' => $fieldDefinition->isRequired, - 'label' => $label, + 'label' => $label ?? reset($names), ] ) ->addModelTransformer(new BinaryFileValueTransformer($fieldType, $data->value, Value::class)) diff --git a/lib/FieldType/Mapper/CheckboxFormMapper.php b/lib/FieldType/Mapper/CheckboxFormMapper.php index ed7f35884..ef47c5478 100644 --- a/lib/FieldType/Mapper/CheckboxFormMapper.php +++ b/lib/FieldType/Mapper/CheckboxFormMapper.php @@ -23,6 +23,7 @@ class CheckboxFormMapper implements FieldDefinitionFormMapperInterface, FieldVal { public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, FieldDefinitionData $fieldDefinition) { + $isTranslation = $fieldDefinition->contentTypeData->languageCode !== $fieldDefinition->contentTypeData->mainLanguageCode; $defaultValueForm = $fieldDefinitionForm ->getConfig() ->getFormFactory() @@ -30,6 +31,7 @@ public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, Field ->create('defaultValue', CheckboxFieldType::class, [ 'required' => false, 'label' => /** @Desc("Default value") */'field_definition.ezboolean.default_value', + 'disabled' => $isTranslation, ]) ->setAutoInitialize(false) ->getForm(); @@ -42,7 +44,8 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) $fieldDefinition = $data->fieldDefinition; $formConfig = $fieldForm->getConfig(); $names = $fieldDefinition->getNames(); - $label = $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')) ?: reset($names); + $label = $fieldDefinition->getName($formConfig->getOption('languageCode')) + ?: $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')); $fieldForm ->add( @@ -52,7 +55,7 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) CheckboxFieldType::class, [ 'required' => $fieldDefinition->isRequired, - 'label' => $label, + 'label' => $label ?? reset($names), ] ) ->setAutoInitialize(false) diff --git a/lib/FieldType/Mapper/CountryFormMapper.php b/lib/FieldType/Mapper/CountryFormMapper.php index 2355aa9ff..1aa2b02d6 100644 --- a/lib/FieldType/Mapper/CountryFormMapper.php +++ b/lib/FieldType/Mapper/CountryFormMapper.php @@ -21,6 +21,7 @@ class CountryFormMapper implements FieldDefinitionFormMapperInterface, FieldValu { public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, FieldDefinitionData $data) { + $isTranslation = $data->contentTypeData->languageCode !== $data->contentTypeData->mainLanguageCode; $fieldDefinitionForm ->add( 'isMultiple', @@ -28,6 +29,7 @@ public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, Field 'required' => false, 'property_path' => 'fieldSettings[isMultiple]', 'label' => 'field_definition.ezcountry.is_multiple', + 'disabled' => $isTranslation, ] ) ->add( @@ -41,6 +43,7 @@ public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, Field 'expanded' => false, 'required' => false, 'label' => 'field_definition.ezcountry.default_value', + 'disabled' => $isTranslation, ] ) // Deactivate auto-initialize as we're not on the root form. @@ -54,7 +57,8 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) $fieldSettings = $fieldDefinition->getFieldSettings(); $formConfig = $fieldForm->getConfig(); $names = $fieldDefinition->getNames(); - $label = $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')) ?: reset($names); + $label = $fieldDefinition->getName($formConfig->getOption('languageCode')) + ?: $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')); $fieldForm ->add( @@ -62,7 +66,7 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) ->create('value', CountryFieldType::class, [ 'multiple' => $fieldSettings['isMultiple'], 'required' => $fieldDefinition->isRequired, - 'label' => $label, + 'label' => $label ?? reset($names), ]) ->setAutoInitialize(false) ->getForm() diff --git a/lib/FieldType/Mapper/DateFormMapper.php b/lib/FieldType/Mapper/DateFormMapper.php index 61d7f385e..f4cd4d98b 100644 --- a/lib/FieldType/Mapper/DateFormMapper.php +++ b/lib/FieldType/Mapper/DateFormMapper.php @@ -25,6 +25,7 @@ class DateFormMapper implements FieldDefinitionFormMapperInterface, FieldValueFo { public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, FieldDefinitionData $data) { + $isTranslation = $data->contentTypeData->languageCode !== $data->contentTypeData->mainLanguageCode; $fieldDefinitionForm ->add( 'defaultType', @@ -40,6 +41,7 @@ public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, Field 'property_path' => 'fieldSettings[defaultType]', 'label' => 'field_definition.ezdate.default_type', 'translation_domain' => 'ezrepoforms_content_type', + 'disabled' => $isTranslation, ] ); } @@ -49,7 +51,8 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) $fieldDefinition = $data->fieldDefinition; $formConfig = $fieldForm->getConfig(); $names = $fieldDefinition->getNames(); - $label = $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')) ?: reset($names); + $label = $fieldDefinition->getName($formConfig->getOption('languageCode')) + ?: $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')); $fieldForm ->add( @@ -59,7 +62,7 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) DateFieldType::class, [ 'required' => $fieldDefinition->isRequired, - 'label' => $label, + 'label' => $label ?? reset($names), ] ) ->setAutoInitialize(false) diff --git a/lib/FieldType/Mapper/DateTimeFormMapper.php b/lib/FieldType/Mapper/DateTimeFormMapper.php index 5028826dd..b7835b88f 100644 --- a/lib/FieldType/Mapper/DateTimeFormMapper.php +++ b/lib/FieldType/Mapper/DateTimeFormMapper.php @@ -27,11 +27,13 @@ class DateTimeFormMapper implements FieldDefinitionFormMapperInterface, FieldVal { public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, FieldDefinitionData $data) { + $isTranslation = $data->contentTypeData->languageCode !== $data->contentTypeData->mainLanguageCode; $fieldDefinitionForm ->add('useSeconds', CheckboxType::class, [ 'required' => false, 'property_path' => 'fieldSettings[useSeconds]', 'label' => 'field_definition.ezdatetime.use_seconds', + 'disabled' => $isTranslation, ]) ->add('defaultType', ChoiceType::class, [ 'choices' => [ @@ -44,11 +46,13 @@ public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, Field 'required' => true, 'property_path' => 'fieldSettings[defaultType]', 'label' => 'field_definition.ezdatetime.default_type', + 'disabled' => $isTranslation, ]) ->add('dateInterval', DateTimeIntervalType::class, [ 'required' => false, 'property_path' => 'fieldSettings[dateInterval]', 'label' => 'field_definition.ezdatetime.date_interval', + 'disabled' => $isTranslation, ]); } @@ -58,7 +62,8 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) $fieldSettings = $fieldDefinition->getFieldSettings(); $formConfig = $fieldForm->getConfig(); $names = $fieldDefinition->getNames(); - $label = $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')) ?: reset($names); + $label = $fieldDefinition->getName($formConfig->getOption('languageCode')) + ?: $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')); $fieldForm ->add( @@ -69,7 +74,7 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) [ 'with_seconds' => $fieldSettings['useSeconds'], 'required' => $fieldDefinition->isRequired, - 'label' => $label, + 'label' => $label ?? reset($names), ] ) ->setAutoInitialize(false) diff --git a/lib/FieldType/Mapper/FloatFormMapper.php b/lib/FieldType/Mapper/FloatFormMapper.php index 572597c00..3e325becc 100644 --- a/lib/FieldType/Mapper/FloatFormMapper.php +++ b/lib/FieldType/Mapper/FloatFormMapper.php @@ -24,6 +24,7 @@ class FloatFormMapper implements FieldDefinitionFormMapperInterface, FieldValueF { public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, FieldDefinitionData $fieldDefinition) { + $isTranslation = $fieldDefinition->contentTypeData->languageCode !== $fieldDefinition->contentTypeData->mainLanguageCode; $defaultValueForm = $fieldDefinitionForm ->getConfig() ->getFormFactory() @@ -31,6 +32,7 @@ public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, Field ->create('defaultValue', FloatFieldType::class, [ 'required' => false, 'label' => 'field_definition.ezfloat.default_value', + 'disabled' => $isTranslation, ]) ->setAutoInitialize(false) ->getForm(); @@ -41,6 +43,7 @@ public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, Field 'required' => false, 'property_path' => 'validatorConfiguration[FloatValueValidator][minFloatValue]', 'label' => 'field_definition.ezfloat.min_value', + 'disabled' => $isTranslation, ] ) ->add( @@ -48,6 +51,7 @@ public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, Field 'required' => false, 'property_path' => 'validatorConfiguration[FloatValueValidator][maxFloatValue]', 'label' => 'field_definition.ezfloat.max_value', + 'disabled' => $isTranslation, ] ) ->add($defaultValueForm); @@ -59,7 +63,8 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) $formConfig = $fieldForm->getConfig(); $validatorConfiguration = $fieldDefinition->getValidatorConfiguration(); $names = $fieldDefinition->getNames(); - $label = $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')) ?: reset($names); + $label = $fieldDefinition->getName($formConfig->getOption('languageCode')) + ?: $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')); $fieldForm ->add( @@ -69,7 +74,7 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) FloatFieldType::class, [ 'required' => $fieldDefinition->isRequired, - 'label' => $label, + 'label' => $label ?? reset($names), 'min' => $validatorConfiguration['FloatValueValidator']['minFloatValue'], 'max' => $validatorConfiguration['FloatValueValidator']['maxFloatValue'], ] diff --git a/lib/FieldType/Mapper/FormTypeBasedFieldValueFormMapper.php b/lib/FieldType/Mapper/FormTypeBasedFieldValueFormMapper.php index be828c829..ee5ffd768 100644 --- a/lib/FieldType/Mapper/FormTypeBasedFieldValueFormMapper.php +++ b/lib/FieldType/Mapper/FormTypeBasedFieldValueFormMapper.php @@ -64,7 +64,8 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) $fieldDefinition = $data->fieldDefinition; $formConfig = $fieldForm->getConfig(); $names = $fieldDefinition->getNames(); - $label = $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')) ?: reset($names); + $label = $fieldDefinition->getName($formConfig->getOption('languageCode')) + ?: $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')); $fieldForm ->add( @@ -72,7 +73,10 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) ->create( 'value', $this->formType, - ['required' => $fieldDefinition->isRequired, 'label' => $label] + [ + 'required' => $fieldDefinition->isRequired, + 'label' => $label ?? reset($names), + ] ) ->addModelTransformer(new FieldValueTransformer($this->fieldTypeService->getFieldType($fieldDefinition->fieldTypeIdentifier))) // Deactivate auto-initialize as we're not on the root form. diff --git a/lib/FieldType/Mapper/ISBNFormMapper.php b/lib/FieldType/Mapper/ISBNFormMapper.php index 1a155bf31..31cb79896 100644 --- a/lib/FieldType/Mapper/ISBNFormMapper.php +++ b/lib/FieldType/Mapper/ISBNFormMapper.php @@ -21,6 +21,7 @@ class ISBNFormMapper implements FieldDefinitionFormMapperInterface, FieldValueFo { public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, FieldDefinitionData $fieldDefinition) { + $isTranslation = $fieldDefinition->contentTypeData->languageCode !== $fieldDefinition->contentTypeData->mainLanguageCode; $defaultValueForm = $fieldDefinitionForm ->getConfig() ->getFormFactory() @@ -28,6 +29,7 @@ public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, Field ->create('defaultValue', ISBNFieldType::class, [ 'required' => false, 'label' => 'field_definition.ezisbn.default_value', + 'disabled' => $isTranslation, ]) ->setAutoInitialize(false) ->getForm(); @@ -38,6 +40,7 @@ public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, Field 'required' => false, 'property_path' => 'fieldSettings[isISBN13]', 'label' => 'field_definition.ezisbn.is_isbn13', + 'disabled' => $isTranslation, ] ) ->add($defaultValueForm); @@ -48,7 +51,8 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) $fieldDefinition = $data->fieldDefinition; $formConfig = $fieldForm->getConfig(); $names = $fieldDefinition->getNames(); - $label = $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')) ?: reset($names); + $label = $fieldDefinition->getName($formConfig->getOption('languageCode')) + ?: $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')); $fieldForm ->add( @@ -58,7 +62,7 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) ISBNFieldType::class, [ 'required' => $fieldDefinition->isRequired, - 'label' => $label, + 'label' => $label ?? reset($names), ] ) ->setAutoInitialize(false) diff --git a/lib/FieldType/Mapper/ImageAssetFormMapper.php b/lib/FieldType/Mapper/ImageAssetFormMapper.php index e958f0134..393bb1d79 100644 --- a/lib/FieldType/Mapper/ImageAssetFormMapper.php +++ b/lib/FieldType/Mapper/ImageAssetFormMapper.php @@ -40,7 +40,8 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data): vo $formConfig = $fieldForm->getConfig(); $names = $fieldDefinition->getNames(); $fieldType = $this->fieldTypeService->getFieldType($fieldDefinition->fieldTypeIdentifier); - $label = $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')) ?: reset($names); + $label = $fieldDefinition->getName($formConfig->getOption('languageCode')) + ?: $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')); $fieldForm ->add( @@ -50,7 +51,7 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data): vo ImageAssetFieldType::class, [ 'required' => $fieldDefinition->isRequired, - 'label' => $label, + 'label' => $label ?? reset($names), ] ) ->addModelTransformer(new ImageAssetValueTransformer($fieldType, $data->value, Value::class)) diff --git a/lib/FieldType/Mapper/ImageFormMapper.php b/lib/FieldType/Mapper/ImageFormMapper.php index 89397a580..b6a822a5f 100644 --- a/lib/FieldType/Mapper/ImageFormMapper.php +++ b/lib/FieldType/Mapper/ImageFormMapper.php @@ -37,6 +37,7 @@ public function __construct(FieldTypeService $fieldTypeService, MaxUploadSize $m public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, FieldDefinitionData $data) { + $isTranslation = $data->contentTypeData->languageCode !== $data->contentTypeData->mainLanguageCode; $fieldDefinitionForm ->add('maxSize', IntegerType::class, [ 'required' => false, @@ -52,6 +53,7 @@ public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, Field 'min' => 0, 'max' => $this->maxUploadSize->get(MaxUploadSize::MEGABYTES), ], + 'disabled' => $isTranslation, ]); } @@ -61,7 +63,8 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) $formConfig = $fieldForm->getConfig(); $fieldType = $this->fieldTypeService->getFieldType($fieldDefinition->fieldTypeIdentifier); $names = $fieldDefinition->getNames(); - $label = $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')) ?: reset($names); + $label = $fieldDefinition->getName($formConfig->getOption('languageCode')) + ?: $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')); $fieldForm ->add( @@ -71,7 +74,7 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) ImageFieldType::class, [ 'required' => $fieldDefinition->isRequired, - 'label' => $label, + 'label' => $label ?? reset($names), ] ) ->addModelTransformer(new ImageValueTransformer($fieldType, $data->value, Value::class)) diff --git a/lib/FieldType/Mapper/IntegerFormMapper.php b/lib/FieldType/Mapper/IntegerFormMapper.php index db93d7746..ac83621e8 100644 --- a/lib/FieldType/Mapper/IntegerFormMapper.php +++ b/lib/FieldType/Mapper/IntegerFormMapper.php @@ -24,6 +24,7 @@ class IntegerFormMapper implements FieldDefinitionFormMapperInterface, FieldValu { public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, FieldDefinitionData $fieldDefinition) { + $isTranslation = $fieldDefinition->contentTypeData->languageCode !== $fieldDefinition->contentTypeData->mainLanguageCode; $defaultValueForm = $fieldDefinitionForm ->getConfig() ->getFormFactory() @@ -41,6 +42,7 @@ public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, Field 'required' => false, 'property_path' => 'validatorConfiguration[IntegerValueValidator][minIntegerValue]', 'label' => 'field_definition.ezinteger.min_value', + 'disabled' => $isTranslation, ] ) ->add( @@ -48,6 +50,7 @@ public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, Field 'required' => false, 'property_path' => 'validatorConfiguration[IntegerValueValidator][maxIntegerValue]', 'label' => 'field_definition.ezinteger.max_value', + 'disabled' => $isTranslation, ] ) ->add($defaultValueForm); @@ -59,7 +62,8 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) $formConfig = $fieldForm->getConfig(); $validatorConfiguration = $fieldDefinition->getValidatorConfiguration(); $names = $fieldDefinition->getNames(); - $label = $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')) ?: reset($names); + $label = $fieldDefinition->getName($formConfig->getOption('languageCode')) + ?: $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')); $fieldForm ->add( @@ -69,7 +73,7 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) IntegerFieldType::class, [ 'required' => $fieldDefinition->isRequired, - 'label' => $label, + 'label' => $label ?? reset($names), 'min' => $validatorConfiguration['IntegerValueValidator']['minIntegerValue'], 'max' => $validatorConfiguration['IntegerValueValidator']['maxIntegerValue'], ] diff --git a/lib/FieldType/Mapper/KeywordFormMapper.php b/lib/FieldType/Mapper/KeywordFormMapper.php index af091f29f..e48412185 100644 --- a/lib/FieldType/Mapper/KeywordFormMapper.php +++ b/lib/FieldType/Mapper/KeywordFormMapper.php @@ -24,7 +24,8 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) $fieldDefinition = $data->fieldDefinition; $formConfig = $fieldForm->getConfig(); $names = $fieldDefinition->getNames(); - $label = $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')) ?: reset($names); + $label = $fieldDefinition->getName($formConfig->getOption('languageCode')) + ?: $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')); $fieldForm ->add( @@ -34,7 +35,7 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) KeywordFieldType::class, [ 'required' => $fieldDefinition->isRequired, - 'label' => $label, + 'label' => $label ?? reset($names), ] ) ->setAutoInitialize(false) diff --git a/lib/FieldType/Mapper/MapLocationFormMapper.php b/lib/FieldType/Mapper/MapLocationFormMapper.php index b75a13bbd..f7e2a9584 100644 --- a/lib/FieldType/Mapper/MapLocationFormMapper.php +++ b/lib/FieldType/Mapper/MapLocationFormMapper.php @@ -24,7 +24,8 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) $fieldDefinition = $data->fieldDefinition; $formConfig = $fieldForm->getConfig(); $names = $fieldDefinition->getNames(); - $label = $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')) ?: reset($names); + $label = $fieldDefinition->getName($formConfig->getOption('languageCode')) + ?: $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')); $fieldForm ->add( @@ -34,7 +35,7 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) MapLocationFieldType::class, [ 'required' => $fieldDefinition->isRequired, - 'label' => $label, + 'label' => $label ?? reset($names), ] ) ->setAutoInitialize(false) diff --git a/lib/FieldType/Mapper/MediaFormMapper.php b/lib/FieldType/Mapper/MediaFormMapper.php index 9e1b1f7a1..a980e5a84 100644 --- a/lib/FieldType/Mapper/MediaFormMapper.php +++ b/lib/FieldType/Mapper/MediaFormMapper.php @@ -38,6 +38,7 @@ public function __construct(FieldTypeService $fieldTypeService, MaxUploadSize $m public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, FieldDefinitionData $data) { + $isTranslation = $data->contentTypeData->languageCode !== $data->contentTypeData->mainLanguageCode; $fieldDefinitionForm ->add('maxSize', IntegerType::class, [ 'required' => false, @@ -53,6 +54,7 @@ public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, Field 'min' => 0, 'max' => $this->maxUploadSize->get(MaxUploadSize::MEGABYTES), ], + 'disabled' => $isTranslation, ]) ->add('mediaType', ChoiceType::class, [ 'choices' => [ @@ -68,6 +70,7 @@ public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, Field 'required' => true, 'property_path' => 'fieldSettings[mediaType]', 'label' => 'field_definition.ezmedia.media_type', + 'disabled' => $isTranslation, ]); } @@ -77,7 +80,8 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) $formConfig = $fieldForm->getConfig(); $fieldType = $this->fieldTypeService->getFieldType($fieldDefinition->fieldTypeIdentifier); $names = $fieldDefinition->getNames(); - $label = $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')) ?: reset($names); + $label = $fieldDefinition->getName($formConfig->getOption('languageCode')) + ?: $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')); $fieldForm ->add( @@ -87,7 +91,7 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) MediaFieldType::class, [ 'required' => $fieldDefinition->isRequired, - 'label' => $label, + 'label' => $label ?? reset($names), ] ) ->addModelTransformer(new MediaValueTransformer($fieldType, $data->value, Value::class)) diff --git a/lib/FieldType/Mapper/PageFormMapper.php b/lib/FieldType/Mapper/PageFormMapper.php index 1eb101108..4a244da07 100644 --- a/lib/FieldType/Mapper/PageFormMapper.php +++ b/lib/FieldType/Mapper/PageFormMapper.php @@ -33,6 +33,7 @@ public function __construct(PageService $pageService) public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, FieldDefinitionData $data) { $availableLayouts = $this->pageService->getAvailableZoneLayouts(); + $isTranslation = $data->contentTypeData->languageCode !== $data->contentTypeData->mainLanguageCode; $fieldDefinitionForm ->add('defaultLayout', ChoiceType::class, [ @@ -43,6 +44,7 @@ public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, Field 'required' => false, 'property_path' => 'fieldSettings[defaultLayout]', 'label' => 'field_definition.ezpage.default_layout', + 'disabled' => $isTranslation, ]); } diff --git a/lib/FieldType/Mapper/RelationFormMapper.php b/lib/FieldType/Mapper/RelationFormMapper.php index fc56c4843..3cfa6bb98 100644 --- a/lib/FieldType/Mapper/RelationFormMapper.php +++ b/lib/FieldType/Mapper/RelationFormMapper.php @@ -20,6 +20,7 @@ class RelationFormMapper extends AbstractRelationFormMapper { public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, FieldDefinitionData $data) { + $isTranslation = $data->contentTypeData->languageCode !== $data->contentTypeData->mainLanguageCode; $fieldDefinitionForm ->add('selectionRoot', HiddenType::class, [ 'required' => false, @@ -34,6 +35,7 @@ public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, Field 'required' => false, 'property_path' => 'fieldSettings[selectionContentTypes]', 'label' => 'field_definition.ezobjectrelation.selection_content_types', + 'disabled' => $isTranslation, ]); } @@ -42,14 +44,15 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) $fieldDefinition = $data->fieldDefinition; $formConfig = $fieldForm->getConfig(); $names = $fieldDefinition->getNames(); - $label = $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')) ?: reset($names); + $label = $fieldDefinition->getName($formConfig->getOption('languageCode')) + ?: $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')); $fieldForm ->add( $formConfig->getFormFactory()->createBuilder() ->create('value', RelationFieldType::class, [ 'required' => $fieldDefinition->isRequired, - 'label' => $label, + 'label' => $label ?? reset($names), ]) ->setAutoInitialize(false) ->getForm() diff --git a/lib/FieldType/Mapper/RelationListFormMapper.php b/lib/FieldType/Mapper/RelationListFormMapper.php index 9a0a04bd5..36c4c6990 100644 --- a/lib/FieldType/Mapper/RelationListFormMapper.php +++ b/lib/FieldType/Mapper/RelationListFormMapper.php @@ -21,11 +21,13 @@ class RelationListFormMapper extends AbstractRelationFormMapper { public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, FieldDefinitionData $data) { + $isTranslation = $data->contentTypeData->languageCode !== $data->contentTypeData->mainLanguageCode; $fieldDefinitionForm ->add('selectionDefaultLocation', HiddenType::class, [ 'required' => false, 'property_path' => 'fieldSettings[selectionDefaultLocation]', 'label' => 'field_definition.ezobjectrelationlist.selection_default_location', + 'disabled' => $isTranslation, ]) ->add('selectionContentTypes', ChoiceType::class, [ 'choices' => $this->getContentTypesHash(), @@ -35,12 +37,14 @@ public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, Field 'required' => false, 'property_path' => 'fieldSettings[selectionContentTypes]', 'label' => 'field_definition.ezobjectrelationlist.selection_content_types', + 'disabled' => $isTranslation, ]) ->add('selectionLimit', IntegerType::class, [ 'required' => false, 'empty_data' => 0, 'property_path' => 'validatorConfiguration[RelationListValueValidator][selectionLimit]', 'label' => /** @Desc("Selection limit") */ 'field_definition.ezobjectrelationlist.selection_limit', + 'disabled' => $isTranslation, ]); } @@ -49,7 +53,8 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) $fieldDefinition = $data->fieldDefinition; $formConfig = $fieldForm->getConfig(); $names = $fieldDefinition->getNames(); - $label = $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')) ?: reset($names); + $label = $fieldDefinition->getName($formConfig->getOption('languageCode')) + ?: $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')); $fieldForm ->add( @@ -59,7 +64,7 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) RelationListFieldType::class, [ 'required' => $fieldDefinition->isRequired, - 'label' => $label, + 'label' => $label ?? reset($names), ] ) ->setAutoInitialize(false) diff --git a/lib/FieldType/Mapper/RichTextFormMapper.php b/lib/FieldType/Mapper/RichTextFormMapper.php index 3670c3d64..8dd4bf38a 100644 --- a/lib/FieldType/Mapper/RichTextFormMapper.php +++ b/lib/FieldType/Mapper/RichTextFormMapper.php @@ -21,14 +21,15 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) $fieldDefinition = $data->fieldDefinition; $formConfig = $fieldForm->getConfig(); $names = $fieldDefinition->getNames(); - $label = $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')) ?: reset($names); + $label = $fieldDefinition->getName($formConfig->getOption('languageCode')) + ?: $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')); $fieldForm ->add( $formConfig->getFormFactory()->createBuilder() ->create('value', RichTextFieldType::class, [ 'required' => $fieldDefinition->isRequired, - 'label' => $label, + 'label' => $label ?? reset($names), ]) ->setAutoInitialize(false) ->getForm() diff --git a/lib/FieldType/Mapper/SelectionFormMapper.php b/lib/FieldType/Mapper/SelectionFormMapper.php index 73f108c98..c50338a8b 100644 --- a/lib/FieldType/Mapper/SelectionFormMapper.php +++ b/lib/FieldType/Mapper/SelectionFormMapper.php @@ -32,11 +32,13 @@ class SelectionFormMapper implements FieldDefinitionFormMapperInterface, FieldVa */ public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, FieldDefinitionData $data) { + $isTranslation = $data->contentTypeData->languageCode !== $data->contentTypeData->mainLanguageCode; $fieldDefinitionForm ->add('isMultiple', CheckboxType::class, [ 'required' => false, 'property_path' => 'fieldSettings[isMultiple]', 'label' => 'field_definition.ezselection.is_multiple', + 'disabled' => $isTranslation, ]) ->add('options', CollectionType::class, [ 'entry_type' => TextType::class, @@ -49,6 +51,7 @@ public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, Field 'required' => false, 'property_path' => 'fieldSettings[options]', 'label' => 'field_definition.ezselection.options', + 'disabled' => $isTranslation, ]); } @@ -57,7 +60,8 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) $fieldDefinition = $data->fieldDefinition; $formConfig = $fieldForm->getConfig(); $names = $fieldDefinition->getNames(); - $label = $fieldDefinition->getName($formConfig->getOption('languageCode')) ?: reset($names); + $label = $fieldDefinition->getName($formConfig->getOption('languageCode')) + ?: $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')); $fieldForm ->add( @@ -67,7 +71,7 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) SelectionFieldType::class, [ 'required' => $fieldDefinition->isRequired, - 'label' => $label, + 'label' => $label ?? reset($names), 'multiple' => $fieldDefinition->fieldSettings['isMultiple'], 'choices' => array_flip($fieldDefinition->fieldSettings['options']), ] diff --git a/lib/FieldType/Mapper/TextBlockFormMapper.php b/lib/FieldType/Mapper/TextBlockFormMapper.php index f850966e6..d27a36f6e 100644 --- a/lib/FieldType/Mapper/TextBlockFormMapper.php +++ b/lib/FieldType/Mapper/TextBlockFormMapper.php @@ -24,12 +24,14 @@ class TextBlockFormMapper implements FieldDefinitionFormMapperInterface, FieldVa { public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, FieldDefinitionData $data) { + $isTranslation = $data->contentTypeData->languageCode !== $data->contentTypeData->mainLanguageCode; $fieldDefinitionForm ->add( 'textRows', IntegerType::class, [ 'required' => false, 'property_path' => 'fieldSettings[textRows]', 'label' => 'field_definition.eztext.text_rows', + 'disabled' => $isTranslation, ] ); } @@ -39,7 +41,8 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) $fieldDefinition = $data->fieldDefinition; $formConfig = $fieldForm->getConfig(); $names = $fieldDefinition->getNames(); - $label = $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')) ?: reset($names); + $label = $fieldDefinition->getName($formConfig->getOption('languageCode')) + ?: $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')); $fieldForm ->add( @@ -49,7 +52,7 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) TextBlockFieldType::class, [ 'required' => $fieldDefinition->isRequired, - 'label' => $label, + 'label' => $label ?? reset($names), 'rows' => $data->fieldDefinition->fieldSettings['textRows'], ] ) diff --git a/lib/FieldType/Mapper/TextLineFormMapper.php b/lib/FieldType/Mapper/TextLineFormMapper.php index c1864dc78..f14f4824e 100644 --- a/lib/FieldType/Mapper/TextLineFormMapper.php +++ b/lib/FieldType/Mapper/TextLineFormMapper.php @@ -24,18 +24,21 @@ class TextLineFormMapper implements FieldDefinitionFormMapperInterface, FieldVal { public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, FieldDefinitionData $data) { + $isTranslation = $data->contentTypeData->languageCode !== $data->contentTypeData->mainLanguageCode; $fieldDefinitionForm ->add('minLength', IntegerType::class, [ 'required' => false, 'property_path' => 'validatorConfiguration[StringLengthValidator][minStringLength]', 'label' => 'field_definition.ezstring.min_length', 'attr' => ['min' => 0], + 'disabled' => $isTranslation, ]) ->add('maxLength', IntegerType::class, [ 'required' => false, 'property_path' => 'validatorConfiguration[StringLengthValidator][maxStringLength]', 'label' => 'field_definition.ezstring.max_length', 'attr' => ['min' => 0], + 'disabled' => $isTranslation, ]) ->add( $fieldDefinitionForm @@ -43,6 +46,7 @@ public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, Field ->create('defaultValue', TextLineFieldType::class, [ 'required' => false, 'label' => 'field_definition.ezstring.default_value', + 'disabled' => $isTranslation, ]) ->setAutoInitialize(false) ->getForm() @@ -55,7 +59,8 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) $formConfig = $fieldForm->getConfig(); $validatorConfiguration = $fieldDefinition->getValidatorConfiguration(); $names = $fieldDefinition->getNames(); - $label = $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')) ?: reset($names); + $label = $fieldDefinition->getName($formConfig->getOption('languageCode')) + ?: $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')); $fieldForm ->add( @@ -65,7 +70,7 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) TextLineFieldType::class, [ 'required' => $fieldDefinition->isRequired, - 'label' => $label, + 'label' => $label ?? reset($names), 'min' => $validatorConfiguration['StringLengthValidator']['minStringLength'], 'max' => $validatorConfiguration['StringLengthValidator']['maxStringLength'], ] diff --git a/lib/FieldType/Mapper/TimeFormMapper.php b/lib/FieldType/Mapper/TimeFormMapper.php index 59ea071eb..b8a44bc45 100644 --- a/lib/FieldType/Mapper/TimeFormMapper.php +++ b/lib/FieldType/Mapper/TimeFormMapper.php @@ -26,6 +26,7 @@ class TimeFormMapper implements FieldDefinitionFormMapperInterface, FieldValueFo { public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, FieldDefinitionData $data) { + $isTranslation = $data->contentTypeData->languageCode !== $data->contentTypeData->mainLanguageCode; $fieldDefinitionForm ->add( 'useSeconds', @@ -34,6 +35,7 @@ public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, Field 'required' => false, 'property_path' => 'fieldSettings[useSeconds]', 'label' => 'field_definition.eztime.use_seconds', + 'disabled' => $isTranslation, ] ) ->add( @@ -49,6 +51,7 @@ public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, Field 'required' => true, 'property_path' => 'fieldSettings[defaultType]', 'label' => 'field_definition.eztime.default_type', + 'disabled' => $isTranslation, ] ); } @@ -59,7 +62,8 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) $fieldSettings = $fieldDefinition->getFieldSettings(); $formConfig = $fieldForm->getConfig(); $names = $fieldDefinition->getNames(); - $label = $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')) ?: reset($names); + $label = $fieldDefinition->getName($formConfig->getOption('languageCode')) + ?: $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')); $fieldForm ->add( @@ -67,7 +71,7 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) ->create('value', TimeFieldType::class, [ 'with_seconds' => $fieldSettings['useSeconds'], 'required' => $fieldDefinition->isRequired, - 'label' => $label, + 'label' => $label ?? reset($names), ]) ->setAutoInitialize(false) ->getForm() diff --git a/lib/FieldType/Mapper/UrlFormMapper.php b/lib/FieldType/Mapper/UrlFormMapper.php index 92428faa1..87a987d61 100644 --- a/lib/FieldType/Mapper/UrlFormMapper.php +++ b/lib/FieldType/Mapper/UrlFormMapper.php @@ -27,14 +27,15 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) $fieldDefinition = $data->fieldDefinition; $formConfig = $fieldForm->getConfig(); $names = $fieldDefinition->getNames(); - $label = $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')) ?: reset($names); + $label = $fieldDefinition->getName($formConfig->getOption('languageCode')) + ?: $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')); $fieldForm ->add( $formConfig->getFormFactory()->createBuilder() ->create('value', UrlFieldType::class, [ 'required' => $fieldDefinition->isRequired, - 'label' => $label, + 'label' => $label ?? reset($names), ]) ->setAutoInitialize(false) ->getForm() diff --git a/lib/FieldType/Mapper/UserAccountFieldValueFormMapper.php b/lib/FieldType/Mapper/UserAccountFieldValueFormMapper.php index 381cf5aa5..34cd5f3c5 100644 --- a/lib/FieldType/Mapper/UserAccountFieldValueFormMapper.php +++ b/lib/FieldType/Mapper/UserAccountFieldValueFormMapper.php @@ -51,7 +51,8 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) $rootForm = $fieldForm->getRoot()->getRoot(); $formIntent = $rootForm->getConfig()->getOption('intent'); $names = $fieldDefinition->getNames(); - $label = $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')) ?: reset($names); + $label = $fieldDefinition->getName($formConfig->getOption('languageCode')) + ?: $fieldDefinition->getName($formConfig->getOption('mainLanguageCode')); $fieldForm ->add( diff --git a/lib/Form/Processor/ContentTypeFormProcessor.php b/lib/Form/Processor/ContentTypeFormProcessor.php index 672ba8b19..2ebad7c6d 100644 --- a/lib/Form/Processor/ContentTypeFormProcessor.php +++ b/lib/Form/Processor/ContentTypeFormProcessor.php @@ -12,6 +12,7 @@ use eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft; use eZ\Publish\API\Repository\Values\ContentType\FieldDefinition; use eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionCreateStruct; +use eZ\Publish\Core\Base\Exceptions\InvalidArgumentException; use eZ\Publish\Core\Helper\FieldsGroups\FieldsGroupsList; use EzSystems\RepositoryForms\Event\FormActionEvent; use EzSystems\RepositoryForms\Event\RepositoryFormEvents; @@ -93,6 +94,14 @@ public function processAddFieldDefinition(FormActionEvent $event) $contentTypeDraft = $this->contentTypeService->loadContentTypeDraft($event->getData()->contentTypeDraft->id); $fieldTypeIdentifier = $event->getForm()->get('fieldTypeSelection')->getData(); + $targetLanguageCode = $event->getForm()->getConfig()->getOption('languageCode'); + if ($contentTypeDraft->mainLanguageCode !== $targetLanguageCode) { + throw new InvalidArgumentException( + 'languageCode', + 'FieldDefinitions can be only added to main language translation' + ); + } + $maxFieldPos = 0; foreach ($contentTypeDraft->fieldDefinitions as $existingFieldDef) { if ($existingFieldDef->position > $maxFieldPos) { diff --git a/lib/Form/Type/ContentType/ContentTypeUpdateType.php b/lib/Form/Type/ContentType/ContentTypeUpdateType.php index abdddf831..9622de2f7 100644 --- a/lib/Form/Type/ContentType/ContentTypeUpdateType.php +++ b/lib/Form/Type/ContentType/ContentTypeUpdateType.php @@ -39,21 +39,32 @@ public function configureOptions(OptionsResolver $resolver) ->setDefaults([ 'data_class' => 'EzSystems\RepositoryForms\Data\ContentTypeData', 'translation_domain' => 'ezrepoforms_content_type', + 'mainLanguageCode' => null, ]) + ->setDefined(['mainLanguageCode']) + ->setAllowedTypes('mainLanguageCode', ['null', 'string']) ->setRequired(['languageCode']); } public function buildForm(FormBuilderInterface $builder, array $options) { $hasFieldDefinition = count($options['data']->fieldDefinitionsData) > 0; + $isTranslation = $options['mainLanguageCode'] !== $options['languageCode']; + $translatablePropertyTransformer = new TranslatablePropertyTransformer($options['languageCode']); $builder ->add( $builder - ->create('name', TextType::class, ['property_path' => 'names', 'label' => 'content_type.name']) + ->create('name', TextType::class, [ + 'property_path' => 'names', + 'label' => 'content_type.name', + ]) ->addModelTransformer($translatablePropertyTransformer) ) - ->add('identifier', TextType::class, ['label' => 'content_type.identifier']) + ->add('identifier', TextType::class, [ + 'label' => 'content_type.identifier', + 'disabled' => $isTranslation, + ]) ->add( $builder ->create('description', TextType::class, [ @@ -63,38 +74,59 @@ public function buildForm(FormBuilderInterface $builder, array $options) ]) ->addModelTransformer($translatablePropertyTransformer) ) - ->add('nameSchema', TextType::class, ['required' => false, 'label' => 'content_type.name_schema']) - ->add('urlAliasSchema', TextType::class, ['required' => false, 'label' => 'content_type.url_alias_schema', 'empty_data' => false]) - ->add('isContainer', CheckboxType::class, ['required' => false, 'label' => 'content_type.is_container']) + ->add('nameSchema', TextType::class, [ + 'required' => false, + 'label' => 'content_type.name_schema', + 'disabled' => $isTranslation, + ]) + ->add('urlAliasSchema', TextType::class, [ + 'required' => false, + 'label' => 'content_type.url_alias_schema', + 'empty_data' => false, + 'disabled' => $isTranslation, + ]) + ->add('isContainer', CheckboxType::class, [ + 'required' => false, + 'label' => 'content_type.is_container', + 'disabled' => $isTranslation, + ]) ->add('defaultSortField', SortFieldChoiceType::class, [ 'label' => 'content_type.default_sort_field', + 'disabled' => $isTranslation, ]) ->add('defaultSortOrder', SortOrderChoiceType::class, [ 'label' => 'content_type.default_sort_order', + 'disabled' => $isTranslation, ]) ->add('defaultAlwaysAvailable', CheckboxType::class, [ 'required' => false, 'label' => 'content_type.default_always_available', + 'disabled' => $isTranslation, ]) ->add('fieldDefinitionsData', CollectionType::class, [ 'entry_type' => FieldDefinitionType::class, - 'entry_options' => ['languageCode' => $options['languageCode']], + 'entry_options' => ['languageCode' => $options['languageCode'], 'mainLanguageCode' => $options['mainLanguageCode']], 'label' => 'content_type.field_definitions_data', ]) ->add('fieldTypeSelection', FieldTypeChoiceType::class, [ 'mapped' => false, 'label' => 'content_type.field_type_selection', + 'disabled' => $isTranslation, + ]) + ->add('addFieldDefinition', SubmitType::class, [ + 'label' => 'content_type.add_field_definition', + 'disabled' => $isTranslation, ]) - ->add('addFieldDefinition', SubmitType::class, ['label' => 'content_type.add_field_definition']) ->add('removeFieldDefinition', SubmitType::class, [ 'label' => 'content_type.remove_field_definitions', - 'disabled' => !$hasFieldDefinition, + 'disabled' => !$hasFieldDefinition || $isTranslation, ]) ->add('saveContentType', SubmitType::class, ['label' => 'content_type.save']) ->add('removeDraft', SubmitType::class, ['label' => 'content_type.remove_draft', 'validation_groups' => false]) ->add('publishContentType', SubmitType::class, [ 'label' => 'content_type.publish', 'disabled' => !$hasFieldDefinition, - ]); + ]) + ; } } diff --git a/lib/Form/Type/FieldDefinition/FieldDefinitionType.php b/lib/Form/Type/FieldDefinition/FieldDefinitionType.php index 12503ed9a..0111e7f70 100644 --- a/lib/Form/Type/FieldDefinition/FieldDefinitionType.php +++ b/lib/Form/Type/FieldDefinition/FieldDefinitionType.php @@ -59,7 +59,10 @@ public function configureOptions(OptionsResolver $resolver) ->setDefaults([ 'data_class' => 'EzSystems\RepositoryForms\Data\FieldDefinitionData', 'translation_domain' => 'ezrepoforms_content_type', + 'mainLanguageCode' => null, ]) + ->setDefined(['mainLanguageCode']) + ->setAllowedTypes('mainLanguageCode', ['null', 'string']) ->setRequired(['languageCode']); } @@ -71,12 +74,26 @@ public function buildForm(FormBuilderInterface $builder, array $options) } $translatablePropertyTransformer = new TranslatablePropertyTransformer($options['languageCode']); + $isTranslation = $options['languageCode'] !== $options['mainLanguageCode']; + $builder ->add( - $builder->create('name', TextType::class, ['property_path' => 'names', 'label' => 'field_definition.name']) + $builder->create('name', + TextType::class, + [ + 'property_path' => 'names', + 'label' => 'field_definition.name', + ]) ->addModelTransformer($translatablePropertyTransformer) ) - ->add('identifier', TextType::class, ['label' => 'field_definition.identifier']) + ->add( + 'identifier', + TextType::class, + [ + 'label' => 'field_definition.identifier', + 'disabled' => $isTranslation, + ] + ) ->add( $builder->create('description', TextType::class, [ 'property_path' => 'descriptions', @@ -85,19 +102,34 @@ public function buildForm(FormBuilderInterface $builder, array $options) ]) ->addModelTransformer($translatablePropertyTransformer) ) - ->add('isRequired', CheckboxType::class, ['required' => false, 'label' => 'field_definition.is_required']) - ->add('isTranslatable', CheckboxType::class, ['required' => false, 'label' => 'field_definition.is_translatable']) + ->add('isRequired', CheckboxType::class, [ + 'required' => false, + 'label' => 'field_definition.is_required', + 'disabled' => $isTranslation, + ]) + ->add('isTranslatable', CheckboxType::class, [ + 'required' => false, + 'label' => 'field_definition.is_translatable', + 'disabled' => $isTranslation, + ]) ->add( - 'fieldGroup', - ChoiceType::class, [ + 'fieldGroup', ChoiceType::class, [ 'choices' => $fieldsGroups, 'choices_as_values' => true, 'required' => false, 'label' => 'field_definition.field_group', + 'disabled' => $isTranslation, ] ) - ->add('position', IntegerType::class, ['label' => 'field_definition.position']) - ->add('selected', CheckboxType::class, ['required' => false, 'mapped' => false]); + ->add('position', IntegerType::class, [ + 'label' => 'field_definition.position', + 'disabled' => $isTranslation, + ]) + ->add('selected', CheckboxType::class, [ + 'required' => false, + 'mapped' => false, + 'disabled' => $isTranslation, + ]); // Hook on form generation for specific FieldType needs $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { @@ -106,10 +138,11 @@ public function buildForm(FormBuilderInterface $builder, array $options) $form = $event->getForm(); $fieldTypeIdentifier = $data->getFieldTypeIdentifier(); $fieldType = $this->fieldTypeService->getFieldType($fieldTypeIdentifier); + $isTranslation = $data->contentTypeData->languageCode !== $data->contentTypeData->mainLanguageCode; // isSearchable field should be present only if the FieldType allows it. $form->add('isSearchable', CheckboxType::class, [ 'required' => false, - 'disabled' => !$fieldType->isSearchable(), + 'disabled' => !$fieldType->isSearchable() || $isTranslation, 'label' => 'field_definition.is_searchable', ]); diff --git a/tests/RepositoryForms/Data/Mapper/ContentTypeDraftMapperTest.php b/tests/RepositoryForms/Data/Mapper/ContentTypeDraftMapperTest.php index 9fbfe3bd5..14cb1bcd7 100644 --- a/tests/RepositoryForms/Data/Mapper/ContentTypeDraftMapperTest.php +++ b/tests/RepositoryForms/Data/Mapper/ContentTypeDraftMapperTest.php @@ -110,6 +110,7 @@ public function testMapToFormData() 'defaultAlwaysAvailable' => $contentTypeDraft->defaultAlwaysAvailable, 'names' => $contentTypeDraft->getNames(), 'descriptions' => $contentTypeDraft->getDescriptions(), + 'languageCode' => $contentTypeDraft->mainLanguageCode, ]); $expectedFieldDefData1 = new FieldDefinitionData([ 'fieldDefinition' => $fieldDef1, diff --git a/tests/RepositoryForms/FieldType/Mapper/BaseMapperTest.php b/tests/RepositoryForms/FieldType/Mapper/BaseMapperTest.php index 6ca82d168..73f1fbc97 100644 --- a/tests/RepositoryForms/FieldType/Mapper/BaseMapperTest.php +++ b/tests/RepositoryForms/FieldType/Mapper/BaseMapperTest.php @@ -27,10 +27,6 @@ protected function setUp() ->willReturn($this->getMockBuilder(FieldType::class)->getMock()); $this->config = $this->getMockBuilder(FormConfigInterface::class)->getMock(); - $this->config->expects($this->once()) - ->method('getOption') - ->with('mainLanguageCode') - ->willReturn('eng-GB'); $formFactory = $this->getMockBuilder(FormFactoryInterface::class) ->setMethods(['addModelTransformer', 'setAutoInitialize', 'getForm']) diff --git a/tests/RepositoryForms/FieldType/Mapper/FormTypeBasedFieldValueFormMapperTest.php b/tests/RepositoryForms/FieldType/Mapper/FormTypeBasedFieldValueFormMapperTest.php index fb94f7fff..00c10dfc3 100644 --- a/tests/RepositoryForms/FieldType/Mapper/FormTypeBasedFieldValueFormMapperTest.php +++ b/tests/RepositoryForms/FieldType/Mapper/FormTypeBasedFieldValueFormMapperTest.php @@ -27,6 +27,13 @@ public function testMapFieldValueFormNoLanguageCode() ->with('fieldDefinition') ->willReturn($fieldDefinition); + $this->config + ->method('getOption') + ->willReturnMap([ + ['languageCode', null, 'eng-GB'], + ['mainLanguageCode', null, 'eng-GB'], + ]); + $mapper->mapFieldValueForm($this->fieldForm, $this->data); } @@ -44,6 +51,11 @@ public function testMapFieldValueFormWithLanguageCode() ->with('fieldDefinition') ->willReturn($fieldDefinition); + $this->config + ->method('getOption') + ->with('languageCode') + ->willReturn('eng-GB'); + $mapper->mapFieldValueForm($this->fieldForm, $this->data); } } diff --git a/tests/RepositoryForms/FieldType/Mapper/UserAccountFieldValueFormMapperTest.php b/tests/RepositoryForms/FieldType/Mapper/UserAccountFieldValueFormMapperTest.php index 57ac618ee..a6668d851 100644 --- a/tests/RepositoryForms/FieldType/Mapper/UserAccountFieldValueFormMapperTest.php +++ b/tests/RepositoryForms/FieldType/Mapper/UserAccountFieldValueFormMapperTest.php @@ -54,6 +54,13 @@ public function testMapFieldValueFormNoLanguageCode() ->with('fieldDefinition') ->willReturn($fieldDefinition); + $this->config + ->method('getOption') + ->willReturnMap([ + ['languageCode', null, 'eng-GB'], + ['mainLanguageCode', null, 'eng-GB'], + ]); + $mapper->mapFieldValueForm($this->fieldForm, $this->data); } @@ -68,6 +75,11 @@ public function testMapFieldValueFormWithLanguageCode() ->with('fieldDefinition') ->willReturn($fieldDefinition); + $this->config + ->method('getOption') + ->with('languageCode') + ->willReturn('eng-GB'); + $mapper->mapFieldValueForm($this->fieldForm, $this->data); } } diff --git a/tests/RepositoryForms/Form/Processor/ContentTypeFormProcessorTest.php b/tests/RepositoryForms/Form/Processor/ContentTypeFormProcessorTest.php index 7dfd1c4b0..db17a4fba 100644 --- a/tests/RepositoryForms/Form/Processor/ContentTypeFormProcessorTest.php +++ b/tests/RepositoryForms/Form/Processor/ContentTypeFormProcessorTest.php @@ -20,6 +20,7 @@ use EzSystems\RepositoryForms\Event\RepositoryFormEvents; use EzSystems\RepositoryForms\Form\Processor\ContentTypeFormProcessor; use PHPUnit\Framework\TestCase; +use Symfony\Component\Form\FormConfigInterface; use Symfony\Component\Form\FormInterface; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\Routing\RouterInterface; @@ -113,6 +114,7 @@ public function testAddFieldDefinition() $contentTypeDraft = new ContentTypeDraft([ 'innerContentType' => new ContentType([ 'fieldDefinitions' => $existingFieldDefinitions, + 'mainLanguageCode' => $languageCode, ]), ]); $expectedNewFieldDefIdentifier = sprintf( @@ -133,6 +135,17 @@ public function testAddFieldDefinition() ->with('fieldTypeSelection') ->willReturn($fieldTypeSelectionForm); + $formConfig = $this->createMock(FormConfigInterface::class); + $formConfig + ->method('getOption') + ->with('languageCode') + ->willReturn($languageCode); + + $mainForm + ->expects($this->once()) + ->method('getConfig') + ->willReturn($formConfig); + $expectedFieldDefCreateStruct = new FieldDefinitionCreateStruct([ 'fieldTypeIdentifier' => $fieldTypeIdentifier, 'identifier' => $expectedNewFieldDefIdentifier,