SonataFormatterBundle icon indicating copy to clipboard operation
SonataFormatterBundle copied to clipboard

[Branch 5.x] FormatterListener not called when using FormatterType

Open shiroko opened this issue 1 year ago • 0 comments

Environment

PHP 8.1.9 Symfony 5.4.11

Sonata packages

show

$ composer show --latest 'sonata-project/*'
Direct dependencies:
sonata-project/admin-bundle              4.16.0 4.18.0 The missing Symfony Admin Generator
sonata-project/block-bundle              4.16.1 4.16.2 Symfony SonataBlockBundle
sonata-project/classification-bundle     4.3.0  4.3.0  Symfony SonataClassificationBundle
sonata-project/doctrine-orm-admin-bundle 4.4.0  4.6.0  Integrate Doctrine ORM into the SonataAdminBundle
sonata-project/entity-audit-bundle       1.8.0  1.8.0  Audit for Doctrine Entities
sonata-project/formatter-bundle          5.0.0  5.0.0  Symfony SonataFormatterBundle
sonata-project/media-bundle              4.5.0  4.5.0  Symfony SonataMediaBundle
sonata-project/seo-bundle                3.2.0  3.2.0  Symfony SonataSeoBundle
sonata-project/user-bundle               5.3.2  5.3.3  Symfony SonataUserBundle

Transitive dependencies:
sonata-project/cache                     2.2.0  2.2.0  Cache library
Package sonata-project/cache is abandoned, you should avoid using it. No replacement was suggested.
sonata-project/doctrine-extensions       1.17.0 2.0.1  Doctrine2 behavioral extensions
sonata-project/exporter                  3.0.0  3.0.0  Lightweight Exporter library
sonata-project/form-extensions           1.18.0 1.18.0 Symfony form extensions
sonata-project/twig-extensions           1.12.0 2.0.0  Sonata twig extensions

Symfony packages

show

$ composer show --latest 'symfony/*'
Direct dependencies:
symfony/asset                      v5.4.7  v6.1.0  Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files
symfony/browser-kit                v5.4.11 v6.1.3  Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically
symfony/console                    v5.4.11 v6.1.3  Eases the creation of beautiful and testable command line interfaces
symfony/css-selector               v5.4.11 v6.1.3  Converts CSS selectors to XPath expressions
symfony/debug-bundle               v5.4.11 v6.1.3  Provides a tight integration of the Symfony VarDumper component and the ServerLogCommand from MonologBridge into the Symfony full-stack ...
symfony/dotenv                     v5.4.5  v6.1.0  Registers environment variables from a .env file
symfony/expression-language        v5.4.11 v6.1.3  Provides an engine that can compile and evaluate expressions
symfony/flex                       v1.19.2 v2.2.3  Composer plugin for Symfony
symfony/form                       v5.4.11 v6.1.3  Allows to easily create, process and reuse HTML forms
symfony/framework-bundle           v5.4.11 v6.1.3  Provides a tight integration between Symfony components and the Symfony full-stack framework
symfony/http-client                v5.4.11 v6.1.3  Provides powerful methods to fetch HTTP resources synchronously or asynchronously
symfony/intl                       v5.4.11 v6.1.0  Provides a PHP replacement layer for the C intl extension that includes additional data from the ICU library
symfony/mailer                     v5.4.11 v6.1.3  Helps sending emails
symfony/maker-bundle               v1.45.0 v1.45.0 Symfony Maker helps you create empty commands, controllers, form classes, tests and more so you can forget about writing boilerplate code.
symfony/messenger                  v5.4.11 v6.1.3  Helps applications send and receive messages to/from other applications or via message queues
symfony/monolog-bundle             v3.8.0  v3.8.0  Symfony MonologBundle
symfony/phpunit-bridge             v6.1.3  v6.1.3  Provides utilities for PHPUnit, especially user deprecation notices management
symfony/process                    v5.4.11 v6.1.3  Executes commands in sub-processes
symfony/property-access            v5.4.11 v6.1.3  Provides functions to read and write from/to an object or array using a simple string notation
symfony/property-info              v5.4.11 v6.1.3  Extracts information about PHP class' properties using metadata of popular sources
symfony/proxy-manager-bridge       v5.4.6  v6.1.0  Provides integration for ProxyManager with various Symfony components
symfony/runtime                    v5.4.11 v6.1.3  Enables decoupling PHP applications from global state
symfony/security-bundle            v5.4.11 v6.1.3  Provides a tight integration of the Security component into the Symfony full-stack framework
symfony/sendgrid-mailer            v5.4.7  v6.1.0  Symfony Sendgrid Mailer Bridge
symfony/serializer                 v5.4.11 v6.1.3  Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.
symfony/stopwatch                  v5.4.5  v6.1.0  Provides a way to profile code
symfony/translation                v5.4.11 v6.1.3  Provides tools to internationalize your application
symfony/twig-bundle                v5.4.8  v6.1.1  Provides a tight integration of Twig into the Symfony full-stack framework
symfony/uid                        v5.4.11 v6.1.3  Provides an object-oriented API to generate and represent UIDs
symfony/validator                  v5.4.11 v6.1.3  Provides tools to validate values
symfony/var-dumper                 v5.4.11 v6.1.3  Provides mechanisms for walking through any arbitrary PHP variable
symfony/web-link                   v5.4.3  v6.1.0  Manages links between resources
symfony/web-profiler-bundle        v5.4.10 v6.1.2  Provides a development tool that gives detailed information about the execution of any request
symfony/webpack-encore-bundle      v1.15.1 v1.15.1 Integration with your Symfony app & Webpack Encore!
symfony/yaml                       v5.4.11 v6.1.3  Loads and dumps YAML files

