$driverConfig) { $shortName = $shortName ?: $driverConfig['shortName'] ?? ''; $this->registerDriverClass($driverConfig['class'] ?? '', $shortName, $driverConfig['label'] ?? '', $driverConfig['flexFormDS'] ?? ''); } } /** * Registers a driver class with an optional short name. * * @param string $className * @param string|null $shortName * @param string $label * @param string $flexFormDataStructurePathAndFilename * @return bool TRUE if registering succeeded * @throws \InvalidArgumentException */ public function registerDriverClass($className, $shortName = null, $label = null, $flexFormDataStructurePathAndFilename = null) { // todo: Default of $shortName must be empty string, not null. $shortName = (string)$shortName; // check if the class is available for TYPO3 before registering the driver if (!class_exists($className)) { throw new \InvalidArgumentException('Class ' . $className . ' does not exist.', 1314979197); } if (!in_array(DriverInterface::class, class_implements($className) ?: [], true)) { throw new \InvalidArgumentException('Driver ' . $className . ' needs to implement the DriverInterface.', 1387619575); } if ($shortName === '') { $shortName = $className; } if (array_key_exists($shortName, $this->drivers)) { // Return immediately without changing configuration if ($this->drivers[$shortName] === $className) { return true; } throw new \InvalidArgumentException('Driver ' . $shortName . ' is already registered.', 1314979451); } $this->drivers[$shortName] = $className; $this->driverConfigurations[$shortName] = [ 'class' => $className, 'shortName' => $shortName, 'label' => $label, 'flexFormDS' => $flexFormDataStructurePathAndFilename, ]; return true; } /** * Adds the TCA information so the registered drivers can be selected when creating a sys_file_storage * in the TYPO3 Backend. */ public function addDriversToTCA(): void { $driverFieldConfig = &$GLOBALS['TCA']['sys_file_storage']['columns']['driver']['config']; $types = &$GLOBALS['TCA']['sys_file_storage']['types']; foreach ($this->driverConfigurations as $driver) { $label = $driver['label'] ?: $driver['class']; $driverId = $driver['shortName']; $driverFieldConfig['items'][$driverId] = ['label' => $label, 'value' => $driverId]; $types[$driverId] = $types['0']; if ($driver['flexFormDS']) { $types[$driverId]['columnsOverrides']['configuration']['config']['ds'] = $driver['flexFormDS']; } } } /** * Returns a class name for a given class name or short name. * * @param string $shortName * @return string The class name * @throws \InvalidArgumentException */ public function getDriverClass($shortName) { if (in_array($shortName, $this->drivers) && class_exists($shortName)) { return $shortName; } if (!array_key_exists($shortName, $this->drivers)) { throw new \InvalidArgumentException( 'Desired storage "' . $shortName . '" is not in the list of available storages.', 1314085990 ); } return $this->drivers[$shortName]; } /** * Checks if the given driver exists * * @param string $shortName Name of the driver * @return bool TRUE if the driver exists, FALSE otherwise */ public function driverExists($shortName) { return array_key_exists($shortName, $this->drivers); } }