jeudi 25 juin 2015

Job Fair Filterung für Mehrfachselektion

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:
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();


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:
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)
                        )
                    }
                }


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


Job Fair Filterung für Mehrfachselektion

Aucun commentaire:

Enregistrer un commentaire