Skip to content

Commit 1377465

Browse files
committed
Add preset for FE filter
1 parent 76a55a2 commit 1377465

File tree

8 files changed

+184
-6
lines changed

8 files changed

+184
-6
lines changed

src/CoreBundle/Contao/Hooks/ContentElementCallback.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,11 @@ class ContentElementCallback extends AbstractContentElementAndModuleCallback
4545
*/
4646
public function buildFilterParameterList(DC_Table $dataContainer)
4747
{
48-
parent::buildFilterParamsFor($dataContainer, 'metamodel_content');
48+
if ($dataContainer->getCurrentRecord()['type'] !== 'metamodel_content') {
49+
return;
50+
}
51+
52+
$this->buildFilterParamsFor($dataContainer, 'metamodel_content');
4953
}
5054

5155
/**
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?php
2+
3+
/**
4+
* This file is part of MetaModels/core.
5+
*
6+
* (c) 2012-2025 The MetaModels team.
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*
11+
* This project is provided in good faith and hope to be usable by anyone.
12+
*
13+
* @package MetaModels/core
14+
* @author Ingolf Steinhardt <info@e-spin.de>
15+
* @copyright 2012-2025 The MetaModels team.
16+
* @license https://github.com/MetaModels/core/blob/master/LICENSE LGPL-3.0-or-later
17+
* @filesource
18+
*/
19+
20+
namespace MetaModels\CoreBundle\Contao\Hooks;
21+
22+
use Contao\DC_Table;
23+
use MetaModels\CoreBundle\Contao\Hooks\AbstractContentElementAndModuleCallback;
24+
25+
/**
26+
* This class provides callbacks for tl_content.
27+
*/
28+
class FilterContentElementCallback extends AbstractContentElementAndModuleCallback
29+
{
30+
/**
31+
* The table name.
32+
*
33+
* @var string
34+
*/
35+
protected static $tableName = 'tl_content';
36+
37+
/** Called from tl_content.onload_callback. */
38+
public function buildFilterParameterList(DC_Table $dataContainer): void
39+
{
40+
if ($dataContainer->getCurrentRecord()['type'] !== 'metamodels_frontendfilter') {
41+
return;
42+
}
43+
44+
$this->buildFilterParamsFor($dataContainer, 'metamodels_frontendfilter');
45+
}
46+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?php
2+
3+
/**
4+
* This file is part of MetaModels/core.
5+
*
6+
* (c) 2012-2025 The MetaModels team.
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*
11+
* This project is provided in good faith and hope to be usable by anyone.
12+
*
13+
* @package MetaModels/core
14+
* @author Ingolf Steinhardt <info@e-spin.de>
15+
* @copyright 2012-2025 The MetaModels team.
16+
* @license https://github.com/MetaModels/core/blob/master/LICENSE LGPL-3.0-or-later
17+
* @filesource
18+
*/
19+
20+
namespace MetaModels\CoreBundle\Contao\Hooks;
21+
22+
use Contao\DC_Table;
23+
use MetaModels\CoreBundle\Contao\Hooks\AbstractContentElementAndModuleCallback;
24+
25+
/**
26+
* This class provides callbacks for tl_module.
27+
*/
28+
class FilterModuleCallback extends AbstractContentElementAndModuleCallback
29+
{
30+
/**
31+
* The table name.
32+
*
33+
* @var string
34+
*/
35+
protected static $tableName = 'tl_module';
36+
37+
/** Called from tl_module.onload_callback. */
38+
public function buildFilterParameterList(DC_Table $dataContainer): void
39+
{
40+
if ($dataContainer->getCurrentRecord()['type'] !== 'metamodels_frontendfilter') {
41+
return;
42+
}
43+
44+
$this->buildFilterParamsFor($dataContainer, 'metamodels_frontendfilter');
45+
}
46+
}

src/CoreBundle/Contao/Hooks/ModuleCallback.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ class ModuleCallback extends AbstractContentElementAndModuleCallback
4343
*/
4444
public function buildFilterParameterList(DC_Table $dataContainer)
4545
{
46+
if ($dataContainer->getCurrentRecord()['type'] !== 'metamodel_list') {
47+
return;
48+
}
49+
4650
parent::buildFilterParamsFor($dataContainer, 'metamodel_list');
4751
}
4852

src/CoreBundle/Resources/config/hooks.yml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,30 @@ services:
3434
- '@translator'
3535
public: true
3636

37+
MetaModels\CoreBundle\Contao\Hooks\FilterContentElementCallback:
38+
arguments:
39+
- '@metamodels.assets.icon_builder'
40+
- '@metamodels.backend.url-builder-factory'
41+
- '@metamodels.factory'
42+
- '@metamodels.filter_setting_factory'
43+
- '@database_connection'
44+
- '@metamodels.template_list'
45+
- '@request_stack'
46+
- '@translator'
47+
public: true
48+
49+
MetaModels\CoreBundle\Contao\Hooks\FilterModuleCallback:
50+
arguments:
51+
- '@metamodels.assets.icon_builder'
52+
- '@metamodels.backend.url-builder-factory'
53+
- '@metamodels.factory'
54+
- '@metamodels.filter_setting_factory'
55+
- '@database_connection'
56+
- '@metamodels.template_list'
57+
- '@request_stack'
58+
- '@translator'
59+
public: true
60+
3761
MetaModels\CoreBundle\EventListener\GetSearchablePagesListener:
3862
arguments:
3963
- '@database_connection'

src/CoreBundle/Resources/contao/dca/tl_content.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,12 @@
2424
*/
2525

2626
use MetaModels\CoreBundle\Contao\Hooks\ContentElementCallback;
27+
use MetaModels\CoreBundle\Contao\Hooks\FilterContentElementCallback;
2728

2829
$GLOBALS['TL_DCA']['tl_content']['config']['onload_callback'][] =
2930
[ContentElementCallback::class, 'buildFilterParameterList'];
31+
$GLOBALS['TL_DCA']['tl_content']['config']['onload_callback'][] =
32+
[FilterContentElementCallback::class, 'buildFilterParameterList'];
3033

3134
$GLOBALS['TL_DCA']['tl_content']['palettes']['metamodel_content'] =
3235
'{type_legend},type,headline;' .
@@ -45,8 +48,8 @@
4548

4649
$GLOBALS['TL_DCA']['tl_content']['palettes']['metamodels_frontendfilter'] =
4750
'{type_legend},type,headline;' .
48-
'{mm_filter_legend},metamodel,metamodel_filtering,metamodel_fef_template,metamodel_fef_params,' .
49-
'metamodel_fef_autosubmit,metamodel_fef_hideclearfilter,metamodel_available_values,' .
51+
'{mm_filter_legend},metamodel,metamodel_filtering,metamodel_fef_template,metamodel_filterparams,' .
52+
'metamodel_fef_params,metamodel_fef_autosubmit,metamodel_fef_hideclearfilter,metamodel_available_values,' .
5053
'metamodel_jumpTo,metamodel_fef_id,metamodel_fef_urlfragment;' .
5154
'{protected_legend:hide},protected;' .
5255
'{expert_legend:hide},guests,cssID,space;' .

src/CoreBundle/Resources/contao/dca/tl_module.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,11 @@
2424
*/
2525

2626
use MetaModels\CoreBundle\Contao\Hooks\ModuleCallback;
27+
use MetaModels\CoreBundle\Contao\Hooks\FilterModuleCallback;
2728

2829
$GLOBALS['TL_DCA']['tl_module']['config']['onload_callback'][] = [ModuleCallback::class, 'buildFilterParameterList'];
30+
$GLOBALS['TL_DCA']['tl_module']['config']['onload_callback'][] =
31+
[FilterModuleCallback::class, 'buildFilterParameterList'];
2932

3033
$GLOBALS['TL_DCA']['tl_module']['palettes']['metamodel_list'] =
3134
'{title_legend},name,headline,type;' .
@@ -43,8 +46,8 @@
4346

4447
$GLOBALS['TL_DCA']['tl_module']['palettes']['metamodels_frontendfilter'] =
4548
'{title_legend},name,headline,type;' .
46-
'{mm_filter_legend},metamodel,metamodel_filtering,metamodel_fef_template,metamodel_fef_params,' .
47-
'metamodel_fef_autosubmit,metamodel_fef_hideclearfilter,metamodel_available_values,' .
49+
'{mm_filter_legend},metamodel,metamodel_filtering,metamodel_fef_template,metamodel_filterparams,' .
50+
'metamodel_fef_params,metamodel_fef_autosubmit,metamodel_fef_hideclearfilter,metamodel_available_values,' .
4851
'metamodel_jumpTo,metamodel_fef_id,metamodel_fef_urlfragment;' .
4952
'{protected_legend:hide},protected;' .
5053
'{expert_legend:hide},guests,cssID,space';

src/FrontendIntegration/FrontendFilter.php

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
namespace MetaModels\FrontendIntegration;
3030

31+
use Contao\StringUtil;
3132
use ContaoCommunityAlliance\Contao\Bindings\ContaoEvents;
3233
use ContaoCommunityAlliance\Contao\Bindings\Events\Controller\RedirectEvent;
3334
use Contao\CoreBundle\Csrf\ContaoCsrfTokenManager;
@@ -427,8 +428,13 @@ protected function getFilters()
427428
}
428429
}
429430

