Hallo in die Runde,
ich habe aktuell ein kleines Problem mit der Filterung für die Extension Job Fair. Standardmäßig sind die Dropdowns für die Filter als Multiselect ausgewiesen. Allerdings funktionieren die bereits implementierten Extbase Queries nicht für Multiselect Anfragen.
Hier ist die Repository Function für die Filterung:
Angenommen ich habe nun drei Filter Kategorien, in dem Fall $categories, $regions und $educations. Wenn ich nun von jedem Filter nur eine Eigenschaft auswähle funktioniert es wunderbar, wenn ich allerdings in einem Feld mehrere Eigenschaften auswähle kombiniert er diese mit einem OR anstatt einem AND.
In einem ganz simplen Query, ohne jeglichen relations hätte ich gerne folgendes Query:
SELECT * FROM xxx WHERE category IN (value1, value2, etc) AND region IN (value1, value2,...) AND education IN (value1, value2,)..
Ich habe nun versucht um die einzelnen Eigenschaften ein logicalOr einzubauen:
Allerdings scheint dies keinerlei Auswirkungen zu haben.
Ich vermute es irgendein dummer Logikfehler von mir, aber das muss doch sicherlich relativ simpel zu lösen sein?
Ich wäre sehr dankbar für euer Feedback!
LG,
niseDen
ich habe aktuell ein kleines Problem mit der Filterung für die Extension Job Fair. Standardmäßig sind die Dropdowns für die Filter als Multiselect ausgewiesen. Allerdings funktionieren die bereits implementierten Extbase Queries nicht für Multiselect Anfragen.
Hier ist die Repository Function für die Filterung:
PHP-Code:
/** * Find by filter in front end
*
* @param \Dan\Jobfair\Domain\Model\Filter $filter
* @return array|\TYPO3\CMS\Extbase\Persistence\QueryResultInterface
*/
public function findFiltered(Filter $filter = NULL) {
$query = $this->createQuery();
$constraints = array(); //to collect all filter constraints
if ($filter !== NULL) {
//jobtype
$jobType = $filter->getJobType();
if (($jobType!== NULL) && ($jobType != 99)) { // 99 is used as "all" option in hard coded select forms
$constraints[] = $query->equals('job_type', $jobType);
}
//contracttype
$contractType = $filter->getContractType();
if (($jobType!== NULL) && ($contractType != 99)) { // 99 is used as "all" option in hard coded select forms
$constraints[] = $query->equals('contract_type', $contractType);
}
//category
if ($filter->getCategories() !== NULL) {
$allOptionSelected = false;
$categories = $filter->getCategories();
foreach($categories as $category) {
if(!$category instanceof Category) {
$allOptionSelected = true;
}
//Only add constraints if the "all" option is not selected
if(!$allOptionSelected) {
$constraints[] = $query->contains('category', $category);
}
}
}
//region
if ($filter->getRegions() !== NULL) {
$allOptionSelected = false;
$regions = $filter->getRegions();
foreach($regions as $region) {
if(!$region instanceof Region) {
$allOptionSelected = true;
}
//Only add constraints if the "all" option is not selected
if(!$allOptionSelected) {
$constraints[] = $query->contains('region', $region);
}
}
}
//sector
if ($filter->getSectors() !== NULL) {
$allOptionSelected = false;
$sectors = $filter->getSectors();
foreach($sectors as $sector) {
if(!$sector instanceof Sector) {
$allOptionSelected = true;
}
//Only add constraints if the "all" option is not selected
if(!$allOptionSelected) {
$constraints[] = $query->contains('sector', $sector);
}
}
}
//discipline
if ($filter->getDisciplines() !== NULL) {
$allOptionSelected = false;
$disciplines = $filter->getDisciplines();
foreach($disciplines as $discipline) {
if(!$discipline instanceof Discipline) {
$allOptionSelected = true;
}
//Only add constraints if the "all" option is not selected
if(!$allOptionSelected) {
$constraints[] = $query->contains('discipline', $discipline);
}
}
}
//education
if ($filter->getEducations() !== NULL) {
$allOptionSelected = false;
$educations = $filter->getEducations();
foreach($educations as $education) {
if(!$education instanceof Education) {
$allOptionSelected = true;
}
//Only add constraints if the "all" option is not selected
if(!$allOptionSelected) {
$constraints[] = $query->contains('education', $education);
}
}
}
if ($filter->getSearchword() !== NULL) {
$or = array();
$searchwords = GeneralUtility::trimExplode(' ', $filter->getSearchword(), 1);
foreach ($searchwords as $searchword) {
$or[] = $query->like('job_title', '%' . $searchword . '%');
$or[] = $query->like('employer', '%' . $searchword . '%');
$or[] = $query->like('employer_description', '%' . $searchword . '%');
$or[] = $query->like('location', '%' . $searchword . '%');
$or[] = $query->like('short_job_description', '%' . $searchword . '%');
$or[] = $query->like('job_description', '%' . $searchword . '%');
$or[] = $query->like('experience', '%' . $searchword . '%');
$or[] = $query->like('job_requirements', '%' . $searchword . '%');
$or[] = $query->like('job_benefits', '%' . $searchword . '%');
$or[] = $query->like('apply_information', '%' . $searchword . '%');
$or[] = $query->like('salary', '%' . $searchword . '%');
$constraints[] = $query->logicalOr($or);
}
}
if(sizeof($constraints) > 0) {
$query->matching($query->logicalAnd($constraints));
return $query->execute();
}
}
return $this->findAll();
}
In einem ganz simplen Query, ohne jeglichen relations hätte ich gerne folgendes Query:
SELECT * FROM xxx WHERE category IN (value1, value2, etc) AND region IN (value1, value2,...) AND education IN (value1, value2,)..
Ich habe nun versucht um die einzelnen Eigenschaften ein logicalOr einzubauen:
PHP-Code:
//region if ($filter->getRegions() !== NULL) {
$allOptionSelected = false;
$regions = $filter->getRegions();
foreach($regions as $region) {
if(!$region instanceof Region) {
$allOptionSelected = true;
}
//Only add constraints if the "all" option is not selected
if(!$allOptionSelected) {
$constraints[] = $query->logicalOr(
$query->contains('region', $region)
)
}
}
}
Ich vermute es irgendein dummer Logikfehler von mir, aber das muss doch sicherlich relativ simpel zu lösen sein?
Ich wäre sehr dankbar für euer Feedback!
LG,
niseDen
Job Fair Filterung für Mehrfachselektion
Aucun commentaire:
Enregistrer un commentaire