diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..d37a2c50 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,52 @@ +# EditorConfig is awesome: http://EditorConfig.org + +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +charset = utf-8 +end_of_line = lf +indent_style = space +indent_size = 4 +insert_final_newline = true +trim_trailing_whitespace = true + +# TS/JS-Files +[*.{ts,js}] +indent_size = 2 + +# JSON-Files +[*.json] +indent_style = tab + +# ReST-Files +[*.rst] +indent_size = 3 +max_line_length = 80 + +# YAML-Files +[*.{yaml,yml}] +indent_size = 2 + +# package.json +# .travis.yml +[{package.json,.travis.yml}] +indent_size = 2 + +# TypoScript +[*.{typoscript,tsconfig}] +indent_size = 2 + +# XLF-Files +[*.xlf] +indent_style = tab + +# SQL-Files +[*.sql] +indent_style = tab +indent_size = 2 + +# .htaccess +[{_.htaccess,.htaccess}] +indent_style = tab diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..aef3b67b --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,178 @@ +on: + push: + branches: + - '*' + - '!master' + +name: CI + +jobs: + php-lint: + name: PHP linter + + runs-on: ubuntu-latest + + strategy: + matrix: + php-version: + - 7.2 + - 7.3 + - 7.4 + + steps: + - name: Configure PHP ${{ matrix.php-version }} + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-version }} + + - name: Checkout + uses: actions/checkout@v1 + + - name: Run PHP lint + run: | + echo "${{ matrix.exclude-pattern }}" + find *.php Classes/ Configuration/ Tests/ -name '*.php' ${{ matrix.exclude-pattern }} + find *.php Classes/ Configuration/ Tests/ -name '*.php' ${{ matrix.exclude-pattern }} -print0 | xargs -0 -n 1 -P 4 php -l + + typoscript-lint: + name: TypoScript linter + + runs-on: ubuntu-latest + + steps: + - name: Configure PHP 7.4 + uses: shivammathur/setup-php@v2 + with: + php-version: 7.4 + + - name: Checkout + uses: actions/checkout@v1 + + - name: "Cache dependencies installed with composer" + uses: actions/cache@v1 + with: + path: ~/.composer/cache + key: php${{ matrix.php-version }}-composer-${{ hashFiles('**/composer.json') }} + restore-keys: | + php${{ matrix.php-version }}-composer- + - name: Install Composer dependencies + run: composer install --no-progress + + - name: Run TypoScript lint + run: composer ci:ts:lint + + php-code-sniffer: + name: PHP Code Sniffer + + runs-on: ubuntu-latest + + steps: + - name: Configure PHP 7.4 + uses: shivammathur/setup-php@v2 + with: + php-version: 7.4 + + - name: Checkout + uses: actions/checkout@v1 + + - name: "Cache dependencies installed with composer" + uses: actions/cache@v1 + with: + path: ~/.composer/cache + key: php${{ matrix.php-version }}-composer-${{ hashFiles('**/composer.json') }} + restore-keys: | + php${{ matrix.php-version }}-composer- + - name: Install Composer dependencies + run: composer install --no-progress + + - name: Run PHP Code Sniffer + run: composer ci:php:sniff + + unit-tests: + name: Unit tests + + runs-on: ubuntu-latest + + strategy: + matrix: + composer-version: + - v1 + - v2 + typo3-version: + - "^9.5" + - "^10.4" + composer-dependencies: + - highest + - lowest + php-version: + - 7.2 + - 7.3 + - 7.4 + include: + - typo3-version: "^9.5" + database-image: mariadb:latest + - typo3-version: "^10.4" + database-image: mariadb:latest + + services: + mysql: + image: ${{ matrix.database-image }} + env: + MYSQL_ALLOW_EMPTY_PASSWORD: false + MYSQL_DATABASE: typo3 + MYSQL_ROOT_PASSWORD: password + MYSQL_USER: user + ports: + - 3306 + + steps: + - name: Configure PHP ${{ matrix.php-version }} + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-version }} + extensions: fileinfo, filter, gd, hash, intl, json, mbstring, mysqli, openssl, pcre, session, SPL, xml, zip, zlib + coverage: none + tools: composer:${{ matrix.composer-version }} + + - name: Checkout + uses: actions/checkout@v1 + + - name: "Cache dependencies installed with composer" + uses: actions/cache@v1 + with: + path: ~/.composer/cache + key: php${{ matrix.php-version }}-composer-${{ hashFiles('**/composer.json') }} + restore-keys: | + php${{ matrix.php-version }}-composer- + + - name: Install TYPO3 Core + env: + TYPO3: ${{ matrix.typo3-version }} + run: | + composer --version + composer require typo3/minimal:"${{ matrix.typo3-version }}" + composer show + + - name: Install lowest dependencies with composer + if: matrix.composer-dependencies == 'lowest' + run: | + composer update --no-ansi --no-interaction --no-progress --no-suggest --prefer-lowest + composer show + + - name: Install highest dependencies with composer + if: matrix.composer-dependencies == 'highest' + run: | + composer update --no-ansi --no-interaction --no-progress --no-suggest + composer show + + - name: Run unit tests + run: composer ci:tests:unit + + - name: Run functional tests + env: + typo3DatabaseHost: 127.0.0.1 + typo3DatabasePort: ${{ job.services.mysql.ports['3306'] }} + typo3DatabaseName: typo3 + typo3DatabaseUsername: root + typo3DatabasePassword: password + run: composer ci:tests:functional diff --git a/.gitignore b/.gitignore index a41d2a17..f0106d3b 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,5 @@ package-lock.json # PHP CS fix caches .php_cs.cache + +/var diff --git a/Build/.php_cs b/.php_cs similarity index 77% rename from Build/.php_cs rename to .php_cs index a9134a89..ff98b285 100644 --- a/Build/.php_cs +++ b/.php_cs @@ -20,7 +20,7 @@ * * And then simply run * - * $ php-cs-fixer fix --config ../Build/.php_cs + * $ ./bin/php-cs-fixer fix --config ./Build/.php_cs * * inside the TYPO3 directory. Warning: This may take up to 10 minutes. * @@ -31,10 +31,7 @@ if (PHP_SAPI !== 'cli') { die('This script supports command line usage only. Please check your command.'); } -// Define in which folders to search and which folders to exclude -// Exclude some directories that are excluded by Git anyways to speed up the sniffing -$finder = PhpCsFixer\Finder::create() - ->in(__DIR__ . '/../'); + // Return a Code Sniffing configuration using // all sniffers needed for PSR-2 // and additionally: @@ -47,41 +44,53 @@ $finder = PhpCsFixer\Finder::create() return PhpCsFixer\Config::create() ->setRiskyAllowed(true) ->setRules([ - '@PSR2' => true, '@DoctrineAnnotation' => true, - 'no_leading_import_slash' => true, - 'no_trailing_comma_in_singleline_array' => true, - 'no_singleline_whitespace_before_semicolons' => true, - 'no_unused_imports' => true, - 'concat_space' => ['spacing' => 'one'], - 'no_whitespace_in_blank_line' => true, - 'ordered_imports' => true, - 'single_quote' => true, - 'no_empty_statement' => true, - 'no_extra_consecutive_blank_lines' => true, - 'phpdoc_no_package' => true, - 'phpdoc_scalar' => true, - 'no_blank_lines_after_phpdoc' => true, + '@PSR2' => true, 'array_syntax' => ['syntax' => 'short'], - 'whitespace_after_comma_in_array' => true, + 'blank_line_after_opening_tag' => true, + 'braces' => ['allow_single_line_closure' => true], + 'cast_spaces' => ['space' => 'none'], + 'compact_nullable_typehint' => true, + 'concat_space' => ['spacing' => 'one'], + 'declare_equal_normalize' => ['space' => 'none'], + 'dir_constant' => true, 'function_typehint_space' => true, 'hash_to_slash_comment' => true, - 'no_alias_functions' => true, 'lowercase_cast' => true, - 'no_leading_namespace_whitespace' => true, + 'method_argument_space' => ['on_multiline' => 'ensure_fully_multiline'], + 'modernize_types_casting' => true, 'native_function_casing' => true, + 'new_with_braces' => true, + 'no_alias_functions' => true, + 'no_blank_lines_after_phpdoc' => true, + 'no_empty_phpdoc' => true, + 'no_empty_statement' => true, + 'no_extra_consecutive_blank_lines' => true, + 'no_leading_import_slash' => true, + 'no_leading_namespace_whitespace' => true, + 'no_null_property_initialization' => true, 'no_short_bool_cast' => true, + 'no_singleline_whitespace_before_semicolons' => true, + 'no_superfluous_elseif' => true, + 'no_trailing_comma_in_singleline_array' => true, 'no_unneeded_control_parentheses' => true, + 'no_unused_imports' => true, + 'no_useless_else' => true, + 'no_whitespace_in_blank_line' => true, + 'ordered_imports' => true, + 'php_unit_construct' => ['assertEquals', 'assertSame', 'assertNotEquals', 'assertNotSame'], + 'php_unit_mock_short_will_return' => true, + 'php_unit_test_case_static_method_calls' => ['call_type' => 'self'], + 'phpdoc_no_access' => true, 'phpdoc_no_empty_return' => true, + 'phpdoc_no_package' => true, + 'phpdoc_scalar' => true, 'phpdoc_trim' => true, - 'no_superfluous_elseif' => true, - 'no_useless_else' => true, 'phpdoc_types' => true, 'phpdoc_types_order' => ['null_adjustment' => 'always_last', 'sort_algorithm' => 'none'], 'return_type_declaration' => ['space_before' => 'none'], - 'cast_spaces' => ['space' => 'none'], - 'declare_equal_normalize' => ['space' => 'single'], - 'dir_constant' => true, - 'phpdoc_no_access' => true + 'single_quote' => true, + 'single_trait_insert_per_statement' => true, + 'whitespace_after_comma_in_array' => true, ]) - ->setFinder($finder); \ No newline at end of file + ->setFinder(PhpCsFixer\Finder::create()->in(__DIR__)); diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 37b6913c..00000000 --- a/.travis.yml +++ /dev/null @@ -1,41 +0,0 @@ -language: php - -php: - - 7.3 - -sudo: false - -addons: - apt: - packages: - - parallel - -env: - - NODE_VERSION="6.0" - -cache: - directories: - - $HOME/.composer/cache - -before_install: - - phpenv config-rm xdebug.ini - - nvm install $NODE_VERSION - - composer self-update - - composer --version - - composer install - - npm install - -script: - # Run full test suite and linting of the code base -# - > -# echo; -# echo "Building assets"; -# npm run build:suite -# - > -# echo; -# echo "Running unit tests"; -# .Build/bin/phpunit --colors -c .Build/vendor/nimut/testing-framework/res/Configuration/UnitTests.xml Tests/Unit - - > - echo; - echo "Running PHP Coding Standards Fixer checks"; - .Build/bin/php-cs-fixer fix --config=Build/.php_cs -v --dry-run --using-cache=no --path-mode=intersection `git diff --name-only --diff-filter=ACMRTUXB $COMMIT_RANGE` \ No newline at end of file diff --git a/Classes/Backend/Controller/ContentElement/NewContentElementController.php b/Classes/Backend/Controller/ContentElement/NewContentElementController.php index e1e40f4b..0c22e672 100644 --- a/Classes/Backend/Controller/ContentElement/NewContentElementController.php +++ b/Classes/Backend/Controller/ContentElement/NewContentElementController.php @@ -1,5 +1,6 @@ rteConfiguration['externalPlugins'] = []; } - if (ExtensionManagerConfigurationService::getSettings()['enablePlaceholders']) { + if (ConfigurationUtility::getExtensionConfiguration()['enablePlaceholders']) { $this->rteConfiguration['externalPlugins']['confighelper'] = [ 'resource' => 'EXT:frontend_editing/Resources/Public/JavaScript/Plugins/confighelper/plugin.js' ]; diff --git a/Classes/Controller/ReceiverController.php b/Classes/Controller/ReceiverController.php index fe39f137..9cdaf701 100644 --- a/Classes/Controller/ReceiverController.php +++ b/Classes/Controller/ReceiverController.php @@ -1,5 +1,6 @@ getParsedBody()['data'], $data); - $this->newAction($data['edit'], $data['defVals'], (int) $request->getQueryParams()['page']); + $this->newAction($data['edit'], $data['defVals'], (int)$request->getQueryParams()['page']); break; case 'hide': $this->hideAction( @@ -233,7 +234,7 @@ protected function newAction(array $edit, array $defVals, int $pid) ); } - if ((int) array_keys($edit[$table])[0] < 0) { + if ((int)array_keys($edit[$table])[0] < 0) { $defVals[$table]['pid'] = array_keys($edit[$table])[0]; } else { $defVals[$table]['pid'] = $pid; diff --git a/Classes/EditingPanel/FrontendEditingDropzoneModifier.php b/Classes/EditingPanel/FrontendEditingDropzoneModifier.php index 2f8fcc2f..8ef05f56 100644 --- a/Classes/EditingPanel/FrontendEditingDropzoneModifier.php +++ b/Classes/EditingPanel/FrontendEditingDropzoneModifier.php @@ -1,5 +1,6 @@ getBeSessionKey()) . '); window.F.setTranslationLabels(' . json_encode($this->getLocalizedFrontendLabels()) . '); window.F.setDisableModalOnNewCe(' . - (int)ExtensionManagerConfigurationService::getSettings()['enablePlaceholders'] . + (int)ConfigurationUtility::getExtensionConfiguration()['enablePlaceholders'] . '); window.FrontendEditingMode = true; window.TYPO3.settings = { @@ -385,7 +386,7 @@ protected function loadJavascriptResources() GeneralUtility::getFileAbsFileName( 'EXT:rte_ckeditor/Resources/Public/JavaScript/Contrib/' ) - )) .';', + )) . ';', true, true ); diff --git a/Classes/Middleware/BackendUserRedirectToFrontend.php b/Classes/Middleware/BackendUserRedirectToFrontend.php index aa771697..890b2ac5 100644 --- a/Classes/Middleware/BackendUserRedirectToFrontend.php +++ b/Classes/Middleware/BackendUserRedirectToFrontend.php @@ -1,4 +1,5 @@ getTSConfig()['frontend_editing.']['disallow_backend_access'] ?? false); + return (bool)($user->getTSConfig()['frontend_editing.']['disallow_backend_access'] ?? false); } /** diff --git a/Classes/Middleware/FrontendEditingAspect.php b/Classes/Middleware/FrontendEditingAspect.php index c07289e2..0f9df370 100644 --- a/Classes/Middleware/FrontendEditingAspect.php +++ b/Classes/Middleware/FrontendEditingAspect.php @@ -1,5 +1,6 @@ nodeValue); } - $doc = new \DOMDOcument; + $doc = new \DOMDOcument(); $doc->loadxml($record['pi_flexform']); $replacement = $doc->createDocumentFragment(); diff --git a/Classes/RequestPreProcess/RequestPreProcessInterface.php b/Classes/RequestPreProcess/RequestPreProcessInterface.php index edd12fd0..2486fd0c 100644 --- a/Classes/RequestPreProcess/RequestPreProcessInterface.php +++ b/Classes/RequestPreProcess/RequestPreProcessInterface.php @@ -1,5 +1,6 @@ extensionManagerConfigurationService = - GeneralUtility::makeInstance(ExtensionManagerConfigurationService::class); $this->contentEditableWrapperTagName = self::DEFAULT_WRAPPER_TAG_NAME; - $tagName = $this->extensionManagerConfigurationService->getSettings()['contentEditableWrapperTagName']; + $tagName = ConfigurationUtility::getExtensionConfiguration()['contentEditableWrapperTagName']; if ($tagName) { $this->contentEditableWrapperTagName = $tagName; } diff --git a/Classes/Service/ExtensionManagerConfigurationService.php b/Classes/Service/ExtensionManagerConfigurationService.php deleted file mode 100644 index 2e7c2e6f..00000000 --- a/Classes/Service/ExtensionManagerConfigurationService.php +++ /dev/null @@ -1,47 +0,0 @@ -get('frontend_editing'); - - if (!is_array($settings)) { - $settings = []; - } - - return $settings; - } -} diff --git a/Classes/UserFunc/HtmlParserUserFunc.php b/Classes/UserFunc/HtmlParserUserFunc.php index 8dc66baf..3777d71d 100644 --- a/Classes/UserFunc/HtmlParserUserFunc.php +++ b/Classes/UserFunc/HtmlParserUserFunc.php @@ -1,5 +1,6 @@ get('frontend_editing'); + + if (is_array($configuration)) { + return $configuration; + } + + return []; + } +} diff --git a/Classes/Utility/FrontendEditingUtility.php b/Classes/Utility/FrontendEditingUtility.php index 1e76de13..28e9e762 100644 --- a/Classes/Utility/FrontendEditingUtility.php +++ b/Classes/Utility/FrontendEditingUtility.php @@ -1,5 +1,6 @@ [ diff --git a/Configuration/TCA/Overrides/sys_template.php b/Configuration/TCA/Overrides/sys_template.php index 3a43290e..39d5a284 100644 --- a/Configuration/TCA/Overrides/sys_template.php +++ b/Configuration/TCA/Overrides/sys_template.php @@ -1,4 +1,5 @@ - -[global] - -[backend.user.isLoggedIn] - - config.tx_frontendediting { - # These transformations are applied to the page being edited to ensure features work as expected and inceptions - # are avoided. - pageContentPreProcessing { - parseFunc { - tags { - form = TEXT - form { - current = 1 - - # Add frontend_editing=true if this is a GET form (rather than POST) - innerWrap = | - innerWrap.if { - value.data = parameters : method - value.case = lower - equals = get - } - - dataWrap =
- } - } - } - - HTMLparser = 1 - HTMLparser { - keepNonMatchedTags = 1 - - tags { - a.fixAttrib { - href.userFunc = TYPO3\CMS\FrontendEditing\UserFunc\HtmlParserUserFunc->removeFrontendEditingInUrl - - target.list = _self - } - - form.fixAttrib { - action.userFunc = TYPO3\CMS\FrontendEditing\UserFunc\HtmlParserUserFunc->addFrontendEditingInUrl - - target.list = _self - } - } - } - } - } - -[global] \ No newline at end of file diff --git a/Configuration/TypoScript/setup.typoscript b/Configuration/TypoScript/setup.typoscript new file mode 100644 index 00000000..caecb4ce --- /dev/null +++ b/Configuration/TypoScript/setup.typoscript @@ -0,0 +1,94 @@ +[backend.user.isLoggedIn] + + lib.fluidContent { + stdWrap { + editIcons = tt_content:header + } + } + + lib.contentElement.stdWrap < lib.fluidContent.stdWrap + + tt_content.bullets.stdWrap < lib.fluidContent.stdWrap + tt_content.div.stdWrap < lib.fluidContent.stdWrap + tt_content.header.stdWrap < lib.fluidContent.stdWrap + tt_content.html.stdWrap < lib.fluidContent.stdWrap + tt_content.image.stdWrap < lib.fluidContent.stdWrap + tt_content.list.stdWrap < lib.fluidContent.stdWrap + tt_content.menu_abstract.stdWrap < lib.fluidContent.stdWrap + tt_content.menu_categorized_pages.stdWrap < lib.fluidContent.stdWrap + tt_content.menu_pages.stdWrap < lib.fluidContent.stdWrap + tt_content.menu_recently_updated.stdWrap < lib.fluidContent.stdWrap + tt_content.menu_related_pages.stdWrap < lib.fluidContent.stdWrap + tt_content.menu_section.stdWrap < lib.fluidContent.stdWrap + tt_content.menu_section_pages.stdWrap < lib.fluidContent.stdWrap + tt_content.menu_sitemap.stdWrap < lib.fluidContent.stdWrap + tt_content.menu_sitemap_pages.stdWrap < lib.fluidContent.stdWrap + tt_content.menu_subpages.stdWrap < lib.fluidContent.stdWrap + tt_content.shortcut.stdWrap < lib.fluidContent.stdWrap + tt_content.table.stdWrap < lib.fluidContent.stdWrap + tt_content.text.stdWrap < lib.fluidContent.stdWrap + tt_content.textmedia.stdWrap < lib.fluidContent.stdWrap + tt_content.textpic.stdWrap < lib.fluidContent.stdWrap + tt_content.uploads.stdWrap < lib.fluidContent.stdWrap + tt_content.mailform.stdWrap < lib.fluidContent.stdWrap + + config.tx_extbase { + objects { + TYPO3\CMS\Extbase\Mvc\View\NotFoundView.className = TYPO3\CMS\FrontendEditing\Mvc\View\NotFoundView + } + } + + # Prevent links from being parsed to FE url + lib.parseFunc_RTE.tags.a > + +[global] + +[backend.user.isLoggedIn] + + config.tx_frontendediting { + # These transformations are applied to the page being edited to ensure features work as expected and inceptions + # are avoided. + pageContentPreProcessing { + parseFunc { + tags { + form = TEXT + form { + current = 1 + + # Add frontend_editing=true if this is a GET form (rather than POST) + innerWrap = | + innerWrap.if { + value { + data = parameters : method + case = lower + } + equals = get + } + + dataWrap = + } + } + } + + HTMLparser = 1 + HTMLparser { + keepNonMatchedTags = 1 + + tags { + a.fixAttrib { + href.userFunc = TYPO3\CMS\FrontendEditing\UserFunc\HtmlParserUserFunc->removeFrontendEditingInUrl + + target.list = _self + } + + form.fixAttrib { + action.userFunc = TYPO3\CMS\FrontendEditing\UserFunc\HtmlParserUserFunc->addFrontendEditingInUrl + + target.list = _self + } + } + } + } + } + +[global] diff --git a/Tests/Unit/EditingPanel/FrontendEditingPanelTest.php b/Tests/Unit/EditingPanel/FrontendEditingPanelTest.php index 0ff7f6d7..66b395df 100644 --- a/Tests/Unit/EditingPanel/FrontendEditingPanelTest.php +++ b/Tests/Unit/EditingPanel/FrontendEditingPanelTest.php @@ -1,5 +1,6 @@ createMock(AccessService::class); + + $accessServiceMock->method('isEnabled')->willReturn(true); + $this->templateServiceMock = $this->getMockBuilder(TemplateService::class) ->setMethods(['getFileName', 'linkData'])->getMock(); @@ -71,6 +81,7 @@ protected function setUp() $this->frontendControllerMock->page = []; $this->frontendControllerMock->sys_page = $pageRepositoryMock; $GLOBALS['TSFE'] = $this->frontendControllerMock; + } /** @@ -80,36 +91,48 @@ protected function setUp() */ public function editIconsDataProvider() { - $GLOBALS['LANG'] = GeneralUtility::makeInstance(LanguageService::class); + $languageServiceMock = $this->createMock(LanguageService::class); + + $languageServiceMock + ->method('sL') + ->willReturnArgument(0); - $router = GeneralUtility::makeInstance(Router::class); + $GLOBALS['LANG'] = $languageServiceMock; + + $router = new Router(); $router->addRoute('record_edit', new Route('record_edit', [])); + GeneralUtility::setSingletonInstance(Router::class, $router); + + $iconMock = $this->createMock(Icon::class); + + $iconMock->method('render')->willReturn('zzz'); + + $iconFactoryMock = $this->getMockBuilder(IconFactory::class) + ->disableOriginalConstructor()->getMock() + ; + + $iconFactoryMock + ->method('getIcon') + ->willReturn($iconMock); + + GeneralUtility::addInstance(IconFactory::class, $iconFactoryMock); + + $extensionConfigurationMock = $this->createMock(ExtensionConfiguration::class); + + $extensionConfigurationMock + ->method('get') + ->willReturn(['contentEditableWrapperTagName' => 'div']); + + GeneralUtility::addInstance(ExtensionConfiguration::class, $extensionConfigurationMock); $contentEditableWrapperService = new ContentEditableWrapperService(); $content = $this->getUniqueId('content'); + return [ 'standard case call edit icons for tt_content:bodytext' => [ - $contentEditableWrapperService->wrapContentWithDropzone( - 'tt_content', - 1, - $contentEditableWrapperService->wrapContent( - 'tt_content', - 1, - [], - $content - ) - ), - $contentEditableWrapperService->wrapContentWithDropzone( - 'tt_content', - 1, - $contentEditableWrapperService->wrapContent( - 'tt_content', - 1, - [], - $content - ) - ), + '', + '', 'tt_content:bodytext', ['beforeLastTag' => '1', 'allow' => 'edit'], 'tt_content:1', @@ -122,28 +145,8 @@ public function editIconsDataProvider() 1 ], 'another case with fe_users:email' => [ - $contentEditableWrapperService->wrapContentWithDropzone( - 'fe_users', - 12, - $contentEditableWrapperService->wrapContent( - 'fe_users', - 12, - [], - '