431+
// TODO: hier presets einbauen...
432+
$values = \array_merge($all->getSlugParameters(), $all->getGetParameters());
433+
$baseParameters = $this->getBaseParameters($values);
434+
//$baseParameters = ['select' => 'abteilung-a'];
430435
$arrWidgets = $filterSetting->getParameterFilterWidgets(
431-
\array_merge($all->getSlugParameters(), $all->getGetParameters()),
436+
\array_merge($baseParameters, $values),
437+
//\array_merge($all->getSlugParameters(), $all->getGetParameters()),
432438
$jumpToInformation,
433439
$filterOptions
434440
);
@@ -622,4 +628,46 @@ public function generateClearAll($strContent, $strTemplate)
622628

623629
return $strContent;
624630
}
631+
632+
private function getBaseParameters($values): array
633+
{
634+
if ([] === ($presets = StringUtil::deserialize($this->objFilterConfig->metamodel_filterparams, true))) {
635+
return [];
636+
}
637+
638+
if (null === ($filterSetting = $this->objFilterConfig->getFilterCollection())) {
639+
throw new RuntimeException(
640+
'Error: no filter object defined, call setFilterSettings() before setFilterParameters().'
641+
);
642+
}
643+
644+
$presetNames = $filterSetting->getParameters();
645+
$filterParamKeys = \array_keys($filterSetting->getParameterFilterNames());
646+
647+
$processed = [];
648+
649+
// We have to use all the preset values we want first.
650+
foreach ($presets as $presetName => $presetValues) {
651+
if (\in_array($presetName, $presetNames, true)) {
652+
$processed[$presetName] = $presetValues['value'];
653+
}
654+
}
655+
656+
// Now we have to use all FE filter params, that are either:
657+
// * not contained within the presets
658+
// * or are overridable.
659+
foreach ($filterParamKeys as $filterParameterKey) {
660+
// Unknown parameter? - next please.
661+
if (!\array_key_exists($filterParameterKey, $values)) {
662+
continue;
663+
}
664+
665+
// Not a preset or allowed to override? - use value.
666+
if ((!\array_key_exists($filterParameterKey, $presets)) || (bool) $presets[$filterParameterKey]['use_get']) {
667+
$processed[$filterParameterKey] = $values[$filterParameterKey];
668+
}
669+
}
670+
671+
return $processed;
672+
}
625673
}

0 commit comments

Comments
 (0)