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 {
* @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);
}
......
......@@ -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();
......
......@@ -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();
}
}
......@@ -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();
}
}
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