Transitive dependencies:
symfony/amqp-messenger             v5.4.11 v5.4.11 Symfony AMQP extension Messenger Bridge
symfony/cache                      v5.4.11 v6.1.3  Provides an extended PSR-6, PSR-16 (and tags) implementation
symfony/cache-contracts            v2.5.2  v3.1.1  Generic abstractions related to caching
symfony/config                     v5.4.11 v6.1.3  Helps you find, load, combine, autofill and validate configuration values of any kind
symfony/dependency-injection       v5.4.11 v6.1.3  Allows you to standardize and centralize the way objects are constructed in your application
symfony/deprecation-contracts      v3.1.1  v3.1.1  A generic function and convention to trigger deprecation notices
symfony/doctrine-bridge            v5.4.11 v6.1.3  Provides integration for Doctrine with various Symfony components
symfony/doctrine-messenger         v5.4.11 v6.1.3  Symfony Doctrine Messenger Bridge
symfony/dom-crawler                v5.4.11 v6.1.3  Eases DOM navigation for HTML and XML documents
symfony/error-handler              v5.4.11 v6.1.3  Provides tools to manage errors and ease debugging PHP code
symfony/event-dispatcher           v5.4.9  v6.1.0  Provides tools that allow your application components to communicate with each other by dispatching events and listening to them
symfony/event-dispatcher-contracts v3.1.1  v3.1.1  Generic abstractions related to dispatching event
symfony/filesystem                 v5.4.11 v6.1.3  Provides basic utilities for the filesystem
symfony/finder                     v5.4.11 v6.1.3  Finds files and directories via an intuitive fluent interface
symfony/http-client-contracts      v2.5.2  v3.1.1  Generic abstractions related to HTTP clients
symfony/http-foundation            v5.4.11 v6.1.3  Defines an object-oriented layer for the HTTP specification
symfony/http-kernel                v5.4.11 v6.1.3  Provides a structured process for converting a Request into a Response
symfony/mime                       v5.4.11 v6.1.3  Allows manipulating MIME messages
symfony/monolog-bridge             v5.4.10 v6.1.2  Provides integration for Monolog with various Symfony components
symfony/options-resolver           v5.4.11 v6.1.0  Provides an improved replacement for the array_replace PHP function
symfony/password-hasher            v5.4.11 v6.1.3  Provides password hashing utilities
symfony/polyfill-intl-grapheme     v1.26.0 v1.26.0 Symfony polyfill for intl's grapheme_* functions
symfony/polyfill-intl-icu          v1.26.0 v1.26.0 Symfony polyfill for intl's ICU-related data and classes
symfony/polyfill-intl-idn          v1.26.0 v1.26.0 Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions
symfony/polyfill-intl-normalizer   v1.26.0 v1.26.0 Symfony polyfill for intl's Normalizer class and related functions
symfony/polyfill-mbstring          v1.26.0 v1.26.0 Symfony polyfill for the Mbstring extension
symfony/polyfill-php72             v1.26.0 v1.26.0 Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions
symfony/polyfill-php73             v1.26.0 v1.26.0 Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions
symfony/polyfill-php80             v1.26.0 v1.26.0 Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions
symfony/polyfill-php81             v1.26.0 v1.26.0 Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions
symfony/polyfill-uuid              v1.26.0 v1.26.0 Symfony polyfill for uuid functions
symfony/redis-messenger            v5.4.6  v6.1.3  Symfony Redis extension Messenger Bridge
symfony/routing                    v5.4.11 v6.1.3  Maps an HTTP request to a set of configuration variables
symfony/security-acl               v3.3.1  v3.3.1  Symfony Security Component - ACL (Access Control List)
symfony/security-core              v5.4.11 v6.1.3  Symfony Security Component - Core Library
symfony/security-csrf              v5.4.11 v6.1.0  Symfony Security Component - CSRF Library
symfony/security-guard             v5.4.9  v5.4.9  Symfony Security Component - Guard
symfony/security-http              v5.4.11 v6.1.3  Symfony Security Component - HTTP Integration
symfony/service-contracts          v2.5.2  v3.1.1  Generic abstractions related to writing services
symfony/string                     v5.4.11 v6.1.3  Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way
symfony/translation-contracts      v2.5.2  v3.1.1  Generic abstractions related to translation
symfony/twig-bridge                v5.4.11 v6.1.3  Provides integration for Twig with various Symfony components
symfony/var-exporter               v5.4.10 v6.1.3  Allows exporting any serializable PHP data structure to plain PHP code

