diff --git a/Classes/Utility/ApiUtility.php b/Classes/Utility/ApiUtility.php index 787879c..bcd7745 100644 --- a/Classes/Utility/ApiUtility.php +++ b/Classes/Utility/ApiUtility.php @@ -12,11 +12,13 @@ namespace Cjel\TemplatesAide\Utility; * ***/ +use TYPO3\CMS\Core\Resource\FileReference as CoreFileReference; +use TYPO3\CMS\Extbase\Domain\Model\FileReference as ExtbaseFileReference; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Object\ObjectManager; -use TYPO3\CMS\Extbase\Service\ImageService; -use TYPO3\CMS\Extbase\Persistence\ObjectStorage; use TYPO3\CMS\Extbase\Persistence\Generic\LazyObjectStorage; +use TYPO3\CMS\Extbase\Persistence\ObjectStorage; +use TYPO3\CMS\Extbase\Service\ImageService; /** * @@ -42,8 +44,6 @@ class ApiUtility $mapping = [], $rootRowClass = null ) { - $httpHost = GeneralUtility::getIndpEnv('HTTP_HOST'); - $requestHost = GeneralUtility::getIndpEnv('TYPO3_REQUEST_HOST'); $this->objectManager = GeneralUtility::makeInstance( ObjectManager::class ); @@ -70,7 +70,6 @@ class ApiUtility $result[] = $rowResult; continue; } - $propertieResults = []; foreach ($methods as $method) { if (substr($method, 0, 3) === 'get') { @@ -96,24 +95,14 @@ class ApiUtility $rowResult[$attributeName] = $methodResult; } } - // --- - if (array_key_exists($rowClass, $mapping)) { - foreach ($mapping[$rowClass] as $attributeName => $function) { - $rowResult[$attributeName] = $function( - $rowResult[$attributeName], - $row - ); - } - } - // --- foreach ($propertieResults as $attributeName => $methodResult) { - - + // Date Time if (gettype($methodResult) == 'object' && get_class($methodResult) == 'DateTime' ) { $rowResult[$attributeName] = $methodResult->format('c'); } + // Simple related types if (gettype($methodResult) == 'object' && get_class($methodResult) == ObjectStorage::class ) { @@ -122,25 +111,45 @@ class ApiUtility } else { $nextLevelClass = $rootRowClass; } - $rowResult[$attributeName] = self::queryResultToArray( + $imageStorage = true; + foreach ($methodResult->toArray() as $current) { + if (get_class($current) != ExtbaseFileReference::class) + { + $imageStorage = false; + } + } + $attributeResult = self::queryResultToArray( $methodResult, $additionalAttributes[$attributeName], $mapping, $nextLevelClass ); + if ($imageStorage) { + foreach ($attributeResult as &$attributeResultRow) { + if (array_key_exists( + 'originalResource', + $attributeResultRow) + ) { + $attributeResultRow + = $attributeResultRow['originalResource']; + } + } + } + $rowResult[$attributeName] = $attributeResult; } - + // Related objects if ( gettype($methodResult) == 'object' && !in_array(get_class($methodResult), [ LazyObjectStorage::class, ObjectStorage::class, + ExtbaseFileReference::class, + CoreFileReference::class, ]) && count(explode('\\', get_class($methodResult))) > 1 ) { - if ($rootRowClass == null) { $nextLevelClass = $rowClass; } else { @@ -155,54 +164,94 @@ class ApiUtility $rowResult[$attributeName . 'Uid'] = $rowResult[$attributeName]['uid']; } + // Images in object storage if (gettype($methodResult) == 'object' && get_class($methodResult) == LazyObjectStorage::class ) { $rowResult[$attributeName] = []; foreach ($methodResult as $object) { - $publicUrl = $object->getOriginalResource() - ->getPublicUrl(); - $absoluteUrl = $requestHost - . '/' - . $publicUrl; - $imagePreview = $this->imageService->getImage( - $publicUrl, - null, - 0 - ); - $processingInstructionsPreview = array( - //'width' => '1024c', - //'height' => '768c', - //'minWidth' => $minWidth, - //'minHeight' => $minHeight, - 'maxWidth' => '1024', - 'maxHeight' => '768', - //'crop' => $crop, - ); - $processedImagePreview = $this->imageService - ->applyProcessingInstructions( - $imagePreview, - $processingInstructionsPreview - ); - $publicUrlPreview = $this->imageService - ->getImageUri( - $processedImagePreview + $rowResult[$attributeName] + = $this->filereferenceToApi( + $methodResult->getOriginalResource() ); - $absoluteUrlPreview = $requestHost - . '/' - . $publicUrlPreview; - $rowResult[$attributeName][] = [ - 'uid' => $object->getUid(), - 'publicUrl' => $publicUrl, - 'absoluteUrl' => $absoluteUrl, - 'publicUrlPreview' => $publicUrlPreview, - 'absoluteUrlPreview' => $absoluteUrlPreview, - ]; } } + // Images as file refernce + if (gettype($methodResult) == 'object' + && get_class($methodResult) == ExtbaseFileReference::class + ) { + $rowResult[$attributeName] + = $this->filereferenceToApi( + $methodResult->getOriginalResource() + ); + } + // Images as core file reference + if (gettype($methodResult) == 'object' + && get_class($methodResult) == CoreFileReference::class + ) { + $rowResult[$attributeName] + = $this->filereferenceToApi($methodResult); + } + // If resut is empty set at least null so attribute is preesent + // in api + if (!isset($rowResult[$attributeName])) { + $rowResult[$attributeName] = null; + } + } + if (array_key_exists($rowClass, $mapping)) { + foreach ($mapping[$rowClass] as $attributeName => $function) { + $rowResult[$attributeName] = $function( + $rowResult[$attributeName], + $row, + $rowResult + ); + } } $result[] = $rowResult; } return $result; } + + private function filereferenceToApi($object) { + $httpHost = GeneralUtility::getIndpEnv('HTTP_HOST'); + $requestHost = GeneralUtility::getIndpEnv('TYPO3_REQUEST_HOST'); + $publicUrl = $object->getPublicUrl(); + $absoluteUrl = $requestHost + . '/' + . $publicUrl; + $imagePreview = $this->imageService->getImage( + $publicUrl, + null, + 0 + ); + $processingInstructionsPreview = array( + //'width' => '1024c', + //'height' => '768c', + //'minWidth' => $minWidth, + //'minHeight' => $minHeight, + 'maxWidth' => '1024', + 'maxHeight' => '768', + //'crop' => $crop, + ); + $processedImagePreview = $this->imageService + ->applyProcessingInstructions( + $imagePreview, + $processingInstructionsPreview + ); + $publicUrlPreview = $this->imageService + ->getImageUri( + $processedImagePreview + ); + $absoluteUrlPreview = $requestHost + . '/' + . $publicUrlPreview; + return [ + 'uid' => $object->getUid(), + 'publicUrl' => $publicUrl, + 'absoluteUrl' => $absoluteUrl, + 'publicUrlPreview' => $publicUrlPreview, + 'absoluteUrlPreview' => $absoluteUrlPreview, + ]; + } + }