diff --git a/Classes/Controller/Ajax/JoblistController.php b/Classes/Controller/Ajax/JoblistController.php index 320a8ee205cebfa4da721af2a984d006734be1d5..9c58a0535bac2ece19659d2200e1d14c27b66865 100644 --- a/Classes/Controller/Ajax/JoblistController.php +++ b/Classes/Controller/Ajax/JoblistController.php @@ -47,7 +47,6 @@ class JoblistController extends AbstractAjaxController { * Show all job offers and options to manage them * * @return void - * @throws \TYPO3\CMS\Extbase\Persistence\Exception\InvalidQueryException * @throws \InvalidArgumentException */ public function filterAction() { diff --git a/Classes/Controller/JoblistController.php b/Classes/Controller/JoblistController.php index 0165a4d0c8f03013b1812f12bd74cde2d614f388..b9d7a550dacf917b59b7cb209464300bf9e14794 100644 --- a/Classes/Controller/JoblistController.php +++ b/Classes/Controller/JoblistController.php @@ -28,7 +28,6 @@ namespace SGalinski\SgJobs\Controller; use SGalinski\SgJobs\Domain\Model\JobApplication; use SGalinski\SgMail\Service\MailTemplateService; -use TYPO3\CMS\Core\Exception; use TYPO3\CMS\Core\Resource\DuplicationBehavior; use TYPO3\CMS\Core\Resource\ResourceFactory; use TYPO3\CMS\Core\Utility\File\ExtendedFileUtility; @@ -41,12 +40,6 @@ use TYPO3\CMS\Extbase\Object\ObjectManager; * The joblist plugin controller */ class JoblistController extends ActionController { - /** - * @var \TYPO3\CMS\Extbase\Object\ObjectManager - * @inject - */ - protected $objectManager; - /** * @var \SGalinski\SgJobs\Domain\Repository\CompanyRepository * @inject @@ -67,7 +60,7 @@ class JoblistController extends ActionController { * @throws \InvalidArgumentException */ public function indexAction() { - $recordPageId = $this->configurationManager->getConfiguration( + $recordPageId = (int) $this->configurationManager->getConfiguration( ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK )['persistence']['storagePid']; @@ -79,53 +72,49 @@ class JoblistController extends ActionController { } /** + * Renders the application form with an optional job * + * @param JobApplication $applyData */ - public function applyFormAction() { + public function applyFormAction(JobApplication $applyData = NULL) { if ($this->request->getOriginalRequest()) { $uploadedFiles = $this->request->getOriginalRequest()->getArguments()['uploadedFiles']; $this->view->assign('uploadedFiles', $uploadedFiles); } + $jobId = $this->request->getArguments()['jobData']['uid']; if (!empty($jobId)) { $jobData = $this->jobRepository->findByUid($jobId); $this->view->assign('job', $jobData); } + $allowedMimeTypes = $this->settings['allowedMimeTypes']; $this->view->assign('allowedMimeTypes', $allowedMimeTypes); $allowedFileExtensions = $this->settings['allowedFileExtensions']; $this->view->assign('allowedFileExtensions', $allowedFileExtensions); + $this->view->assign('jobApplication', $applyData); } /** + * Saves the application send by the applyFormAction + * * @param JobApplication $applyData - * @return void - * @throws \TYPO3\CMS\Core\Cache\Exception\NoSuchCacheException - * @throws \TYPO3\CMS\Core\Resource\Exception\InvalidTargetFolderException - * @throws \TYPO3\CMS\Core\Resource\Exception\IllegalFileExtensionException - * @throws \TYPO3\CMS\Core\Exception - * @throws \RuntimeException - * @throws \BadFunctionCallException - * @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(JobApplication $applyData) { - $this->submitApplicationFiles($GLOBALS['TSFE']->fe_user->id, $applyData); - // get an instance of the mail service - /** @var MailTemplateService $mailService */ - $mailService = $this->objectManager->get( - MailTemplateService::class, 'application_mail', 'sg_jobs', - $this->getApplicationMailMarkers((array) $applyData) - ); - $mailService->setIgnoreMailQueue(TRUE); - $mailService->setToAddresses($this->settings['applicationEmail']); try { - $mailService->sendEmail(); - } catch (Exception $exception) { + $this->submitApplicationFiles($GLOBALS['TSFE']->fe_user->id, $applyData); + + /** @noinspection PhpMethodParametersCountMismatchInspection */ + $mailService = $this->objectManager->get( + MailTemplateService::class, 'application_mail', 'sg_jobs', + $this->getApplicationMailMarkers((array) $applyData) + ); + $mailService->setIgnoreMailQueue(TRUE); + $mailService->setToAddresses($this->settings['applicationEmail']); + $mailService->sendEmail(); + } catch (\Exception $exception) { + // possible errors, because of wrong mails (maybe log that somewhere? Does this makes sense?) } } @@ -133,20 +122,20 @@ class JoblistController extends ActionController { * Pre-apply action setup, configures model-property mapping and handles file upload * * @return void - * @throws \UnexpectedValueException - * @throws \TYPO3\CMS\Core\Resource\Exception\InsufficientFolderWritePermissionsException - * @throws \TYPO3\CMS\Core\Resource\Exception\InsufficientFolderAccessPermissionsException - * @throws \TYPO3\CMS\Core\Resource\Exception\ExistingTargetFolderException - * @throws \TYPO3\CMS\Core\Resource\Exception - * @throws \InvalidArgumentException * @throws \TYPO3\CMS\Extbase\Mvc\Exception\InvalidArgumentNameException * @throws \TYPO3\CMS\Extbase\Mvc\Exception\NoSuchArgumentException * @throws \Exception */ protected function initializeApplyAction() { - $this->handleFileUpload('coverLetter'); - $this->handleFileUpload('cv'); - $this->handleFileUpload('certificates'); + try { + $this->handleFileUpload('coverLetter'); + $this->handleFileUpload('cv'); + $this->handleFileUpload('certificates'); + } catch (\Exception $e) { + // possible errors, because of wrong mails + // @TODO output them in some way? + } + $propertyMappingConfiguration = $this->arguments->getArgument('applyData')->getPropertyMappingConfiguration(); $propertyMappingConfiguration->forProperty('coverLetter')->allowAllProperties(); $propertyMappingConfiguration->forProperty('cv')->allowAllProperties(); @@ -157,31 +146,30 @@ class JoblistController extends ActionController { } /** + * Assign filter values + * * @param int $rootPageId */ private function assignFilterValues($rootPageId) { - // get all countries $countries = $this->companyRepository->getAllCountries($rootPageId); $this->view->assign('countries', $countries); - // get all cities $cities = $this->companyRepository->getAllCities($rootPageId); $this->view->assign('cities', $cities); - // get all cities $companies = $this->companyRepository->getAllCompanyNames($rootPageId); $this->view->assign('companies', $companies); - // get all areas $areas = $this->jobRepository->getAllAreas($rootPageId); $this->view->assign('areas', $areas); - // get all areas $functions = $this->jobRepository->getAllFunctions($rootPageId); $this->view->assign('functions', $functions); } /** + * Returns the application mail markers + * * @param array $applyData * @return array */ @@ -277,22 +265,26 @@ class JoblistController extends ActionController { } $targetFolder = $storage->getFolder('/Extension/JobApplication/'); - $applicationFile = $storage->createFile($newName . '.txt', $sourceFolder); - $applicationFilePath = str_replace( - '/', '', $storage->getConfiguration()['basePath'] - ) . $applicationFile->getIdentifier(); + $applicationFile = $storage->createFile($newName . '.csv', $sourceFolder); + $applicationFilePath = str_replace('/', '', $storage->getConfiguration()['basePath']) . + $applicationFile->getIdentifier(); $this->writeApplicationFile($applicationData, $applicationFilePath, $fileNames); $storage->moveFolder($sourceFolder, $targetFolder); } /** + * Writes the application files + * * @param JobApplication $data * @param string $filePath + * @param array $fileNames * @throws \RuntimeException */ private function writeApplicationFile(JobApplication $data, $filePath, $fileNames) { + $certificateNames = ''; $certificatesArr = []; + /** @var array[][] $fileNames */ if (isset($fileNames['certificates'])) { foreach ($fileNames['certificates'] as $certificateName) { $certificatesArr[] = $certificateName; @@ -321,10 +313,10 @@ class JoblistController extends ActionController { try { $file = fopen($filePath, 'wb+'); - fputcsv($file, $dataToInsertArr, '|'); + fputcsv($file, $dataToInsertArr); fclose($file); - } catch (\RuntimeException $ex) { - throw new \RuntimeException($ex->getMessage()); + } catch (\RuntimeException $exception) { + throw new \RuntimeException($exception->getMessage()); } } @@ -338,6 +330,10 @@ class JoblistController extends ActionController { * @return void */ private function registerUploadField(array &$data, $namespace, $fieldName, $targetDirectory = '1:/_temp_/') { + if (!\is_array($_FILES[$namespace])) { + return; + } + if (!isset($data['upload'])) { $data['upload'] = []; } @@ -383,9 +379,7 @@ class JoblistController extends ActionController { // Initializing: /** @var \TYPO3\CMS\Core\Utility\File\ExtendedFileUtility $fileProcessor */ - $fileProcessor = GeneralUtility::makeInstance( - ExtendedFileUtility::class - ); + $fileProcessor = GeneralUtility::makeInstance(ExtendedFileUtility::class); $fileProcessor->setActionPermissions(['addFile' => TRUE]); $fileProcessor->setFileExtensionPermissions($this->settings['allowedFileExtensions'], ''); @@ -396,9 +390,8 @@ class JoblistController extends ActionController { $result = $fileProcessor->processData(); $uploadedFiles = []; - // Do whatever you want with $result (array of File objects) - foreach ($result['upload'] as $files) { - /** @var \TYPO3\CMS\Core\Resource\File $file */ + foreach ((array) $result['upload'] as $files) { + /** @var array $files */ foreach ($files as $file) { $uploadedFiles[] = $file; } diff --git a/Classes/Domain/Model/JobApplication.php b/Classes/Domain/Model/JobApplication.php index 06681294b677a763bf89de6a178734dc8d71135d..82b6d27cbc14f354b1fb3d02f84338b1d45c0eaa 100644 --- a/Classes/Domain/Model/JobApplication.php +++ b/Classes/Domain/Model/JobApplication.php @@ -33,16 +33,11 @@ use TYPO3\CMS\Extbase\Persistence\ObjectStorage; * The JobApplication model */ class JobApplication extends AbstractEntity { - /** - * @var string $jobTitle - * @validate NotEmpty - */ - protected $jobTitle = ''; /** - * @var string $jobTitle + * @var \SGalinski\SgJobs\Domain\Model\Job $job */ - protected $jobId = ''; + protected $job = ''; /** * @var string $gender @@ -98,7 +93,7 @@ class JobApplication extends AbstractEntity { protected $education = ''; /** - * @var string $birthDate + * @var int $birthDate */ protected $birthDate = ''; @@ -146,31 +141,17 @@ class JobApplication extends AbstractEntity { } /** - * @return string - */ - public function getJobTitle() { - return $this->jobTitle; - } - - /** - * @param string $jobTitle + * @return \SGalinski\SgJobs\Domain\Model\Job */ - public function setJobTitle(string $jobTitle) { - $this->jobTitle = $jobTitle; + public function getJob() { + return $this->job; } /** - * @return string + * @param \SGalinski\SgJobs\Domain\Model\Job $job */ - public function getJobId() { - return $this->jobId; - } - - /** - * @param string $jobId - */ - public function setJobId(string $jobId) { - $this->jobId = $jobId; + public function setJob(Job $job) { + $this->job = $job; } /** @@ -300,17 +281,17 @@ class JobApplication extends AbstractEntity { } /** - * @return string + * @return int */ public function getBirthDate() { return $this->birthDate; } /** - * @param string $birthDate + * @param int $birthDate */ public function setBirthDate(string $birthDate) { - $this->birthDate = $birthDate; + $this->birthDate = (int) $birthDate; } /** @@ -365,7 +346,7 @@ class JobApplication extends AbstractEntity { /** * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extbase\Domain\Model\FileReference> $coverLetter */ - public function setCoverLetter(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $coverLetter) { + public function setCoverLetter(ObjectStorage $coverLetter) { $this->coverLetter = $coverLetter; } @@ -379,7 +360,7 @@ class JobApplication extends AbstractEntity { /** * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extbase\Domain\Model\FileReference> $cv */ - public function setCV(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $cv) { + public function setCV(ObjectStorage $cv) { $this->cv = $cv; } @@ -393,7 +374,7 @@ class JobApplication extends AbstractEntity { /** * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extbase\Domain\Model\FileReference> $certificates */ - public function setCertificates(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $certificates) { + public function setCertificates(ObjectStorage $certificates) { $this->certificates = $certificates; } diff --git a/Classes/Domain/Repository/CompanyRepository.php b/Classes/Domain/Repository/CompanyRepository.php index de273e795806224b13f8812d6c24fde6685eeb0d..e69c9b1969a66ebe0878e4fc139b6829ccfaa8ed 100644 --- a/Classes/Domain/Repository/CompanyRepository.php +++ b/Classes/Domain/Repository/CompanyRepository.php @@ -48,20 +48,20 @@ class CompanyRepository extends Repository { } /** + * Returns all countries filtered by page id + * * @param int $pageUid - * @param array $filters * @return mixed */ - public function getAllCountries($pageUid, array $filters = []) { + public function getAllCountries($pageUid) { /** @var DatabaseConnection $db */ $db = $GLOBALS['TYPO3_DB']; $result = $db->exec_SELECTquery( - 'country', 'tx_sgjobs_domain_model_company', 'pid = ' . $pageUid, 'country' + 'country', 'tx_sgjobs_domain_model_company', 'pid = ' . (int) $pageUid, 'country' )->fetch_all(); - $countryArray = []; - $countryArray[] = ''; - foreach($result as $country) { + $countryArray = ['']; + foreach ($result as $country) { $countryArray[$country[0]] = $country[0]; } @@ -69,6 +69,8 @@ class CompanyRepository extends Repository { } /** + * Returns all filtered cities + * * @param int $pageUid * @param array $filters * @return mixed @@ -80,14 +82,10 @@ class CompanyRepository extends Repository { if ($filters['country'] && $filters['country'] !== 0) { $where .= ' AND country = ' . $db->quoteStr($filters['country'], self::TABLENAME); } + $result = $db->exec_SELECTquery('city', self::TABLENAME, $where, 'city')->fetch_all(); - $result = $db->exec_SELECTquery( - 'city', self::TABLENAME, $where, 'city' - )->fetch_all(); - - $cityArray = []; - $cityArray[] = ''; - foreach($result as $city) { + $cityArray = ['']; + foreach ($result as $city) { $cityArray[$city[0]] = $city[0]; } @@ -95,6 +93,8 @@ class CompanyRepository extends Repository { } /** + * Returns all companies filtered by page id + * * @param int $pageUid * @return mixed */ @@ -102,12 +102,11 @@ class CompanyRepository extends Repository { /** @var DatabaseConnection $db */ $db = $GLOBALS['TYPO3_DB']; $result = $db->exec_SELECTquery( - 'name', 'tx_sgjobs_domain_model_company', 'pid = ' . $pageUid, 'name' + 'name', 'tx_sgjobs_domain_model_company', 'pid = ' . (int) $pageUid, 'name' )->fetch_all(); - $namesArray = []; - $namesArray[] = ''; - foreach($result as $name) { + $namesArray = ['']; + foreach ($result as $name) { $namesArray[$name[0]] = $name[0]; } diff --git a/Classes/Domain/Repository/JobRepository.php b/Classes/Domain/Repository/JobRepository.php index 2b90775e6de02b733c78f9d937f4050a7cec1133..7cf489980a2a2120ca10d832ef03fe63ae52dfb2 100644 --- a/Classes/Domain/Repository/JobRepository.php +++ b/Classes/Domain/Repository/JobRepository.php @@ -36,7 +36,6 @@ use TYPO3\CMS\Extbase\Persistence\Repository; * Job Repository */ class JobRepository extends Repository { - const TABLENAME = 'tx_sgjobs_domain_model_job'; /** @@ -73,14 +72,14 @@ class JobRepository extends Repository { $constraints = []; - if (isset($filters['locations']) && is_array($filters['locations']) && count($filters['locations'])) { + if (isset($filters['locations']) && \is_array($filters['locations']) && \count($filters['locations'])) { $locationConstraints = []; - foreach ($filters['locations'] as $location) { + foreach ((array) $filters['locations'] as $location) { if ((int) $location) { $locationConstraints[] = $query->contains('location', $location); } } - if (count($locationConstraints)) { + if (\count($locationConstraints)) { $constraints[] = $query->logicalOr($locationConstraints); } } @@ -94,9 +93,9 @@ class JobRepository extends Repository { $constraints[] = $query->logicalOr($searchConstraints); } - if (count($constraints) > 1) { + if (\count($constraints) > 1) { $query->matching($query->logicalAnd($constraints)); - } elseif (count($constraints)) { + } elseif (\count($constraints)) { $query->matching($constraints[0]); } @@ -104,6 +103,8 @@ class JobRepository extends Repository { } /** + * Returns all areas filtered by page id + * * @param int $pageUid * @return mixed */ @@ -114,8 +115,7 @@ class JobRepository extends Repository { 'area', 'tx_sgjobs_domain_model_job', 'pid = ' . $pageUid, 'area' )->fetch_all(); - $areaArray = []; - $areaArray[] = ''; + $areaArray = ['']; foreach ($result as $area) { $areaArray[$area[0]] = $area[0]; } @@ -124,6 +124,8 @@ class JobRepository extends Repository { } /** + * Returns all function filtered by page id + * * @param int $pageUid * @return mixed */ @@ -134,8 +136,7 @@ class JobRepository extends Repository { 'job_function', 'tx_sgjobs_domain_model_job', 'pid = ' . $pageUid, 'job_function' )->fetch_all(); - $functionArray = []; - $functionArray[] = ''; + $functionArray = ['']; foreach ($result as $function) { $functionArray[$function[0]] = $function[0]; } @@ -144,6 +145,8 @@ class JobRepository extends Repository { } /** + * Returns a job filtered by company and page id + * * @param int $pageUid * @param array $companyIds * @return QueryResultInterface @@ -163,19 +166,19 @@ class JobRepository extends Repository { $constraints = []; - if (isset($companyIds) && is_array($companyIds) && count($companyIds)) { + if (isset($companyIds) && \is_array($companyIds) && \count($companyIds)) { $companyConstraints = []; foreach ($companyIds as $companyId) { if ((int) $companyId) { $companyConstraints[] = $query->equals('company', $companyId); } } - if (count($companyConstraints)) { + if (\count($companyConstraints)) { $constraints[] = $query->logicalOr($companyConstraints); } } - if (count($constraints)) { + if (\count($constraints)) { $query->matching($query->logicalAnd($constraints)); } diff --git a/Classes/Service/FrontendFilterService.php b/Classes/Service/FrontendFilterService.php index 5f64a69a27a97b0887170b26298554cc0d5371c3..1cb8e05b5c5c25f0cdc7ab5775a6305454669421 100644 --- a/Classes/Service/FrontendFilterService.php +++ b/Classes/Service/FrontendFilterService.php @@ -274,12 +274,12 @@ class FrontendFilterService { ) ); - $functions = $statement->execute()->fetchAll(); + $jobFunctions = $statement->execute()->fetchAll(); $result = []; $result[0] = ''; - foreach ($functions as $function) { - $result[$function['function']] = $function['function']; + foreach ($jobFunctions as $jobFunction) { + $result[$jobFunction['job_function']] = $jobFunction['job_function']; } return $result; diff --git a/Classes/ViewHelpers/InlineLanguageLabelsViewHelper.php b/Classes/ViewHelpers/InlineLanguageLabelsViewHelper.php index 5eada181ff3f4d5d87f3b6d0bdbbafea6977d113..aad577ef035de2042efc10667a33db871066d3b8 100644 --- a/Classes/ViewHelpers/InlineLanguageLabelsViewHelper.php +++ b/Classes/ViewHelpers/InlineLanguageLabelsViewHelper.php @@ -1,5 +1,7 @@ <?php + namespace SGalinski\SgJobs\ViewHelpers; + /*************************************************************** * Copyright notice * @@ -25,6 +27,7 @@ namespace SGalinski\SgJobs\ViewHelpers; ***************************************************************/ use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Utility\LocalizationUtility; + /** * View helper to render language labels to * json array to be used in js applications. @@ -46,7 +49,7 @@ class InlineLanguageLabelsViewHelper extends AbstractViewHelper { public function render($labels = '', $htmlEscape = FALSE) { $extensionName = $this->controllerContext->getRequest()->getControllerExtensionName(); $labels = GeneralUtility::trimExplode(',', $labels, TRUE); - $languageArray = array(); + $languageArray = []; foreach ($labels as $key) { $value = LocalizationUtility::translate($key, $extensionName); $languageArray[$key] = ($htmlEscape ? htmlentities($value) : $value); diff --git a/Classes/ViewHelpers/SetViewHelper.php b/Classes/ViewHelpers/SetViewHelper.php index d1b5dfda92bdeacf36c38b7adb8a54ae65700c73..ce0db48296a588a0073ba646ac62b6f188661be5 100644 --- a/Classes/ViewHelpers/SetViewHelper.php +++ b/Classes/ViewHelpers/SetViewHelper.php @@ -1,4 +1,5 @@ <?php + namespace SGalinski\SgJobs\ViewHelpers; /*************************************************************** diff --git a/Configuration/TCA/tx_sgjobs_domain_model_job.php b/Configuration/TCA/tx_sgjobs_domain_model_job.php index 10538fafbb0368ce8bf726148ae946a1394b774a..0d2b94d30670d4a5c1b47bb455d1244ec677c460 100644 --- a/Configuration/TCA/tx_sgjobs_domain_model_job.php +++ b/Configuration/TCA/tx_sgjobs_domain_model_job.php @@ -31,8 +31,8 @@ return [ ], 'types' => [ '1' => [ - 'showitem' => '--palette--;;sysLanguageAndHidden,title, job_id, --palette--;;pallete_title_start,,--palette--;;pallete_area_function, - --palette--;;pallete_location_contact, description, --div--; LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tca.qualification_tab, task, qualification, div;;richtext[*]:rte_transform[mode=ts], + 'showitem' => '--palette--;;sysLanguageAndHidden,title, job_id, --palette--;;palette_title_start,,--palette--;;palette_area_function, + --palette--;;palette_location_contact, description, --div--; LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tca.qualification_tab, task, qualification, div;;richtext[*]:rte_transform[mode=ts], --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.access, starttime, endtime', ], ], @@ -41,9 +41,9 @@ return [ 'showitem' => 'sys_language_uid;;;;1-1-1, l10n_diffsource, hidden;;1, ', 'canNotCollapse' => 1, ], - 'pallete_title_start' => ['showitem' => 'start_date, alternative_start_date', 'canNotCollapse' => 1], - 'pallete_area_function' => ['showitem' => 'area, job_function', 'canNotCollapse' => 1], - 'pallete_location_contact' => ['showitem' => 'company, contact', 'canNotCollapse' => 1] + 'palette_title_start' => ['showitem' => 'start_date, alternative_start_date', 'canNotCollapse' => 1], + 'palette_area_function' => ['showitem' => 'area, job_function', 'canNotCollapse' => 1], + 'palette_location_contact' => ['showitem' => 'company, contact', 'canNotCollapse' => 1] ], 'columns' => [ 'sys_language_uid' => [ diff --git a/Configuration/TCA/tx_sgjobs_domain_model_job_application.php b/Configuration/TCA/tx_sgjobs_domain_model_job_application.php new file mode 100644 index 0000000000000000000000000000000000000000..454097455264efe30c82a97e8fe2a49b09fbe56f --- /dev/null +++ b/Configuration/TCA/tx_sgjobs_domain_model_job_application.php @@ -0,0 +1,321 @@ +<?php + +return [ + 'ctrl' => [ + 'title' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application', + 'label' => 'first_name, last_name', + 'tstamp' => 'tstamp', + 'crdate' => 'crdate', + 'cruser_id' => 'cruser_id', + 'dividers2tabs' => TRUE, + 'searchFields' => 'job_id, gender, first_name, last_name, street, city, zip, country, nationality, education, birth_date, phone, mobile, email, message, cover_letter, certificates, cv', + 'versioningWS' => 2, + 'versioning_followPages' => TRUE, + 'origUid' => 't3_origuid', + 'languageField' => 'sys_language_uid', + 'transOrigPointerField' => 'l10n_parent', + 'transOrigDiffSourceField' => 'l10n_diffsource', + 'delete' => 'deleted', + 'enablecolumns' => [ + 'disabled' => 'hidden', + 'starttime' => 'starttime', + 'endtime' => 'endtime', + ], + 'sortby' => 'sorting', + 'iconfile' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extRelPath('sg_jobs') . + 'Resources/Public/Icons/tx_sgjobs_domain_model_job.svg' + ], + 'interface' => [ + 'showRecordFieldList' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, pid, job_id, area, job_function, start_date, alternative_start_date, + company, task, qualification, description, contact', + ], + 'types' => [ + '1' => [ + 'showitem' => '--palette--;;sysLanguageAndHidden,job_id, gender, first_name, last_name, street, city, zip, + country, nationality, education, birth_date, phone, mobile, email, message, cover_letter, certificates, cv, + div;;richtext[*]:rte_transform[mode=ts], + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.access, starttime, endtime', + ], + ], + 'palettes' => [ + 'sysLanguageAndHidden' => [ + 'showitem' => 'sys_language_uid;;;;1-1-1, l10n_diffsource, hidden;;1, ', + 'canNotCollapse' => 1, + ] + ], + 'columns' => [ + 'sys_language_uid' => [ + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/Resources/Private/Language/locallang_general.xml:LGL.language', + 'config' => [ + 'type' => 'select', + 'special' => 'languages', + ], + ], + 'l10n_parent' => [ + 'displayCond' => 'FIELD:sys_language_uid:>:0', + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/Resources/Private/Language/locallang_general.xml:LGL.l18n_parent', + 'config' => [ + 'type' => 'select', + 'items' => [ + ['', 0], + ], + 'foreign_table' => 'tx_sgjobs_domain_model_job_application', + 'foreign_table_where' => 'AND tx_sgjobs_domain_model_job_application.pid=###CURRENT_PID### AND tx_sgjobs_domain_model_job_application.sys_language_uid IN (-1,0)', + ], + ], + 'l10n_diffsource' => [ + 'config' => [ + 'type' => 'passthrough', + ], + ], + 't3ver_label' => [ + 'label' => 'LLL:EXT:lang/Resources/Private/Language/locallang_general.xml:LGL.versionLabel', + 'config' => [ + 'type' => 'input', + 'size' => 30, + 'max' => 255, + ] + ], + 'pid' => [ + 'exclude' => 0, + 'label' => 'PID', + 'config' => [ + 'type' => 'none', + ] + ], + 'hidden' => [ + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/Resources/Private/Language/locallang_general.xml:LGL.hidden', + 'config' => [ + 'type' => 'check', + ], + ], + 'starttime' => [ + 'exclude' => 1, + 'l10n_mode' => 'mergeIfNotBlank', + 'label' => 'LLL:EXT:lang/Resources/Private/Language/locallang_general.xml:LGL.starttime', + 'config' => [ + 'type' => 'input', + 'size' => 13, + 'max' => 20, + 'eval' => 'datetime', + 'checkbox' => 0, + 'default' => 0, + 'range' => [ + 'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y')) + ], + ], + ], + 'endtime' => [ + 'exclude' => 1, + 'l10n_mode' => 'mergeIfNotBlank', + 'label' => 'LLL:EXT:lang/Resources/Private/Language/locallang_general.xml:LGL.endtime', + 'config' => [ + 'type' => 'input', + 'size' => 13, + 'max' => 20, + 'eval' => 'datetime', + 'checkbox' => 0, + 'default' => 0, + 'range' => [ + 'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y')) + ], + ], + ], + 'job' => [ + 'exclude' => 0, + 'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.job', + 'config' => [ + 'type' => 'select', + 'eval' => 'required', + 'renderType' => 'selectSingle', + 'internal_type' => 'db', + 'foreign_table' => 'tx_sgjobs_domain_model_job', + 'size' => 1, + 'maxitems' => 1, + 'multiple' => 0, + 'fieldControl' => [ + 'editPopup' => [ + 'disabled' => FALSE, + ], + 'addRecord' => [ + 'disabled' => FALSE, + ] + ], + ] + ], + 'gender' => [ + 'exclude' => 0, + 'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.gender', + 'config' => [ + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim, required' + ], + ], + 'first_name' => [ + 'exclude' => 0, + 'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.first_name', + 'config' => [ + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim, required' + ], + ], + 'last_name' => [ + 'exclude' => 0, + 'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.last_name', + 'config' => [ + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim, required' + ], + ], + 'street' => [ + 'exclude' => 0, + 'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.street', + 'config' => [ + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim, required' + ], + ], + 'city' => [ + 'exclude' => 0, + 'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.city', + 'config' => [ + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim, required' + ], + ], + 'zip' => [ + 'exclude' => 0, + 'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.zip', + 'config' => [ + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim, required' + ], + ], + 'country' => [ + 'exclude' => 0, + 'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.country', + 'config' => [ + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim, required' + ], + ], + 'nationality' => [ + 'exclude' => 0, + 'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.nationality', + 'config' => [ + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim, required' + ], + ], + 'education' => [ + 'exclude' => 0, + 'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.education', + 'config' => [ + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim, required' + ], + ], + 'birth_date' => [ + 'exclude' => 1, + 'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.birth_date', + 'config' => [ + 'type' => 'input', + 'size' => 13, + 'max' => 20, + 'eval' => 'date, required', + 'checkbox' => 0, + 'range' => [ + 'lower' => mktime(date('m'), date('d'), date('Y')) + ], + ], + ], + 'phone' => [ + 'exclude' => 0, + 'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.phone', + 'config' => [ + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim, required' + ], + ], + 'mobile' => [ + 'exclude' => 0, + 'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.mobile', + 'config' => [ + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim, required' + ], + ], + 'email' => [ + 'exclude' => 0, + 'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.email', + 'config' => [ + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim, required' + ], + ], + 'message' => [ + 'exclude' => 0, + 'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.message', + 'config' => [ + 'type' => 'text', + 'cols' => 40, + 'rows' => 10, + 'eval' => 'required' + ], + ], + 'cover_letter' => [ + 'exclude' => 0, + 'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.cover_letter', + 'config' => [ + 'type' => 'group', + 'internal_type' => 'file', + 'allowed' => 'pdf, doc', + 'size' => 1, + 'uploadfolder' => 'uploads/tx_sgjobs/', + 'max_size' => 2000, + 'eval' => 'required' + ], + ], + 'certificates' => [ + 'exclude' => 0, + 'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.certificates', + 'config' => [ + 'type' => 'group', + 'internal_type' => 'file', + 'allowed' => 'pdf, doc', + 'size' => 3, + 'uploadfolder' => 'uploads/tx_sgjobs/', + 'max_size' => 2000, + 'eval' => 'required' + ], + ], + 'cv' => [ + 'exclude' => 0, + 'label' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_job_application.cv', + 'config' => [ + 'type' => 'group', + 'internal_type' => 'file', + 'allowed' => 'pdf, doc', + 'size' => 1, + 'uploadfolder' => 'uploads/tx_sgjobs/', + 'max_size' => 2000, + 'eval' => 'required' + ], + ] + ], +]; \ No newline at end of file diff --git a/Resources/Private/Language/de.locallang_db.xlf b/Resources/Private/Language/de.locallang_db.xlf index d677f0f59bce5a8745870727811c1050b6310962..6a8f614d1638cd6bd49a0b455e9b007986b6682c 100644 --- a/Resources/Private/Language/de.locallang_db.xlf +++ b/Resources/Private/Language/de.locallang_db.xlf @@ -101,18 +101,14 @@ <source>Job offer</source> <target>Stellenanzeige</target> </trans-unit> - <trans-unit id="tx_sgjobs_domain_model_job.plugin_options" approved="yes"> - <source>Joblist plugin options</source> - <target>Joblist Plugin-Optionen</target> + <trans-unit id="tx_sgjobs_domain_model_job.alternative_start_date" approved="yes"> + <source>Alternative start date</source> + <target>Alternativer Eintrittszeitpunkt</target> </trans-unit> <trans-unit id="tx_sgjobs_domain_model_job.application_form_page" approved="yes"> <source>Page containing the application form</source> <target>Seite, die das Bewerbungs-Formular enthält</target> </trans-unit> - <trans-unit id="tx_sgjobs_domain_model_job.alternative_start_date" approved="yes"> - <source>Alternative start date</source> - <target>Alternativer Eintrittszeitpunkt</target> - </trans-unit> <trans-unit id="tx_sgjobs_domain_model_job.area" approved="yes"> <source>Area</source> <target>Bereich</target> @@ -137,6 +133,10 @@ <source>Location</source> <target>Arbeitsort</target> </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job.plugin_options" approved="yes"> + <source>Joblist plugin options</source> + <target>Joblist Plugin-Optionen</target> + </trans-unit> <trans-unit id="tx_sgjobs_domain_model_job.qualification" approved="yes"> <source>Qualification</source> <target>Qualifikation</target> @@ -161,6 +161,82 @@ <source>Job title</source> <target>Stellenbezeichnung</target> </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application" approved="yes"> + <source>Job application</source> + <target>Bewerbung</target> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.birth_date" approved="yes"> + <source>Birthdate</source> + <target>Geburtsdatum</target> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.certificates" approved="yes"> + <source>Certificates</source> + <target>Zeugnisse</target> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.city" approved="yes"> + <source>City</source> + <target>Ort</target> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.country" approved="yes"> + <source>Country</source> + <target>Land</target> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.cover_letter" approved="yes"> + <source>Cover letter</source> + <target>Motivationsschreiben</target> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.cv" approved="yes"> + <source>CV</source> + <target>Lebenslauf</target> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.education" approved="yes"> + <source>Education</source> + <target>Höchster Abschluss</target> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.email" approved="yes"> + <source>Email</source> + <target>E-Mail</target> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.first_name" approved="yes"> + <source>First name</source> + <target>Vorname</target> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.gender" approved="yes"> + <source>Gender</source> + <target>Geschlecht</target> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.job" approved="yes"> + <source>Job</source> + <target>Stelle</target> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.last_name" approved="yes"> + <source>Last name</source> + <target>Nachname</target> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.message" approved="yes"> + <source>Message</source> + <target>Nachricht</target> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.mobile" approved="yes"> + <source>Mobile</source> + <target>Mobil</target> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.nationality" approved="yes"> + <source>Nationality</source> + <target>Nationalität</target> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.phone" approved="yes"> + <source>Phone</source> + <target>Telefon</target> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.street" approved="yes"> + <source>Street</source> + <target>Strasse</target> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.zip" approved="yes"> + <source>Zip</source> + <target>PLZ</target> + </trans-unit> <trans-unit id="tx_sgjobs_domain_model_location" approved="yes"> <source>Location</source> <target>Arbeitsort</target> diff --git a/Resources/Private/Language/locallang_db.xlf b/Resources/Private/Language/locallang_db.xlf index cc41546a6fc48bf3a1cfdb7b335f3d631c912e47..d853bebb0d11001464e3b5aa4320169923968fec 100644 --- a/Resources/Private/Language/locallang_db.xlf +++ b/Resources/Private/Language/locallang_db.xlf @@ -78,15 +78,12 @@ <trans-unit id="tx_sgjobs_domain_model_job"> <source>Job offer</source> </trans-unit> - <trans-unit id="tx_sgjobs_domain_model_job.plugin_options"> - <source>Joblist plugin options</source> + <trans-unit id="tx_sgjobs_domain_model_job.alternative_start_date"> + <source>Alternative start date</source> </trans-unit> <trans-unit id="tx_sgjobs_domain_model_job.application_form_page"> <source>Page containing the application form</source> </trans-unit> - <trans-unit id="tx_sgjobs_domain_model_job.alternative_start_date"> - <source>Alternative start date</source> - </trans-unit> <trans-unit id="tx_sgjobs_domain_model_job.area"> <source>Area</source> </trans-unit> @@ -102,9 +99,15 @@ <trans-unit id="tx_sgjobs_domain_model_job.function"> <source>Function</source> </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job.jobId"> + <source>Job ID</source> + </trans-unit> <trans-unit id="tx_sgjobs_domain_model_job.location"> <source>Location</source> </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job.plugin_options"> + <source>Joblist plugin options</source> + </trans-unit> <trans-unit id="tx_sgjobs_domain_model_job.qualification"> <source>Qualification</source> </trans-unit> @@ -123,8 +126,62 @@ <trans-unit id="tx_sgjobs_domain_model_job.title"> <source>Job title</source> </trans-unit> - <trans-unit id="tx_sgjobs_domain_model_job.jobId"> - <source>Job ID</source> + <trans-unit id="tx_sgjobs_domain_model_job_application"> + <source>Job application</source> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.birth_date"> + <source>Birthdate</source> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.certificates"> + <source>Certificates</source> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.city"> + <source>City</source> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.country"> + <source>Country</source> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.cover_letter"> + <source>Cover letter</source> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.cv"> + <source>CV</source> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.education"> + <source>Education</source> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.email"> + <source>Email</source> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.first_name"> + <source>First name</source> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.gender"> + <source>Gender</source> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.job"> + <source>Job</source> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.last_name"> + <source>Last name</source> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.message"> + <source>Message</source> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.mobile"> + <source>Mobile</source> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.nationality"> + <source>Nationality</source> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.phone"> + <source>Phone</source> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.street"> + <source>Street</source> + </trans-unit> + <trans-unit id="tx_sgjobs_domain_model_job_application.zip"> + <source>Zip</source> </trans-unit> <trans-unit id="tx_sgjobs_domain_model_location"> <source>Location</source> diff --git a/Resources/Private/Partials/Job.html b/Resources/Private/Partials/Job.html index e984b85ff2941d49fe18f4a709de3b7e79b544e2..466dffa252cd1d3f33e0aa96674b8b2a1a2e319e 100644 --- a/Resources/Private/Partials/Job.html +++ b/Resources/Private/Partials/Job.html @@ -25,7 +25,7 @@ </tr> <tr> <td> - <f:translate key="frontend.function" /> + <f:translate key="frontend.job_function" /> </td> <td> {job.function} diff --git a/Resources/Private/Templates/Joblist/ApplyForm.html b/Resources/Private/Templates/Joblist/ApplyForm.html index 918cc165684f6559f9b68681a9fcb83d20c5599a..adcd614f66ab093a3df3d1301c6f943f8915a44f 100644 --- a/Resources/Private/Templates/Joblist/ApplyForm.html +++ b/Resources/Private/Templates/Joblist/ApplyForm.html @@ -2,19 +2,14 @@ <f:section name="main"> <f:form action="apply" controller="Joblist" method="post" objectName="applyData" object="{applyData}" enctype="multipart/form-data"> - <f:form.hidden value="{job.jobId}" property="jobId" /> - <label for="apply-jobTitle"><f:translate key="frontend.apply.title" /></label> - <f:form.textfield property="jobTitle" id="apply-jobTitle" data="{}" class="" value="{job.title}" /> - <f:form.validationResults for="applyData.jobTitle"> - <f:for each="{validationResults.errors}" as="error"> - <div class="sg-jobs-validation-error"> - {error.message} - </div> - </f:for> - </f:form.validationResults> - <br /> + <f:form.hidden value="{job.uid}" property="jobId" /> + <label for="apply-gender"><f:translate key="frontend.apply.gender" /></label> +<<<<<<< HEAD <f:form.select property="gender" id="apply-gender" data="{}" class="" options="{Male: 'Male', Female: 'Female'}" /> +======= + <f:form.select property="gender" id="apply-gender" class="" options="{None: '', Male: 'Male', Female: 'Female'}" /> +>>>>>>> ef0bad6dbd9fd1503cfce001734cb83f277d8404 <f:form.validationResults for="applyData.gender"> <f:for each="{validationResults.errors}" as="error"> <div class="sg-jobs-validation-error"> @@ -24,7 +19,7 @@ </f:form.validationResults> <br /> <label for="apply-firstName"><f:translate key="frontend.apply.first_name" /></label> - <f:form.textfield property="firstName" id="apply-firstName" data="{}" class="" /> + <f:form.textfield property="firstName" id="apply-firstName" class="" /> <f:form.validationResults for="applyData.firstName"> <f:for each="{validationResults.errors}" as="error"> <div class="sg-jobs-validation-error"> @@ -34,7 +29,7 @@ </f:form.validationResults> <br /> <label for="apply-lastName"><f:translate key="frontend.apply.last_name" /></label> - <f:form.textfield property="lastName" id="apply-lastName" data="{}" class="" /> + <f:form.textfield property="lastName" id="apply-lastName" class="" /> <f:form.validationResults for="applyData.lastName"> <f:for each="{validationResults.errors}" as="error"> <div class="sg-jobs-validation-error"> @@ -44,7 +39,7 @@ </f:form.validationResults> <br /> <label for="apply-street"><f:translate key="frontend.apply.street" /></label> - <f:form.textfield property="street" id="apply-street" data="{}" class="" /> + <f:form.textfield property="street" id="apply-street" class="" /> <f:form.validationResults for="applyData.street"> <f:for each="{validationResults.errors}" as="error"> <div class="sg-jobs-validation-error"> @@ -54,7 +49,7 @@ </f:form.validationResults> <br /> <label for="apply-city"><f:translate key="frontend.apply.city" /></label> - <f:form.textfield property="city" id="apply-city" data="{}" class="" /> + <f:form.textfield property="city" id="apply-city" class="" /> <f:form.validationResults for="applyData.city"> <f:for each="{validationResults.errors}" as="error"> <div class="sg-jobs-validation-error"> @@ -64,7 +59,7 @@ </f:form.validationResults> <br /> <label for="apply-zip"><f:translate key="frontend.apply.zip" /></label> - <f:form.textfield property="zip" id="apply-zip" data="{}" class="" /> + <f:form.textfield property="zip" id="apply-zip" class="" /> <f:form.validationResults for="applyData.zip"> <f:for each="{validationResults.errors}" as="error"> <div class="sg-jobs-validation-error"> @@ -72,9 +67,9 @@ </div> </f:for> </f:form.validationResults> - <br/> + <br /> <label for="apply-country"><f:translate key="frontend.apply.country" /></label> - <f:form.textfield property="country" id="apply-country" data="{}" class="" /> + <f:form.textfield property="country" id="apply-country" class="" /> <f:form.validationResults for="applyData.country"> <f:for each="{validationResults.errors}" as="error"> <div class="sg-jobs-validation-error"> @@ -84,7 +79,7 @@ </f:form.validationResults> <br /> <label for="apply-nationality"><f:translate key="frontend.apply.nationality" /></label> - <f:form.textfield property="nationality" id="apply-nationality" data="{}" class="" /> + <f:form.textfield property="nationality" id="apply-nationality" class="" /> <f:form.validationResults for="applyData.nationality"> <f:for each="{validationResults.errors}" as="error"> <div class="sg-jobs-validation-error"> @@ -92,9 +87,9 @@ </div> </f:for> </f:form.validationResults> - <br/> + <br /> <label for="apply-education"><f:translate key="frontend.apply.education" /></label> - <f:form.textfield property="education" id="apply-education" data="{}" class="" /> + <f:form.textfield property="education" id="apply-education" class="" /> <f:form.validationResults for="applyData.education"> <f:for each="{validationResults.errors}" as="error"> <div class="sg-jobs-validation-error"> @@ -102,9 +97,9 @@ </div> </f:for> </f:form.validationResults> - <br/> + <br /> <label for="apply-birthDate"><f:translate key="frontend.apply.birthDate" /></label> - <f:form.textfield property="birthDate" id="apply-birthDate" data="{}" class="" /> + <f:form.textfield property="birthDate" id="apply-birthDate" class="" /> <f:form.validationResults for="applyData.birthDate"> <f:for each="{validationResults.errors}" as="error"> <div class="sg-jobs-validation-error"> @@ -114,7 +109,7 @@ </f:form.validationResults> <br /> <label for="apply-phone"><f:translate key="frontend.apply.phone" /></label> - <f:form.textfield property="phone" id="apply-phone" data="{}" class="" /> + <f:form.textfield property="phone" id="apply-phone" class="" /> <f:form.validationResults for="applyData.phone"> <f:for each="{validationResults.errors}" as="error"> <div class="sg-jobs-validation-error"> @@ -124,7 +119,7 @@ </f:form.validationResults> <br /> <label for="apply-mobile"><f:translate key="frontend.apply.mobile" /></label> - <f:form.textfield property="mobile" id="apply-mobile" data="{}" class="" /> + <f:form.textfield property="mobile" id="apply-mobile" class="" /> <f:form.validationResults for="applyData.mobile"> <f:for each="{validationResults.errors}" as="error"> <div class="sg-jobs-validation-error"> @@ -191,7 +186,7 @@ </f:for> <br /> <label for="apply-message"><f:translate key="frontend.apply.message" /></label> - <f:form.textarea property="message" id="apply-message" data="{}" class="" /> + <f:form.textarea property="message" id="apply-message" class="" /> <br /> <f:form.submit value="{f:translate(key:'frontend.applyNow')}" /> </f:form> diff --git a/ext_tables.php b/ext_tables.php index 69933a45ef64635c752591be231e409efda88cd0..84245434fc7e375bad63d65c3572e02d41abd666 100644 --- a/ext_tables.php +++ b/ext_tables.php @@ -23,6 +23,7 @@ if (TYPO3_MODE === 'BE') { \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::allowTableOnStandardPages('tx_sgjobs_domain_model_job'); \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::allowTableOnStandardPages('tx_sgjobs_domain_model_contact'); \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::allowTableOnStandardPages('tx_sgjobs_domain_model_company'); + \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::allowTableOnStandardPages('tx_sgjobs_domain_model_job_application'); // Register backend modules \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerModule( diff --git a/ext_tables.sql b/ext_tables.sql index 79d06be363cb5a003f1eab6834cb7417db690837..683d4cb711df42c87e6d2c08c56083129565d59a 100644 --- a/ext_tables.sql +++ b/ext_tables.sql @@ -137,3 +137,60 @@ CREATE TABLE tx_sgjobs_domain_model_contact ( KEY t3ver_oid (t3ver_oid,t3ver_wsid), KEY language (l10n_parent,sys_language_uid) ); + +CREATE TABLE tx_sgjobs_domain_model_job_application ( + uid int(11) NOT NULL auto_increment, + pid int(11) DEFAULT '0' NOT NULL, + + -- Custom fields + job int(11) unsigned DEFAULT '0' NOT NULL, + gender varchar(30) DEFAULT '' NOT NULL, + first_name text DEFAULT '' NOT NULL, + last_name text DEFAULT '' NOT NULL, + street text DEFAULT '' NOT NULL, + city text DEFAULT '' NOT NULL, + zip text DEFAULT '' NOT NULL, + country text DEFAULT '' NOT NULL, + nationality text DEFAULT '' NOT NULL, + education text DEFAULT '' NOT NULL, + birth_date int(11) unsigned DEFAULT '0' NOT NULL, + phone text DEFAULT '' NOT NULL, + mobile text DEFAULT '' NOT NULL, + email text DEFAULT '' NOT NULL, + message text DEFAULT '' NOT NULL, + cover_letter int(11) unsigned DEFAULT '0' NOT NULL, + certificates int(11) unsigned DEFAULT '0' NOT NULL, + cv int(11) unsigned DEFAULT '0' NOT NULL, + + -- TYPO3 fields + sorting int(11) unsigned DEFAULT '0' NOT NULL, + starttime int(11) unsigned DEFAULT '0' NOT NULL, + endtime int(11) unsigned DEFAULT '0' NOT NULL, + tstamp int(11) unsigned DEFAULT '0' NOT NULL, + crdate int(11) unsigned DEFAULT '0' NOT NULL, + cruser_id int(11) unsigned DEFAULT '0' NOT NULL, + deleted tinyint(4) unsigned DEFAULT '0' NOT NULL, + hidden tinyint(4) unsigned DEFAULT '0' NOT NULL, + + -- TYPO3 workspace fields + t3ver_oid int(11) DEFAULT '0' NOT NULL, + t3ver_id int(11) DEFAULT '0' NOT NULL, + t3ver_wsid int(11) DEFAULT '0' NOT NULL, + t3ver_label varchar(255) DEFAULT '' NOT NULL, + t3ver_state tinyint(4) DEFAULT '0' NOT NULL, + t3ver_stage int(11) DEFAULT '0' NOT NULL, + t3ver_count int(11) DEFAULT '0' NOT NULL, + t3ver_tstamp int(11) DEFAULT '0' NOT NULL, + t3ver_move_id int(11) DEFAULT '0' NOT NULL, + t3_origuid int(11) DEFAULT '0' NOT NULL, + + -- TYPO3 multi language fields + sys_language_uid int(11) DEFAULT '0' NOT NULL, + l10n_parent int(11) DEFAULT '0' NOT NULL, + l10n_diffsource mediumblob, + + PRIMARY KEY (uid), + KEY parent (pid), + KEY t3ver_oid (t3ver_oid,t3ver_wsid), + KEY language (l10n_parent,sys_language_uid) +);