### Controller ###
public function listAction($search = NULL) {
if ($search === NULL) {
/** @var ...\Domain\Model\Search $search */
$search = $this->objectManager->get('...\\Domain\\Model\\Search');
$this->getCategorySearchFilterFromFlexForm($search); // this sets some preconfigured values from a flexform
}
$records = $this->recordRepository->findBySearchParameters($search);
$this->view->assign('search', $search);
$this->view->assign('records', $records);
}
### Repository ###
/**
* @param Search $search
*
* @return array|\TYPO3\CMS\Extbase\Persistence\QueryResultInterface
*/
public function findBySearchParameters(Search $search) {
/** @var $query \TYPO3\CMS\Extbase\Persistence\QueryInterface */
$query = $this->createQuery();
$query->setOrderings(array('sorting' => QueryInterface::ORDER_DESCENDING));
$properties = array();
if ($search->getCategories()) {
$this->getCategoryProperties($search->getCategories(), $query, $properties);
}
if ($search->getPremiumFilter() === TRUE || $search->getPremiumFilter() === FALSE) {
$properties[] = $query->equals('premium', $search->getPremiumFilter());
}
// in case premium only is set, don't care about other filters
if ($search->getPremiumFilter() === TRUE) {
if (count($properties) == 0) {
return $this->findAll();
} elseif (count($properties) == 1) {
$query->matching(
$properties[0]
);
} else {
$query->matching(
$query->logicalAnd(
$properties
)
);
}
$result = $query->execute();
return $result;
}
// get the searchWord properties
if (strlen($search->getSearchword()) > 0) {
$this->getSearchWordProperties($search->getSearchword(), $query, $properties, $search->getModel());
}
if ($search->getLocationRange() > 0) {
$properties[] = $query->equals('locationRange', $search->getLocationRange());
}
if ($search->getPriceRange() > 0) {
$properties[] = $query->equals('priceRange', $search->getPriceRange());
}
if ($search->getClassification() > 0) {
$properties[] = $query->equals('classification', $search->getClassification());
}
if (count($properties) == 0) {
return $this->findAll();
} elseif (count($properties) == 1) {
$query->matching(
$properties[0]
);
} else {
$query->matching(
$query->logicalAnd(
$properties
)
);
}
$result = $query->execute();
return $result;
}
### View ###
Search form to filter the record list:
{f:if(condition:search_show, then: '', else: 'style="display:none;"')} >
{f:translate(key:'search.reset')}
List of records: