From 8a29ed0b13ca03694f6dbc561bf7691fa741a6a7 Mon Sep 17 00:00:00 2001 From: Maciej Kobus Date: Fri, 4 Aug 2017 15:54:51 +0200 Subject: [PATCH] EZP-27628: Implement editing support for RichText FieldType --- bundle/Resources/config/services.yml | 5 +- doc/bc/changes-1.10.md | 14 +++++ .../RichTextValueTransformer.php | 63 +++++++++++++++++++ lib/FieldType/Mapper/RichTextFormMapper.php | 42 +++++++++++-- 4 files changed, 119 insertions(+), 5 deletions(-) create mode 100644 doc/bc/changes-1.10.md create mode 100644 lib/FieldType/DataTransformer/RichTextValueTransformer.php diff --git a/bundle/Resources/config/services.yml b/bundle/Resources/config/services.yml index 9da1a1042..204f7ce2a 100644 --- a/bundle/Resources/config/services.yml +++ b/bundle/Resources/config/services.yml @@ -217,8 +217,11 @@ services: ezrepoforms.field_type.form_mapper.ezrichtext: class: "%ezrepoforms.field_type.form_mapper.ezrichtext.class%" + arguments: + - "@ezpublish.api.service.field_type" + - "@ezpublish.fieldType.ezrichtext.converter.edit.xhtml5" tags: - - { name: ez.fieldFormMapper.definition, fieldType: ezrichtext } + - { name: ez.fieldFormMapper.value, fieldType: ezrichtext } ezrepoforms.field_type.form_mapper.ezselection: class: "%ezrepoforms.field_type.form_mapper.ezselection.class%" diff --git a/doc/bc/changes-1.10.md b/doc/bc/changes-1.10.md new file mode 100644 index 000000000..22fe8b328 --- /dev/null +++ b/doc/bc/changes-1.10.md @@ -0,0 +1,14 @@ +# Backwards compatibility changes + +Changes affecting version compatibility with former or future versions. + +## Changes +- EZP-27628: Implement editing support for RichText FieldType + + What changed: `ezrepoforms.field_type.form_mapper.ezrichtext` requires `ezpublish.api.service.field_type` and `ezpublish.fieldType.ezrichtext.converter.edit.xhtml5` dependencies. + + How it might affect your code: If you are implementing a subclass, make sure you are injecting required services. + +## Deprecations + +## Removed features diff --git a/lib/FieldType/DataTransformer/RichTextValueTransformer.php b/lib/FieldType/DataTransformer/RichTextValueTransformer.php new file mode 100644 index 000000000..26ad20010 --- /dev/null +++ b/lib/FieldType/DataTransformer/RichTextValueTransformer.php @@ -0,0 +1,63 @@ +fieldType = $fieldType; + $this->docbookToXhtml5EditConverter = $docbookToXhtml5EditConverter; + } + + /** + * @param mixed $value + * + * @return string + */ + public function transform($value) + { + if (!$value instanceof Value) { + return ''; + } + + return $this->docbookToXhtml5EditConverter->convert($value->xml)->saveXML(); + } + + /** + * @param mixed $value + * + * @return Value|null + */ + public function reverseTransform($value) + { + if ($value === null || empty($value)) { + return $this->fieldType->getEmptyValue(); + } + + return $this->fieldType->fromHash(['xml' => $value]); + } +} diff --git a/lib/FieldType/Mapper/RichTextFormMapper.php b/lib/FieldType/Mapper/RichTextFormMapper.php index 955777ccf..e9f5b93c0 100644 --- a/lib/FieldType/Mapper/RichTextFormMapper.php +++ b/lib/FieldType/Mapper/RichTextFormMapper.php @@ -8,15 +8,49 @@ */ namespace EzSystems\RepositoryForms\FieldType\Mapper; -use EzSystems\RepositoryForms\Data\FieldDefinitionData; -use EzSystems\RepositoryForms\FieldType\FieldDefinitionFormMapperInterface; +use eZ\Publish\API\Repository\FieldTypeService; +use eZ\Publish\Core\FieldType\RichText\Converter; +use EzSystems\RepositoryForms\Data\Content\FieldData; +use EzSystems\RepositoryForms\FieldType\DataTransformer\RichTextValueTransformer; +use EzSystems\RepositoryForms\FieldType\FieldValueFormMapperInterface; +use Symfony\Component\Form\Extension\Core\Type\TextareaType; use Symfony\Component\Form\FormInterface; use Symfony\Component\OptionsResolver\OptionsResolver; -class RichTextFormMapper implements FieldDefinitionFormMapperInterface +class RichTextFormMapper implements FieldValueFormMapperInterface { - public function mapFieldDefinitionForm(FormInterface $fieldDefinitionForm, FieldDefinitionData $data) + /** + * @var FieldTypeService + */ + private $fieldTypeService; + + /** + * @var \eZ\Publish\Core\FieldType\RichText\Converter + */ + private $docbookToXhtml5EditConverter; + + public function __construct(FieldTypeService $fieldTypeService, Converter $docbookToXhtml5EditConverter) { + $this->fieldTypeService = $fieldTypeService; + $this->docbookToXhtml5EditConverter = $docbookToXhtml5EditConverter; + } + + public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) + { + $fieldDefinition = $data->fieldDefinition; + $formConfig = $fieldForm->getConfig(); + + $fieldForm + ->add( + $formConfig->getFormFactory()->createBuilder() + ->create('value', TextareaType::class, [ + 'required' => $fieldDefinition->isRequired, + 'label' => $fieldDefinition->getName($formConfig->getOption('languageCode')), + ]) + ->addModelTransformer(new RichTextValueTransformer($this->fieldTypeService->getFieldType($fieldDefinition->fieldTypeIdentifier), $this->docbookToXhtml5EditConverter)) + ->setAutoInitialize(false) + ->getForm() + ); } /**