PHP version

$ php -v
PHP 8.1.9 (cli) (built: Aug  4 2022 21:09:01) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.9, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.9, Copyright (c), by Zend Technologies
    with Xdebug v3.1.5, Copyright (c) 2002-2022, by Derick Rethans

Subject

When a FormatterType widget is used, the transformed content (target_field) is not set because FormatterListener is not called when the form is submitted.

configureFormFields() as follows:

                ->add('content', FormatterType::class, [
                    'label' => 'content',
                    'required' => true,
                    'format_field' => 'contentFormatter',
                    'format_field_options' => [
                        'choices' => [
                            'Rich HTML' => 'richhtml',
                            'Raw HTML' => 'rawhtml',
                        ],
                        'empty_data' => 'richhtml',
                    ],
                    'source_field' => 'rawContent',
                    'ckeditor_context' => 'news',
                    'ckeditor_image_format' => 'reference',
                    'target_field' => 'content',
                    'listener' => true,
                ])

form as follows: formatter-form

A FormatterListener is registered for the "content" form's form.submit listeners. The "content" form is set with inherit_data: true, so the "content" form's submit process does not call the FormEvent::SUBMIT event.

Prior to 5.x, FormatListener was called by the 'event_dispatcher' option, but in 5.x the 'event_dispatcher' option has been removed.

Minimal repository with the bug

https://github.com/sonata-project/SonataFormatterBundle/tree/7ee53e723c3c4c3c576d771954a18920127307f6

Steps to reproduce

Install the Sonata stack with the version I use Install Ckeditor Configure a Sonata Admin with a Ckeditor field Edit the Ckeditor field on Admin create page Submit the form ( by clicking the btn_create_and_edit_again button )

Expected results

transformed content (target_field) is set and created successfully.

Actual results

transformed content (target_field) is not set and NotBlank form error occurs.

shiroko avatar Aug 22 '22 10:08 shiroko