diff --git a/Classes/Controller/JoblistController.php b/Classes/Controller/JoblistController.php index 446a531908009a98fc58aa1b815a0477714590af..d7f8e7f80a93a53521c0ec4d3696457ec533315e 100644 --- a/Classes/Controller/JoblistController.php +++ b/Classes/Controller/JoblistController.php @@ -572,20 +572,20 @@ class JoblistController extends ActionController { * @param int $rootPageId * @throws AspectNotFoundException */ - protected function assignFilterValues(int $rootPageId, array $filters): void { - $countries = $this->companyRepository->getAllCountries($rootPageId); + protected function assignFilterValues(int $rootPageId, array $filters = []): void { + $countries = $this->companyRepository->getAllCountries($rootPageId, $filters['filterByLocation'] ?? []); $this->view->assign('countries', $countries); - $cities = $this->companyRepository->getAllCities($rootPageId); + $cities = $this->companyRepository->getAllCities($rootPageId, $filters['filterByLocation'] ?? []); $this->view->assign('cities', $cities); - $companies = $this->companyRepository->getAllCompanyNames($rootPageId); + $companies = $this->companyRepository->getAllCompanyNames($rootPageId, $filters['filterByLocation'] ?? []); $this->view->assign('companies', $companies); - $departments = $this->departmentRepository->findAll(); + $departments = $this->departmentRepository->findAllByFilter($filters['filterByDepartment'] ?? []); $this->view->assign('departments', $departments); - $experienceLevels = $this->experienceLevelRepository->findAll(); + $experienceLevels = $this->experienceLevelRepository->findAllByFilter($filters['filterByExperienceLevel'] ?? []); $this->view->assign('experienceLevels', $experienceLevels); } diff --git a/Classes/Domain/Repository/CompanyRepository.php b/Classes/Domain/Repository/CompanyRepository.php index 4a00243562951b188f74ca74ac21cd147acaa5ae..86ea052540c0daa29a3b8ab7bbedaf8025293e3f 100644 --- a/Classes/Domain/Repository/CompanyRepository.php +++ b/Classes/Domain/Repository/CompanyRepository.php @@ -28,8 +28,10 @@ namespace SGalinski\SgJobs\Domain\Repository; use SGalinski\SgJobs\Domain\Model\Company; use TYPO3\CMS\Core\Context\Context; +use TYPO3\CMS\Core\Context\Exception\AspectNotFoundException; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Persistence\QueryInterface; +use TYPO3\CMS\Extbase\Persistence\QueryResultInterface; use TYPO3\CMS\Extbase\Persistence\Repository; /** @@ -51,11 +53,12 @@ class CompanyRepository extends Repository { * Returns all countries filtered by page id * * @param int $pageUid + * @param array $filters * @return array - * @throws \TYPO3\CMS\Core\Context\Exception\AspectNotFoundException + * @throws AspectNotFoundException */ - public function getAllCountries($pageUid) { - $result = $this->getAllCompanies($pageUid)->toArray(); + public function getAllCountries(int $pageUid, array $filters = []) { + $result = $this->getAllCompanies($pageUid, $filters)->toArray(); $countryArray = []; /** @var Company $company */ @@ -74,11 +77,12 @@ class CompanyRepository extends Repository { * Returns all filtered cities * * @param int $pageUid + * @param array $filters * @return array - * @throws \TYPO3\CMS\Core\Context\Exception\AspectNotFoundException + * @throws AspectNotFoundException */ - public function getAllCities($pageUid) { - $result = $this->getAllCompanies($pageUid)->toArray(); + public function getAllCities(int $pageUid, array $filters = []) { + $result = $this->getAllCompanies($pageUid, $filters)->toArray(); $cityArray = []; /** @var Company $company */ @@ -97,11 +101,12 @@ class CompanyRepository extends Repository { * Returns all company names filtered by page id * * @param int $pageUid + * @param array $filters * @return array - * @throws \TYPO3\CMS\Core\Context\Exception\AspectNotFoundException + * @throws AspectNotFoundException */ - public function getAllCompanyNames($pageUid) { - $result = $this->getAllCompanies($pageUid)->toArray(); + public function getAllCompanyNames(int $pageUid, array $filters = []) { + $result = $this->getAllCompanies($pageUid, $filters)->toArray(); $companyArray = []; /** @var Company $company */ @@ -120,10 +125,11 @@ class CompanyRepository extends Repository { * Returns all companies filtered by page id * * @param int $pageUid - * @return object[]|\TYPO3\CMS\Extbase\Persistence\QueryResultInterface - * @throws \TYPO3\CMS\Core\Context\Exception\AspectNotFoundException + * @param array $filters + * @return object[]|QueryResultInterface + * @throws AspectNotFoundException */ - public function getAllCompanies($pageUid) { + public function getAllCompanies(int $pageUid, array $filters = []) { $companyConstraints = []; $query = $this->createQuery(); $querySettings = $query->getQuerySettings(); @@ -141,6 +147,15 @@ class CompanyRepository extends Repository { ); $companyConstraints[] = $query->equals('pid', $pageUid); + + if (count($filters) > 0) { + $constraints = []; + foreach ($filters as $filter) { + $constraints[] = $query->equals('uid', $filter); + } + $companyConstraints[] = $query->logicalOr($constraints); + } + $query->matching($query->logicalAnd($companyConstraints)); return $query->execute(); diff --git a/Classes/Domain/Repository/DepartmentRepository.php b/Classes/Domain/Repository/DepartmentRepository.php index 21c5c1e542880f1b6f1e9a14aef9fc28411a9a56..d08631a068d0e4e74b11564d3e9ffec61bf14dc0 100644 --- a/Classes/Domain/Repository/DepartmentRepository.php +++ b/Classes/Domain/Repository/DepartmentRepository.php @@ -27,6 +27,7 @@ namespace SGalinski\SgJobs\Domain\Repository; */ use TYPO3\CMS\Extbase\Persistence\QueryInterface; +use TYPO3\CMS\Extbase\Persistence\QueryResultInterface; use TYPO3\CMS\Extbase\Persistence\Repository; /** @@ -43,4 +44,25 @@ class DepartmentRepository extends Repository { 'sorting' => QueryInterface::ORDER_ASCENDING, 'title' => QueryInterface::ORDER_ASCENDING ]; + + /** + * Finds all departments with optional filters + * + * @param array $filters + * @return object[]|QueryResultInterface + */ + public function findAllByFilter(array $filters = []) { + if (count($filters) < 1) { + return $this->findAll(); + } + + $query = $this->createQuery(); + $constraints = []; + foreach ($filters as $filter) { + $constraints[] = $query->equals('uid', $filter); + } + + $query->matching($query->logicalOr($constraints)); + return $query->execute(); + } } diff --git a/Classes/Domain/Repository/ExperienceLevelRepository.php b/Classes/Domain/Repository/ExperienceLevelRepository.php index 905317133b9c3c0fbe7e55e0b59ee246a407cdc6..f36b369f44a053ea7e57dbfc48b362e8e021e0ce 100644 --- a/Classes/Domain/Repository/ExperienceLevelRepository.php +++ b/Classes/Domain/Repository/ExperienceLevelRepository.php @@ -27,6 +27,7 @@ namespace SGalinski\SgJobs\Domain\Repository; */ use TYPO3\CMS\Extbase\Persistence\QueryInterface; +use TYPO3\CMS\Extbase\Persistence\QueryResultInterface; use TYPO3\CMS\Extbase\Persistence\Repository; /** @@ -43,4 +44,25 @@ class ExperienceLevelRepository extends Repository { 'sorting' => QueryInterface::ORDER_ASCENDING, 'title' => QueryInterface::ORDER_ASCENDING ]; + + /** + * Finds all experience levels with optional filters + * + * @param array $filters + * @return object[]|QueryResultInterface + */ + public function findAllByFilter(array $filters = []) { + if (count($filters) < 1) { + return $this->findAll(); + } + + $query = $this->createQuery(); + $constraints = []; + foreach ($filters as $filter) { + $constraints[] = $query->equals('uid', $filter); + } + + $query->matching($query->logicalOr($constraints)); + return $query->execute(); + } }