Skip to content

Commit

Permalink
added support for tags bundle in text concat type
Browse files Browse the repository at this point in the history
  • Loading branch information
Dennis Patzer committed Dec 10, 2018
1 parent e87fe1a commit a025b57
Show file tree
Hide file tree
Showing 2 changed files with 106 additions and 28 deletions.
64 changes: 48 additions & 16 deletions src/Choice/YearChoice.php
Expand Up @@ -14,6 +14,9 @@
use Contao\StringUtil;
use Contao\System;
use HeimrichHannot\FilterBundle\Filter\AbstractType;
use HeimrichHannot\FilterBundle\Filter\Type\PublishedType;
use HeimrichHannot\FilterBundle\Filter\Type\SkipParentsType;
use HeimrichHannot\FilterBundle\Filter\Type\SqlType;
use HeimrichHannot\FilterBundle\Model\FilterConfigElementModel;
use HeimrichHannot\UtilsBundle\Choice\AbstractChoice;
use HeimrichHannot\UtilsBundle\Model\ModelUtil;
Expand Down Expand Up @@ -53,28 +56,57 @@ protected function collect()
$values = [];

foreach ($elements as $entry) {
if ($entry->isInitial && $entry->id !== $element->id) {
switch ($entry->initialValueType) {
case AbstractType::VALUE_TYPE_SCALAR:
$operator = System::getContainer()->get('huh.utils.database')->transformVerboseOperator($entry->operator);
switch ($entry->type) {
case SkipParentsType::TYPE:
$skipParentsType = new SkipParentsType(System::getContainer()->get('huh.filter.config'));

$columns[] = $entry->field.' '.$operator.' ?';
$values[] = $entry->initialValue;
list($elementColumns, $elementValues) = $skipParentsType->buildQueryForModels($filter, $entry);

break;
$columns = array_merge($columns, $elementColumns);
$values = array_merge($values, $elementValues);

case AbstractType::VALUE_TYPE_ARRAY:
$value = array_column(StringUtil::deserialize($entry->initialValueArray), 'value');
break;

if (empty($value) || empty($value[0])) {
continue;
case PublishedType::TYPE:
$publishedType = new PublishedType(System::getContainer()->get('huh.filter.config'));

list($elementColumns, $elementValues) = $publishedType->buildQueryForModels($filter, $entry);

$columns = array_merge($columns, $elementColumns);
$values = array_merge($values, $elementValues);

break;

case SqlType::TYPE:
$columns[] = Controller::replaceInsertTags($entry->whereSql, false);

break;

default:
if ($entry->isInitial && $entry->id !== $element->id) {
switch ($entry->initialValueType) {
case AbstractType::VALUE_TYPE_SCALAR:
$operator = System::getContainer()->get('huh.utils.database')->transformVerboseOperator($entry->operator);

$columns[] = $entry->field.' '.$operator.' ?';
$values[] = $entry->initialValue;

break;

case AbstractType::VALUE_TYPE_ARRAY:
$value = array_column(StringUtil::deserialize($entry->initialValueArray), 'value');

if (empty($value) || empty($value[0])) {
continue;
}

$columns[] = $entry->field.' IN ('.implode(',', $value).')';

break;
}
$columns[] = $entry->field.' IN ('.implode(',', $value).')';
}

break;
}
} elseif ('sql' === $entry->type) {
$columns[] = Controller::replaceInsertTags($entry->whereSql, false);
break;
}
}
$options = [];
Expand Down
70 changes: 58 additions & 12 deletions src/Filter/Type/TextConcatType.php
Expand Up @@ -8,7 +8,9 @@

namespace HeimrichHannot\FilterBundle\Filter\Type;

use Contao\Database;
use Contao\StringUtil;
use Contao\System;
use HeimrichHannot\FilterBundle\Filter\AbstractType;
use HeimrichHannot\FilterBundle\Model\FilterConfigElementModel;
use HeimrichHannot\FilterBundle\QueryBuilder\FilterQueryBuilder;
Expand All @@ -28,6 +30,10 @@ public function buildQuery(FilterQueryBuilder $builder, FilterConfigElementModel
$filter = $this->config->getFilter();
$name = $this->getName($element);

System::getContainer()->get('huh.utils.dca')->loadDc($filter['dataContainer']);

$dca = $GLOBALS['TL_DCA'][$filter['dataContainer']];

if (!isset($data[$name])) {
return;
}
Expand All @@ -39,18 +45,58 @@ public function buildQuery(FilterQueryBuilder $builder, FilterConfigElementModel
return;
}

$concat = 'CONCAT('.implode(
'," ",',
array_map(
function ($field) use ($filter) {
return 'COALESCE(LOWER('.$filter['dataContainer'].'.'.$field.'), "")';
},
$fields
)
).')';

$builder->andWhere($builder->expr()->like($concat, $wildcard));
$builder->setParameter($wildcard, '%'.strtolower($data[$name]).'%');
$textualFields = [];

$conditions = [];

foreach ($fields as $field) {
if ('cfgTags' === $dca['fields'][$field]['inputType']) {
$associationTable = 'tl_cfg_tag_'.System::getContainer()->get('huh.utils.string')
->removeLeadingString('tl_', $filter['dataContainer']);
$associationProperty = System::getContainer()->get('huh.utils.string')
->removeLeadingString('tl_', $filter['dataContainer']).'_id';

$builder->innerJoin($filter['dataContainer'], $associationTable, 'ta', $filter['dataContainer'].'.id='.'ta.'.$associationProperty);
$builder->innerJoin($filter['dataContainer'], 'tl_cfg_tag', 'tn', 'ta.cfg_tag_id='.'tn.id');

$andWhere = $builder->expr()->andX();
$andWhere->add('tn.name LIKE '.$wildcard);

$conditions[] = $andWhere;
$builder->setParameter($wildcard, '%'.strtolower($data[$name]).'%');
} elseif (Database::getInstance()->fieldExists($field, $filter['dataContainer'])) {
$textualFields[] = $field;
}
}

if (!empty($textualFields)) {
$concat = 'CONCAT('.implode(
'," ",',
array_map(
function ($field) use ($filter) {
return 'COALESCE(LOWER('.$filter['dataContainer'].'.'.$field.'), "")';
},
$textualFields
)
).')';

$conditions[] = $builder->expr()->like($concat, $wildcard);

$builder->setParameter($wildcard, '%'.strtolower($data[$name]).'%');
}

if (empty($conditions)) {
return;
}

// combine everything in a disjunction
$or = $builder->expr()->orX();

foreach ($conditions as $condition) {
$or->add($condition);
}

$builder->andWhere($or);
}

/**
Expand Down

0 comments on commit a025b57

Please sign in to comment.