Skip to content
Snippets Groups Projects
RichTextNodeResolver.php 4.19 KiB
<?php

namespace SGalinski\Tinymce4Rte\Form\Resolver;

/*
 * This file is part of the TYPO3 CMS project.
 *
 * It is free software; you can redistribute it and/or modify it under
 * the terms of the GNU General Public License, either version 2
 * of the License, or any later version.
 *
 * For the full copyright and license information, please read the
 * LICENSE.txt file that was distributed with this source code.
 *
 * The TYPO3 project - inspiring people to share!
 */

use SGalinski\Tinymce4Rte\Form\Element\RichTextElement;
use SGalinski\Tinymce4Rte\Utility\VersionUtility;
use TYPO3\CMS\Backend\Form\NodeFactory;
use TYPO3\CMS\Backend\Form\NodeResolverInterface;
use TYPO3\CMS\Backend\Utility\BackendUtility;
use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;

/**
 * This resolver will return the RichTextElement render class of ext:rtehtmlarea if RTE is enabled for this field.
 */
class RichTextNodeResolver implements NodeResolverInterface {
	/**
	 * Global options from NodeFactory
	 *
	 * @var array
	 */
	protected $data;

	/**
	 * Default constructor receives full data array
	 *
	 * @param NodeFactory $nodeFactory
	 * @param array $data
	 */
	public function __construct(NodeFactory $nodeFactory, array $data) {
		$this->data = $data;
	}

	/**
	 * Returns RichTextElement as class name if RTE widget should be rendered.
	 *
	 * @return string|NULL New class name or void if this resolver does not change current class name.
	 */
	public function resolve() {
		$table = $this->data['tableName'];
		$fieldName = $this->data['fieldName'];
		$row = $this->data['databaseRow'];
		$parameterArray = $this->data['parameterArray'];
		$backendUser = $this->getBackendUserAuthentication();
		if (VersionUtility::isVersion870OrHigher()) {
			$parameterArray = $this->data['parameterArray'];
			$backendUser = $this->getBackendUserAuthentication();
			if (// This field is not read only
				!$parameterArray['fieldConf']['config']['readOnly']
				// If RTE is generally enabled by user settings and RTE object registry can return something valid
				&& $backendUser->isRTE()
				// If RTE is enabled for field
				&& isset($parameterArray['fieldConf']['config']['enableRichtext'])
				&& (bool) $parameterArray['fieldConf']['config']['enableRichtext'] === TRUE
				// If RTE config is found (prepared by TcaText data provider)
				&& isset($parameterArray['fieldConf']['config']['richtextConfiguration'])
				&& is_array($parameterArray['fieldConf']['config']['richtextConfiguration'])
				// If RTE is not disabled on configuration level
				&& !$parameterArray['fieldConf']['config']['richtextConfiguration']['disabled']
			) {
				return RichTextElement::class;
			}
		} else {
			if (// This field is not read only
				!$parameterArray['fieldConf']['config']['readOnly']
				// If RTE is generally enabled by user settings and RTE object registry can return something valid
				&& $backendUser->isRTE()
			) {
				// @todo: Most of this stuff is prepared by data providers within $this->data already
				$specialConfiguration = BackendUtility::getSpecConfParts($parameterArray['fieldConf']['defaultExtras']);
				// If "richtext" is within defaultExtras
				if (isset($specialConfiguration['richtext'])) {
					// Operates by reference on $row! 'pid' is changed ...
					BackendUtility::fixVersioningPid($table, $row);
					list($recordPid, $tsConfigPid) = BackendUtility::getTSCpidCached($table, $row['uid'], $row['pid']);
					// If the pid-value is not negative (that is, a pid could NOT be fetched)
					if ($tsConfigPid >= 0) {
						// Fetch page ts config and do some magic with it to find out if RTE is disabled on TS level.
						$rteSetup = $backendUser->getTSConfig('RTE', BackendUtility::getPagesTSconfig($recordPid));
						$rteTcaTypeValue = $this->data['recordTypeValue'];
						$rteSetupConfiguration = BackendUtility::RTEsetup(
							$rteSetup['properties'], $table, $fieldName, $rteTcaTypeValue
						);
						if (!$rteSetupConfiguration['disabled']) {
							// Finally, we're sure the editor should really be rendered ...
							return RichTextElement::class;
						}
					}
				}
			}
		}

		return NULL;
	}

	/**
	 * @return BackendUserAuthentication
	 */
	protected function getBackendUserAuthentication() {
		return $GLOBALS['BE_USER'];
	}
}