From e8a773d41b232f457eafc9afcfd975aad21dea3e Mon Sep 17 00:00:00 2001 From: Torsten Oppermann <torsten@sgalinski.de> Date: Thu, 16 Nov 2017 16:47:45 +0100 Subject: [PATCH] [TASK] Started work on file upload --- Classes/Controller/JoblistController.php | 81 ++++++++++++++++++- .../Private/Templates/Joblist/ApplyForm.html | 4 +- ext_localconf.php | 2 +- 3 files changed, 82 insertions(+), 5 deletions(-) diff --git a/Classes/Controller/JoblistController.php b/Classes/Controller/JoblistController.php index 9439b740..4dd7dd23 100644 --- a/Classes/Controller/JoblistController.php +++ b/Classes/Controller/JoblistController.php @@ -28,10 +28,11 @@ namespace SGalinski\SgJobs\Controller; use SGalinski\SgJobs\Service\BackendService; use SGalinski\SgMail\Service\MailTemplateService; -use TYPO3\CMS\Core\Cache\Exception\NoSuchCacheException; use TYPO3\CMS\Core\Exception; +use TYPO3\CMS\Core\Resource\ResourceFactory; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Mvc\Controller\ActionController; +use TYPO3\CMS\Core\Utility\File\ExtendedFileUtility; /** * The joblist plugin controller @@ -80,8 +81,17 @@ class JoblistController extends ActionController { /** * @param array $applyData * @return void + * @throws \TYPO3\CMS\Core\Resource\Exception\InsufficientFolderWritePermissionsException + * @throws \TYPO3\CMS\Core\Resource\Exception\InsufficientFolderAccessPermissionsException + * @throws \TYPO3\CMS\Core\Resource\Exception\ExistingTargetFolderException + * @throws \Exception + * @throws \InvalidArgumentException */ public function applyAction(array $applyData = []) { + $this->handleFileUpload('coverLetter'); + $this->handleFileUpload('cv'); + $this->handleFileUpload('certificates'); + // get an instance of the mail service /** @var MailTemplateService $mailService */ $mailService = $this->objectManager->get( @@ -100,7 +110,7 @@ class JoblistController extends ActionController { * @param array $applyData * @return array */ - private function getApplicationMailMarkers(array $applyData = []) { + private function getApplicationMailMarkers(array $applyData = []): array { return [ 'jobtitle' => $applyData['jobTitle'], 'salutation' => $applyData['salutation'], @@ -115,4 +125,71 @@ class JoblistController extends ActionController { 'message' => $applyData['message'] ]; } + + /** + * Registers an uploaded file for TYPO3 native upload handling. + * + * @param array &$data + * @param string $namespace + * @param string $fieldName + * @param string $targetDirectory + * @return void + */ + private function registerUploadField(array &$data, $namespace, $fieldName, $targetDirectory = '1:/_temp_/') { + if (!isset($data['upload'])) { + $data['upload'] = []; + } + $counter = count($data['upload']) + 1; + + $keys = array_keys($_FILES[$namespace]); + foreach ($keys as $key) { + $_FILES['upload_' . $counter][$key] = $_FILES[$namespace][$key][$fieldName]; + } + $data['upload'][$counter] = [ + 'data' => $counter, + 'target' => $targetDirectory, + ]; + } + + /** + * @param string $fieldName + */ + private function handleFileUpload($fieldName = '') { + $data = []; + $namespace = key($_FILES); + + $applicationId = md5(uniqid('sg', TRUE)); + + $resourceFactory = GeneralUtility::makeInstance( + ResourceFactory::class + ); + $storage = $resourceFactory->getStorageObject(1); + if (!$storage->hasFolder('/Applications/' . $applicationId . '/')) { + $storage->createFolder('/Applications/' . $applicationId . '/'); + } + + $targetFalDirectory = '1:/Applications/' . $applicationId . '/'; + + // Register every upload field from the form: + $this->registerUploadField($data, $namespace, $fieldName, $targetFalDirectory); + + // Initializing: + /** @var \TYPO3\CMS\Core\Utility\File\ExtendedFileUtility $fileProcessor */ + $fileProcessor = GeneralUtility::makeInstance( + ExtendedFileUtility::class + ); + $fileProcessor->setActionPermissions(['addFile' => TRUE]); + + // Actual upload + $fileProcessor->start($data); + $result = $fileProcessor->processData(); + + debug($result); + + // Do whatever you want with $result (array of File objects) + foreach ($result['upload'] as $files) { + /** @var \TYPO3\CMS\Core\Resource\File $file */ + $file = $files[0]; // Single element array due to the way we registered upload fields + } + } } diff --git a/Resources/Private/Templates/Joblist/ApplyForm.html b/Resources/Private/Templates/Joblist/ApplyForm.html index 11a5e399..e1e76fc0 100644 --- a/Resources/Private/Templates/Joblist/ApplyForm.html +++ b/Resources/Private/Templates/Joblist/ApplyForm.html @@ -42,11 +42,11 @@ <f:form.upload property="cv" id="apply-cv" /> <br /> <label for="apply-certificates"><f:translate key="frontend.apply.certificates" /></label> - <f:form.upload property="certificates" id="apply-certificates" /> + <input id="apply-certificates" type="file" name="tx_sgjobs_joblist[applyData][certificates]" multiple /> <br /> <label for="apply-message"><f:translate key="frontend.apply.message" /></label> <f:form.textarea property="message" id="apply-message" data="{}" class="" /> - <br /> + <br />- <f:form.submit value="{f:translate(key:'frontend.applyNow')}" /> </f:form> </f:section> diff --git a/ext_localconf.php b/ext_localconf.php index 1decd943..4c063225 100644 --- a/ext_localconf.php +++ b/ext_localconf.php @@ -10,7 +10,7 @@ ], [ // Uncacheable actions - 'Joblist' => 'apply' + 'Joblist' => 'applyForm, apply' ] ); -- GitLab