Skip to content
Snippets Groups Projects
Commit 85580252 authored by Michael Kessler's avatar Michael Kessler
Browse files

[FEATURE] Assign frontend filter values based on filter configuration

parent 81a5d976
No related branches found
No related tags found
1 merge request!40Feature advanced filters
...@@ -572,20 +572,20 @@ class JoblistController extends ActionController { ...@@ -572,20 +572,20 @@ class JoblistController extends ActionController {
* @param int $rootPageId * @param int $rootPageId
* @throws AspectNotFoundException * @throws AspectNotFoundException
*/ */
protected function assignFilterValues(int $rootPageId, array $filters): void { protected function assignFilterValues(int $rootPageId, array $filters = []): void {
$countries = $this->companyRepository->getAllCountries($rootPageId); $countries = $this->companyRepository->getAllCountries($rootPageId, $filters['filterByLocation'] ?? []);
$this->view->assign('countries', $countries); $this->view->assign('countries', $countries);
$cities = $this->companyRepository->getAllCities($rootPageId); $cities = $this->companyRepository->getAllCities($rootPageId, $filters['filterByLocation'] ?? []);
$this->view->assign('cities', $cities); $this->view->assign('cities', $cities);
$companies = $this->companyRepository->getAllCompanyNames($rootPageId); $companies = $this->companyRepository->getAllCompanyNames($rootPageId, $filters['filterByLocation'] ?? []);
$this->view->assign('companies', $companies); $this->view->assign('companies', $companies);
$departments = $this->departmentRepository->findAll(); $departments = $this->departmentRepository->findAllByFilter($filters['filterByDepartment'] ?? []);
$this->view->assign('departments', $departments); $this->view->assign('departments', $departments);
$experienceLevels = $this->experienceLevelRepository->findAll(); $experienceLevels = $this->experienceLevelRepository->findAllByFilter($filters['filterByExperienceLevel'] ?? []);
$this->view->assign('experienceLevels', $experienceLevels); $this->view->assign('experienceLevels', $experienceLevels);
} }
......
...@@ -28,8 +28,10 @@ namespace SGalinski\SgJobs\Domain\Repository; ...@@ -28,8 +28,10 @@ namespace SGalinski\SgJobs\Domain\Repository;
use SGalinski\SgJobs\Domain\Model\Company; use SGalinski\SgJobs\Domain\Model\Company;
use TYPO3\CMS\Core\Context\Context; use TYPO3\CMS\Core\Context\Context;
use TYPO3\CMS\Core\Context\Exception\AspectNotFoundException;
use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Persistence\QueryInterface; use TYPO3\CMS\Extbase\Persistence\QueryInterface;
use TYPO3\CMS\Extbase\Persistence\QueryResultInterface;
use TYPO3\CMS\Extbase\Persistence\Repository; use TYPO3\CMS\Extbase\Persistence\Repository;
/** /**
...@@ -51,11 +53,12 @@ class CompanyRepository extends Repository { ...@@ -51,11 +53,12 @@ class CompanyRepository extends Repository {
* Returns all countries filtered by page id * Returns all countries filtered by page id
* *
* @param int $pageUid * @param int $pageUid
* @param array $filters
* @return array * @return array
* @throws \TYPO3\CMS\Core\Context\Exception\AspectNotFoundException * @throws AspectNotFoundException
*/ */
public function getAllCountries($pageUid) { public function getAllCountries(int $pageUid, array $filters = []) {
$result = $this->getAllCompanies($pageUid)->toArray(); $result = $this->getAllCompanies($pageUid, $filters)->toArray();
$countryArray = []; $countryArray = [];
/** @var Company $company */ /** @var Company $company */
...@@ -74,11 +77,12 @@ class CompanyRepository extends Repository { ...@@ -74,11 +77,12 @@ class CompanyRepository extends Repository {
* Returns all filtered cities * Returns all filtered cities
* *
* @param int $pageUid * @param int $pageUid
* @param array $filters
* @return array * @return array
* @throws \TYPO3\CMS\Core\Context\Exception\AspectNotFoundException * @throws AspectNotFoundException
*/ */
public function getAllCities($pageUid) { public function getAllCities(int $pageUid, array $filters = []) {
$result = $this->getAllCompanies($pageUid)->toArray(); $result = $this->getAllCompanies($pageUid, $filters)->toArray();
$cityArray = []; $cityArray = [];
/** @var Company $company */ /** @var Company $company */
...@@ -97,11 +101,12 @@ class CompanyRepository extends Repository { ...@@ -97,11 +101,12 @@ class CompanyRepository extends Repository {
* Returns all company names filtered by page id * Returns all company names filtered by page id
* *
* @param int $pageUid * @param int $pageUid
* @param array $filters
* @return array * @return array
* @throws \TYPO3\CMS\Core\Context\Exception\AspectNotFoundException * @throws AspectNotFoundException
*/ */
public function getAllCompanyNames($pageUid) { public function getAllCompanyNames(int $pageUid, array $filters = []) {
$result = $this->getAllCompanies($pageUid)->toArray(); $result = $this->getAllCompanies($pageUid, $filters)->toArray();
$companyArray = []; $companyArray = [];
/** @var Company $company */ /** @var Company $company */
...@@ -120,10 +125,11 @@ class CompanyRepository extends Repository { ...@@ -120,10 +125,11 @@ class CompanyRepository extends Repository {
* Returns all companies filtered by page id * Returns all companies filtered by page id
* *
* @param int $pageUid * @param int $pageUid
* @return object[]|\TYPO3\CMS\Extbase\Persistence\QueryResultInterface * @param array $filters
* @throws \TYPO3\CMS\Core\Context\Exception\AspectNotFoundException * @return object[]|QueryResultInterface
* @throws AspectNotFoundException
*/ */
public function getAllCompanies($pageUid) { public function getAllCompanies(int $pageUid, array $filters = []) {
$companyConstraints = []; $companyConstraints = [];
$query = $this->createQuery(); $query = $this->createQuery();
$querySettings = $query->getQuerySettings(); $querySettings = $query->getQuerySettings();
...@@ -141,6 +147,15 @@ class CompanyRepository extends Repository { ...@@ -141,6 +147,15 @@ class CompanyRepository extends Repository {
); );
$companyConstraints[] = $query->equals('pid', $pageUid); $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)); $query->matching($query->logicalAnd($companyConstraints));
return $query->execute(); return $query->execute();
......
...@@ -27,6 +27,7 @@ namespace SGalinski\SgJobs\Domain\Repository; ...@@ -27,6 +27,7 @@ namespace SGalinski\SgJobs\Domain\Repository;
*/ */
use TYPO3\CMS\Extbase\Persistence\QueryInterface; use TYPO3\CMS\Extbase\Persistence\QueryInterface;
use TYPO3\CMS\Extbase\Persistence\QueryResultInterface;
use TYPO3\CMS\Extbase\Persistence\Repository; use TYPO3\CMS\Extbase\Persistence\Repository;
/** /**
...@@ -43,4 +44,25 @@ class DepartmentRepository extends Repository { ...@@ -43,4 +44,25 @@ class DepartmentRepository extends Repository {
'sorting' => QueryInterface::ORDER_ASCENDING, 'sorting' => QueryInterface::ORDER_ASCENDING,
'title' => 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();
}
} }
...@@ -27,6 +27,7 @@ namespace SGalinski\SgJobs\Domain\Repository; ...@@ -27,6 +27,7 @@ namespace SGalinski\SgJobs\Domain\Repository;
*/ */
use TYPO3\CMS\Extbase\Persistence\QueryInterface; use TYPO3\CMS\Extbase\Persistence\QueryInterface;
use TYPO3\CMS\Extbase\Persistence\QueryResultInterface;
use TYPO3\CMS\Extbase\Persistence\Repository; use TYPO3\CMS\Extbase\Persistence\Repository;
/** /**
...@@ -43,4 +44,25 @@ class ExperienceLevelRepository extends Repository { ...@@ -43,4 +44,25 @@ class ExperienceLevelRepository extends Repository {
'sorting' => QueryInterface::ORDER_ASCENDING, 'sorting' => QueryInterface::ORDER_ASCENDING,
'title' => 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();
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment