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

[TASK] Fixing issues with with the filters

parent a4bdb591
No related branches found
No related tags found
No related merge requests found
......@@ -27,6 +27,7 @@ namespace SGalinski\SgJobs\Controller;
***************************************************************/
use SGalinski\SgJobs\Domain\Model\JobApplication;
use SGalinski\SgJobs\Service\FrontendFilterService;
use SGalinski\SgMail\Service\MailTemplateService;
use TYPO3\CMS\Core\Log\LogLevel;
use TYPO3\CMS\Core\Resource\DuplicationBehavior;
......@@ -56,11 +57,20 @@ class JoblistController extends ActionController {
/**
* Show all job offers and options to manage them
*
* @param array $filters
* @return void
* @throws \TYPO3\CMS\Extbase\Persistence\Exception\InvalidQueryException
* @throws \InvalidArgumentException
*/
public function indexAction() {
public function indexAction(array $filters = []) {
if ($filters) {
$this->view->assign('selectedCountry', $filters['filterCountry']);
$this->view->assign('selectedCompany', $filters['filterCompany']);
$this->view->assign('selectedLocation', $filters['filterLocation']);
$this->view->assign('selectedArea', $filters['filterArea']);
$this->view->assign('selectedFunction', $filters['filterFunction']);
}
$storagePid = (int) $this->configurationManager->getConfiguration(
ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK
)['persistence']['storagePid'];
......@@ -77,10 +87,10 @@ class JoblistController extends ActionController {
}
// get all jobs for the current page
$jobs = $this->jobRepository->findJobs($storagePid, [], FALSE, $jobLimit, $offset);
$jobs = FrontendFilterService::getJobs($filters, $storagePid, $jobLimit, $offset);
// get all jobs for the current page
$jobsCount = \count($this->jobRepository->findJobs($storagePid));
$jobsCount = \count(FrontendFilterService::getJobs($filters, $storagePid));
$numberOfPages = ($jobLimit <= 0 ? 0 : ceil($jobsCount / $jobLimit));
$this->view->assign('jobs', $jobs);
......
......@@ -182,7 +182,7 @@ class JobRepository extends Repository {
if (isset($companyIds) && \is_array($companyIds) && \count($companyIds)) {
$companyConstraints = [];
foreach ($companyIds as $companyId) {
if ((int) $companyId) {
if ($companyId) {
$companyConstraints[] = $query->equals('company', $companyId);
}
}
......@@ -205,4 +205,56 @@ class JobRepository extends Repository {
return $query->execute();
}
/**
* Returns a job filtered by company and page id
*
* @param int $pageUid
* @param array $jobIds
* @param int $limit
* @param int $offset
* @return QueryResultInterface
*/
public function findByJobIds($pageUid, array $jobIds = [], $limit = 0, $offset = 0
): 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($jobIds) && \is_array($jobIds) && \count($jobIds)) {
$companyConstraints = [];
foreach ($jobIds as $jobId) {
if ($jobId) {
$companyConstraints[] = $query->equals('uid', $jobId);
}
}
if (\count($companyConstraints)) {
$constraints[] = $query->logicalOr($companyConstraints);
}
}
if (\count($constraints)) {
$query->matching($query->logicalAnd($constraints));
}
if ($limit > 0) {
$query->setLimit($limit);
}
if ($offset > 0) {
$query->setOffset($offset);
}
return $query->execute();
}
}
......@@ -52,49 +52,49 @@ class FrontendFilterService {
'tx_sgjobs_domain_model_company'
);
$statement = $queryBuilder->select('b.uid')
$statement = $queryBuilder->select('a.uid')
->from('tx_sgjobs_domain_model_job', 'a')
->join(
'a', 'tx_sgjobs_domain_model_company', 'b'
, $queryBuilder->expr()->eq('a.company', 'b.uid')
);
if ($filters['country'] !== '0' && $filters['country'] !== NULL) {
if ($filters['filterCountry'] !== '0' && $filters['filterCountry'] !== NULL) {
$statement->andWhere(
$queryBuilder->expr()->eq(
'b.country', $queryBuilder->createNamedParameter($filters['country'])
'b.country', $queryBuilder->createNamedParameter($filters['filterCountry'])
)
);
}
if ($filters['location'] !== '0' && $filters['location'] !== NULL) {
if ($filters['filterLocation'] !== '0' && $filters['filterLocation'] !== NULL) {
$statement->andWhere(
$queryBuilder->expr()->eq(
'b.city', $queryBuilder->createNamedParameter($filters['location'])
'b.city', $queryBuilder->createNamedParameter($filters['filterLocation'])
)
);
}
if ($filters['company'] !== '0' && $filters['company'] !== NULL) {
if ($filters['filterCompany'] !== '0' && $filters['filterCompany'] !== NULL) {
$statement->andWhere(
$queryBuilder->expr()->eq(
'b.name', $queryBuilder->createNamedParameter($filters['company'])
'b.name', $queryBuilder->createNamedParameter($filters['filterCompany'])
)
);
}
if ($filters['area'] !== '0' && $filters['area'] !== NULL) {
if ($filters['filterArea'] !== '0' && $filters['filterArea'] !== NULL) {
$statement->andWhere(
$queryBuilder->expr()->eq(
'a.area', $queryBuilder->createNamedParameter($filters['area'])
'a.area', $queryBuilder->createNamedParameter($filters['filterArea'])
)
);
}
if ($filters['function'] !== '0' && $filters['function'] !== NULL) {
if ($filters['filterFunction'] !== '0' && $filters['filterFunction'] !== NULL) {
$statement->andWhere(
$queryBuilder->expr()->eq(
'a.job_function', $queryBuilder->createNamedParameter($filters['function'])
'a.job_function', $queryBuilder->createNamedParameter($filters['filterFunction'])
)
);
}
......@@ -124,6 +124,6 @@ class FrontendFilterService {
}
// return the filtered jobs
return $jobRepository->findByCompanyId($recordPageId, $result, $limit, $offset)->toArray();
return $jobRepository->findByJobIds($recordPageId, $result, $limit, $offset)->toArray();
}
}
......@@ -4,7 +4,7 @@ return [
'extension_key' => 'sg_jobs',
'template_key' => 'application_mail',
'description' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang.xlf:mail.application.description',
'subject' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang.xlf:mail.application.subject',
'subject' => 'Eine neue Bewerbung',
'markers' => [
[
'marker' => 'jobtitle',
......
<f:form id="sgjobs-filter" action="index" controller="Joblist" method="post" objectName="filters" object="{filters}">
<f:form id="sgjobs-filter" action="index" controller="Joblist" method="get" objectName="filters" object="{filters}">
<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" />
......
{namespace sg=SGalinski\SgJobs\ViewHelpers}
<f:layout name="Default" />
<f:section name="main">
<div id="sgjobs-joblist">
<f:render
partial="Filter"
arguments="{recordPageId: recordPageId, filters: filters, countries: countries, cities: cities, companies: companies, areas: areas, functions: functions, limit: limit}"
arguments="{recordPageId: recordPageId, filters: filters, countries: countries, cities: cities, companies: companies, areas: areas,
functions: functions, selectedCountry: selectedCountry, selectedCompany: selectedCompany,
selectedLocation: selectedLocation, selectedArea: selectedArea, selectedFunction: selectedFunction, limit: limit}"
/>
<f:for each="{jobs}" as="job">
......
......@@ -37,27 +37,11 @@ export default class SgJobs {
}
/**
* Filter for the joblist
* Filter for the joblist, simply apply the form
*
* @private
*/
_filterJoblist() {
$.post(
'?eID=sgAjax&extensionName=SgJobs&controller=Ajax%5CJoblist&action=filter&format=html',
{
recordPageId: $('#filter-recordPageId').val(),
parameters: {
country: $('#filter-countries').val(),
location: $('#filter-locations').val(),
company: $('#filter-companies').val(),
area: $('#filter-areas').val(),
function: $('#filter-functions').val(),
limit: $('#filter-limit').val()
}
}
).done(function(result) {
// replace filter & job list with result from ajax controller
$('#sgjobs-joblist').html(result);
});
$('#sgjobs-filter').submit();
}
}
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