Skip to content
Snippets Groups Projects
Commit d8ef08a3 authored by Torsten Oppermann's avatar Torsten Oppermann
Browse files

[TASK] Misc bugfixes with the filtering of the jobs

parent 9d99bfbd
No related branches found
No related tags found
No related merge requests found
......@@ -35,11 +35,12 @@ use SGalinski\SgJobs\Service\FrontendFilterService;
* Ajax Controller
*/
class JoblistController extends AbstractAjaxController {
/**
* @var \TYPO3\CMS\Extbase\Object\ObjectManager
* @var \SGalinski\SgJobs\Domain\Repository\CompanyRepository
* @inject
*/
protected $objectManager;
private $companyRepository;
/**
* Show all job offers and options to manage them
......@@ -59,9 +60,21 @@ class JoblistController extends AbstractAjaxController {
'function' => $_POST['parameters']['function'],
];
$this->view->assign('cities', FrontendFilterService::getLocations($filters));
$this->view->assign('companies', FrontendFilterService::getCompanies($filters));
$this->view->assign('areas', FrontendFilterService::getAreas($filters));
$this->view->assign('functions', FrontendFilterService::getFunctions($filters));
// get all correct filter options, based on the selection
$this->view->assign('cities', FrontendFilterService::getLocations($filters, $siteRootId));
$this->view->assign('companies', FrontendFilterService::getCompanies($filters, $siteRootId));
$this->view->assign('areas', FrontendFilterService::getAreas($filters, $siteRootId));
$this->view->assign('functions', FrontendFilterService::getFunctions($filters, $siteRootId));
$this->view->assign('countries', $this->companyRepository->getAllCountries($siteRootId));
// set all filtered jobs
$this->view->assign('jobs', FrontendFilterService::getJobs($filters,$siteRootId));
// set default selected values
$this->view->assign('selectedCountry', $filters['country']);
$this->view->assign('selectedCompany', $filters['company']);
$this->view->assign('selectedLocation', $filters['location']);
$this->view->assign('selectedArea', $filters['area']);
$this->view->assign('selectedFunction', $filters['function']);
}
}
\ No newline at end of file
......@@ -27,8 +27,9 @@ namespace SGalinski\SgJobs\Domain\Repository;
***************************************************************/
use TYPO3\CMS\Core\Database\DatabaseConnection;
use TYPO3\CMS\Extbase\Persistence\Generic\QueryResult;
use TYPO3\CMS\Extbase\Persistence\QueryInterface;
use TYPO3\CMS\Extbase\Persistence\QueryResultInterface;
use TYPO3\CMS\Extbase\Persistence\QueryResultInterface as ExtbaseQueryResultInterface;
use TYPO3\CMS\Extbase\Persistence\Repository;
/**
......@@ -141,4 +142,41 @@ class JobRepository extends Repository {
return $functionArray;
}
/**
* @param int $pageUid
* @param array $companyIds
* @return QueryResultInterface
*/
public function findByCompanyId($pageUid, array $companyIds = []): ExtbaseQueryResultInterface {
/** @var QueryInterface $query */
$query = $this->createQuery();
$querySettings = $query->getQuerySettings();
$querySettings->setStoragePageIds([$pageUid]);
$query->setQuerySettings($querySettings);
$query->setOrderings(
[
'sorting' => QueryInterface::ORDER_ASCENDING,
]
);
$constraints = [];
if (isset($companyIds) && is_array($companyIds) && count($companyIds)) {
$companyConstraints = [];
foreach ($companyIds as $companyId) {
if ((int) $companyId) {
$companyConstraints[] = $query->equals('company', $companyId);
}
}
if (count($companyConstraints)) {
$constraints[] = $query->logicalOr($companyConstraints);
}
}
$query->matching($query->logicalAnd($constraints));
return $query->execute();
}
}
......@@ -29,7 +29,7 @@ namespace SGalinski\SgJobs\Service;
use SGalinski\SgJobs\Domain\Repository\JobRepository;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Persistence\Generic\QueryResult;
use TYPO3\CMS\Extbase\Object\ObjectManager;
/**
* Frontend filter service class
......@@ -37,21 +37,27 @@ use TYPO3\CMS\Extbase\Persistence\Generic\QueryResult;
class FrontendFilterService {
/**
* Get all the locations based on the given filters
*
* @param array $filters
* @param int $siteRootId
* @return array
* @throws \InvalidArgumentException
*/
public static function getLocations(array $filters = []) {
public static function getLocations(array $filters = [], $siteRootId): array {
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(
'tx_sgjobs_domain_model_company'
);
$statement = $queryBuilder->select('city')
->from('tx_sgjobs_domain_model_company')
->where(
->from('tx_sgjobs_domain_model_company');
if ($filters['country'] !== '0' && $filters['country'] !== NULL) {
$statement->andWhere(
$queryBuilder->expr()->eq(
'country', $queryBuilder->createNamedParameter($filters['country'])
'b.country', $queryBuilder->createNamedParameter($filters['country'])
)
);
}
if ($filters['location'] !== '0') {
$statement->andWhere(
......@@ -69,6 +75,12 @@ class FrontendFilterService {
);
}
$statement->andWhere(
$queryBuilder->expr()->eq(
'pid', $queryBuilder->createNamedParameter($siteRootId)
)
);
$locations = $statement->execute()->fetchAll();
$result = [];
$result[0] = '';
......@@ -80,16 +92,20 @@ class FrontendFilterService {
}
/**
* Get all the companies based on the given filters
*
* @param array $filters
* @param int $siteRootId
* @return array
* @throws \InvalidArgumentException
*/
public static function getCompanies(array $filters = []): array {
public static function getCompanies(array $filters = [], $siteRootId): array {
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(
'tx_sgjobs_domain_model_company'
);
$statement = $queryBuilder->select('name')
->from('tx_sgjobs_domain_model_company');
if ($filters['location'] !== '0' && $filters['location'] !== NULL) {
$queryBuilder->where(
$queryBuilder->expr()->eq(
......@@ -98,6 +114,14 @@ class FrontendFilterService {
);
}
if ($filters['country'] !== '0' && $filters['country'] !== NULL) {
$statement->andWhere(
$queryBuilder->expr()->eq(
'b.country', $queryBuilder->createNamedParameter($filters['country'])
)
);
}
if ($filters['country'] !== '0' && $filters['country'] !== NULL) {
$statement->andWhere(
$queryBuilder->expr()->eq(
......@@ -114,6 +138,12 @@ class FrontendFilterService {
);
}
$statement->andWhere(
$queryBuilder->expr()->eq(
'pid', $queryBuilder->createNamedParameter($siteRootId)
)
);
$companies = $statement->execute()->fetchAll();
$result = [];
......@@ -126,11 +156,14 @@ class FrontendFilterService {
}
/**
* Get all the areas based on the given filters
*
* @param array $filters
* @param int $siteRootId
* @return array
* @throws \InvalidArgumentException
*/
public static function getAreas(array $filters = []): array {
public static function getAreas(array $filters = [], $siteRootId): array {
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(
'tx_sgjobs_domain_model_company'
);
......@@ -140,12 +173,15 @@ class FrontendFilterService {
->join(
'a', 'tx_sgjobs_domain_model_company', 'b'
, $queryBuilder->expr()->eq('a.company', 'b.uid')
)
->where(
);
if ($filters['country'] !== '0' && $filters['country'] !== NULL) {
$statement->andWhere(
$queryBuilder->expr()->eq(
'b.country', $queryBuilder->createNamedParameter($filters['country'])
)
);
}
if ($filters['city'] !== '0' && $filters['city'] !== NULL) {
$statement->andWhere(
......@@ -163,6 +199,12 @@ class FrontendFilterService {
);
}
$statement->andWhere(
$queryBuilder->expr()->eq(
'a.pid', $queryBuilder->createNamedParameter($siteRootId)
)
);
$areas = $statement->execute()->fetchAll();
$result = [];
......@@ -175,11 +217,14 @@ class FrontendFilterService {
}
/**
* Get all the functions based on the given filters
*
* @param array $filters
* @param int $siteRootId
* @return array
* @throws \InvalidArgumentException
*/
public static function getFunctions(array $filters = []): array {
public static function getFunctions(array $filters = [], $siteRootId): array {
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(
'tx_sgjobs_domain_model_company'
);
......@@ -189,12 +234,15 @@ class FrontendFilterService {
->join(
'a', 'tx_sgjobs_domain_model_company', 'b'
, $queryBuilder->expr()->eq('a.company', 'b.uid')
)
->where(
);
if ($filters['country'] !== '0' && $filters['country'] !== NULL) {
$statement->andWhere(
$queryBuilder->expr()->eq(
'b.country', $queryBuilder->createNamedParameter($filters['country'])
)
);
}
if ($filters['city'] !== '0' && $filters['city'] !== NULL) {
$statement->andWhere(
......@@ -220,6 +268,12 @@ class FrontendFilterService {
);
}
$statement->andWhere(
$queryBuilder->expr()->eq(
'a.pid', $queryBuilder->createNamedParameter($siteRootId)
)
);
$functions = $statement->execute()->fetchAll();
$result = [];
......@@ -232,9 +286,11 @@ class FrontendFilterService {
}
/**
* Get all the jobs based on the given filters
*
* @param array $filters
* @param int $siteRootId
* @return QueryResult
* @return mixed
* @throws \InvalidArgumentException
*/
public static function getJobs(array $filters = [], $siteRootId): array {
......@@ -248,17 +304,20 @@ class FrontendFilterService {
->join(
'a', 'tx_sgjobs_domain_model_company', 'b'
, $queryBuilder->expr()->eq('a.company', 'b.uid')
)
->where(
);
if ($filters['country'] !== '0' && $filters['country'] !== NULL) {
$statement->andWhere(
$queryBuilder->expr()->eq(
'b.country', $queryBuilder->createNamedParameter($filters['country'])
)
);
}
if ($filters['city'] !== '0' && $filters['city'] !== NULL) {
if ($filters['location'] !== '0' && $filters['location'] !== NULL) {
$statement->andWhere(
$queryBuilder->expr()->eq(
'b.city', $queryBuilder->createNamedParameter($filters['city'])
'b.city', $queryBuilder->createNamedParameter($filters['location'])
)
);
}
......@@ -279,6 +338,12 @@ class FrontendFilterService {
);
}
$statement->andWhere(
$queryBuilder->expr()->eq(
'b.pid', $queryBuilder->createNamedParameter($siteRootId)
)
);
$companies = $statement->execute()->fetchAll();
$result = [];
......@@ -288,8 +353,9 @@ class FrontendFilterService {
}
// use company ids to filter the jobs
$objectManager = GeneralUtility::makeInstance(ObjectManager::class);
/** @var JobRepository $jobRepository */
$jobRepository = GeneralUtility::makeInstance(JobRepository::class);
return $jobRepository->findByCompanyId($siteRootId, $result);
$jobRepository = $objectManager->get(JobRepository::class);
return $jobRepository->findByCompanyId($siteRootId, $result)->toArray();
}
}
<f:form id="sgjobs-filter" action="index" controller="Joblist" method="post" objectName="filters" object="{filters}">
<f:form.select class="sgjobs-select form-control" multiple="0" size="1" property="filterCountry" optionValueField="value" options="{countries}" id="filter-countries" />
<f:form.select class="sgjobs-select form-control" multiple="0" size="1" property="filterLocation" optionValueField="value" options="{cities}" id="filter-locations" />
<f:form.select class="sgjobs-select form-control" multiple="0" size="1" property="filterCompany" optionValueField="value" options="{companies}" id="filter-companies" />
<f:form.select class="sgjobs-select form-control" multiple="0" size="1" property="filterArea" optionValueField="value" options="{areas}" id="filter-areas" />
<f:form.select class="sgjobs-select form-control" multiple="0" size="1" property="filterFunction" optionValueField="value" options="{functions}" id="filter-functions" />
<f:form.select class="sgjobs-select form-control" multiple="0" size="1" value="{selectedCountry}" property="filterCountry" optionValueField="value" options="{countries}" id="filter-countries" />
<f:form.select class="sgjobs-select form-control" multiple="0" size="1" value="{selectedLocation}" property="filterLocation" optionValueField="value" options="{cities}" id="filter-locations" />
<f:form.select class="sgjobs-select form-control" multiple="0" size="1" value="{selectedCompany}" property="filterCompany" optionValueField="value" options="{companies}" id="filter-companies" />
<f:form.select class="sgjobs-select form-control" multiple="0" size="1" value="{selectedArea}" property="filterArea" optionValueField="value" options="{areas}" id="filter-areas" />
<f:form.select class="sgjobs-select form-control" multiple="0" size="1" value="{selectedFunction}" property="filterFunction" optionValueField="value" options="{functions}" id="filter-functions" />
</f:form>
<f:render
partial="Filter"
arguments="{filters: filters, countries: countries, cities: cities, companies: companies, areas: areas, functions: functions}"
arguments="{filters: filters, countries: countries, cities: cities, companies: companies, areas: areas,
functions: functions, selectedCountry: selectedCountry, selectedCompany: selectedCompany,
selectedLocation: selectedLocation, selectedArea: selectedArea, selectedFunction: selectedFunction}"
/>
<f:for each="{jobs}" as="job">
......
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