Skip to content

Commit

Permalink
added new filter type CurrentUserType
Browse files Browse the repository at this point in the history
  • Loading branch information
Alexej Kossmann committed Jul 3, 2020
1 parent 06b10d8 commit d8ad089
Show file tree
Hide file tree
Showing 6 changed files with 172 additions and 40 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
# Changelog
All notable changes to this project will be documented in this file.

## [1.3.0] - 2020-07-03
- added new type `CurrentUserType`

## [1.2.10] - 2020-07-02
- fixed `options_callback` for `sourceTable`

Expand Down
2 changes: 2 additions & 0 deletions src/Choice/TypeChoice.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ protected function collect()

foreach ($config[$filterType]['types'] as $type) {
if (!class_exists($type['class'])) {
trigger_error(sprintf('Warning: Class %s does not exist.', $type['class']), E_USER_WARNING);

continue;
}

Expand Down
109 changes: 109 additions & 0 deletions src/Filter/Type/CurrentMemberType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
<?php

/*
* Copyright (c) 2020 Heimrich & Hannot GmbH
*
* @license LGPL-3.0-or-later
*/

namespace HeimrichHannot\FilterBundle\Filter\Type;

use Contao\System;
use HeimrichHannot\FilterBundle\Filter\AbstractType;
use HeimrichHannot\FilterBundle\Model\FilterConfigElementModel;
use HeimrichHannot\FilterBundle\QueryBuilder\FilterQueryBuilder;
use Symfony\Component\Form\FormBuilderInterface;

class CurrentMemberType extends AbstractType
{
const TYPE = 'current_member';

const TYPE_USERNAME = 'username';
const TYPE_ID = 'id';

const TYPES = [
self::TYPE_USERNAME,
self::TYPE_ID,
];

/**
* {@inheritdoc}
*/
public function buildQuery(FilterQueryBuilder $builder, FilterConfigElementModel $element)
{
if (null === ($user = $GLOBALS['TL_USERNAME']) && $element->type !== static::TYPE) {
return;
}

$filter = $this->config->getFilter();
$where = $this->getWhere($builder, $element, $filter);
$builder->andWhere($where);
}

/**
* {@inheritdoc}
*/
public function buildForm(FilterConfigElementModel $element, FormBuilderInterface $builder)
{
}

/**
* {@inheritdoc}
*/
public function getDefaultOperator(FilterConfigElementModel $element)
{
return System::getContainer()->get('huh.utils.database')::OPERATOR_EQUAL;
}

/**
* {@inheritdoc}
*/
public function getDefaultName(FilterConfigElementModel $element)
{
return null;
}

protected function getOperator($element)
{
if (!$element->customOperator) {
return $this->getDefaultOperator($element);
}

return $element->operator;
}

protected function getWhere(FilterQueryBuilder $builder, FilterConfigElementModel $element, ?array $filter)
{
$value = '';

switch ($element->currentUserAssign) {
case self::TYPE_ID:
if (null === ($member = System::getContainer()->get('huh.utils.model')->findOneModelInstanceBy('tl_member', ['tl_member.username=?'], [$GLOBALS['TL_USERNAME']]))) {
break;
}
$value = $member->id;

break;

case self::TYPE_USERNAME:
$value = $GLOBALS['TL_USERNAME'];

break;

default:
break;
}

$field = $filter['dataContainer'].'.'.$element->field;

$operator = $this->getOperator($element);
$dca = $this->getDca($filter, $element);

return System::getContainer()->get('huh.utils.database')->composeWhereForQueryBuilder($builder, $field, $operator, $dca, $value);
}

protected function getDca(array $filter, FilterConfigElementModel $element): array
{
return $GLOBALS['TL_DCA'][$filter['dataContainer']]['fields'][$element->field];
}
}
1 change: 1 addition & 0 deletions src/Resources/config/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ huh:
- {name: auto_item, class: HeimrichHannot\FilterBundle\Filter\Type\AutoItemType, type: other}
- {name: sort, class: HeimrichHannot\FilterBundle\Filter\Type\SortType, type: sort}
- {name: external_entity, class: HeimrichHannot\FilterBundle\Filter\Type\ExternalEntityType, type: other}
- {name: current_member, class: HeimrichHannot\FilterBundle\Filter\Type\CurrentMemberType, type: other}
templates:
- {name: form_div_layout, template: '@HeimrichHannotContaoFilter/filter/filter_form_div_layout.html.twig'}
- {name: form_table_layout, template: '@HeimrichHannotContaoFilter/filter/filter_form_table_layout.html.twig'}
Expand Down
14 changes: 14 additions & 0 deletions src/Resources/contao/dca/tl_filter_config_element.php
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,8 @@
=> '{general_legend},title,type;{config_legend},sortOptions,expanded,submitOnChange;{visualization_legend},addPlaceholder,customLabel,hideLabel;{publish_legend},published',
\HeimrichHannot\FilterBundle\Filter\Type\ExternalEntityType::TYPE
=> '{general_legend},title,type;{source_legend},sourceTable,sourceField,sourceEntityResolve,sourceEntityOverridesOrder;{config_legend},field,customOperator;{publish_legend},published;',
\HeimrichHannot\FilterBundle\Filter\Type\CurrentMemberType::TYPE
=> '{general_legend},title,type;{config_legend},field,customOperator,currentUserAssign;{publish_legend},published',
],
'subpalettes' => [
'customOptions' => 'options',
Expand Down Expand Up @@ -1128,6 +1130,18 @@
'tl_class' => 'w50'
],
'sql' => "varchar(32) NOT NULL default ''"
],
'currentUserAssign' => [
'label' => &$GLOBALS['TL_LANG']['tl_filter_config_element']['currentUserAssign'],
'inputType' => 'select',
'options' => \HeimrichHannot\FilterBundle\Filter\Type\CurrentMemberType::TYPES,
'reference' => &$GLOBALS['TL_LANG']['tl_filter_config_element']['type'],
'eval' => [
'includeBlankOption' => true,
'mandatory' => true,
'tl_class' => 'w50 clr'
],
'sql' => "varchar(32) NOT NULL default ''"
]
],
];
Expand Down
83 changes: 43 additions & 40 deletions src/Resources/contao/languages/de/tl_filter_config_element.php
Original file line number Diff line number Diff line change
Expand Up @@ -126,45 +126,48 @@
*/
$lang['reference'] = [
'type' => [
'text' => 'Text',
'text_concat' => 'Konkatenierter Text',
'textarea' => 'Textarea',
\HeimrichHannot\FilterBundle\Filter\Type\EmailType::TYPE => 'E-Mail',
'integer' => 'Integer',
'money' => 'Geld',
'number' => 'Zahl',
'password' => 'Passwort',
'percent' => 'Prozent',
'search' => 'Suche',
'url' => 'URL',
'range' => 'Spanne (range)',
\HeimrichHannot\FilterBundle\Filter\Type\MultipleRangeType::TYPE => 'Multi-Feld-Spanne (range)',
'tel' => 'Telefon',
'color' => 'Farbe',
'choice' => 'Choice',
'country' => 'Land',
'language' => 'Sprache',
'locale' => 'Region ("locale")',
'parent' => 'Elternentität',
'skip_parents' => 'Elternentitäten ausschließen',
'visible' => 'Veröffentlicht',
'button' => 'Button',
'reset' => 'Reset',
'submit' => 'Submit',
'hidden' => 'Hidden',
'checkbox' => 'Checkbox',
'radio' => 'Radio',
'other' => 'Sonstiges',
'initial' => 'Initial',
\HeimrichHannot\FilterBundle\Filter\Type\DateTimeType::TYPE => 'Datum & Zeit',
\HeimrichHannot\FilterBundle\Filter\Type\DateType::TYPE => 'Datum',
'time' => 'Zeit',
\HeimrichHannot\FilterBundle\Filter\Type\DateRangeType::TYPE => 'Datumsspanne (date range)',
\HeimrichHannot\FilterBundle\Filter\Type\SqlType::TYPE => 'SQL',
\HeimrichHannot\FilterBundle\Filter\Type\SortType::TYPE => 'Sortierung',
\HeimrichHannot\FilterBundle\Filter\Type\YearType::TYPE => 'Jahr',
\HeimrichHannot\FilterBundle\Filter\Type\DateChoiceType::TYPE => 'Datumsauswahl',
\HeimrichHannot\FilterBundle\Filter\Type\ExternalEntityType::TYPE => 'externe Entität'
'text' => 'Text',
'text_concat' => 'Konkatenierter Text',
'textarea' => 'Textarea',
\HeimrichHannot\FilterBundle\Filter\Type\EmailType::TYPE => 'E-Mail',
'integer' => 'Integer',
'money' => 'Geld',
'number' => 'Zahl',
'password' => 'Passwort',
'percent' => 'Prozent',
'search' => 'Suche',
'url' => 'URL',
'range' => 'Spanne (range)',
\HeimrichHannot\FilterBundle\Filter\Type\MultipleRangeType::TYPE => 'Multi-Feld-Spanne (range)',
'tel' => 'Telefon',
'color' => 'Farbe',
'choice' => 'Choice',
'country' => 'Land',
'language' => 'Sprache',
'locale' => 'Region ("locale")',
'parent' => 'Elternentität',
'skip_parents' => 'Elternentitäten ausschließen',
'visible' => 'Veröffentlicht',
'button' => 'Button',
'reset' => 'Reset',
'submit' => 'Submit',
'hidden' => 'Hidden',
'checkbox' => 'Checkbox',
'radio' => 'Radio',
'other' => 'Sonstiges',
'initial' => 'Initial',
\HeimrichHannot\FilterBundle\Filter\Type\DateTimeType::TYPE => 'Datum & Zeit',
\HeimrichHannot\FilterBundle\Filter\Type\DateType::TYPE => 'Datum',
'time' => 'Zeit',
\HeimrichHannot\FilterBundle\Filter\Type\DateRangeType::TYPE => 'Datumsspanne (date range)',
\HeimrichHannot\FilterBundle\Filter\Type\SqlType::TYPE => 'SQL',
\HeimrichHannot\FilterBundle\Filter\Type\SortType::TYPE => 'Sortierung',
\HeimrichHannot\FilterBundle\Filter\Type\YearType::TYPE => 'Jahr',
\HeimrichHannot\FilterBundle\Filter\Type\DateChoiceType::TYPE => 'Datumsauswahl',
\HeimrichHannot\FilterBundle\Filter\Type\ExternalEntityType::TYPE => 'externe Entität',
\HeimrichHannot\FilterBundle\Filter\Type\CurrentMemberType::TYPE => 'aktuelles Mitglied',
\HeimrichHannot\FilterBundle\Filter\Type\CurrentMemberType::TYPE_ID => 'ID',
\HeimrichHannot\FilterBundle\Filter\Type\CurrentMemberType::TYPE_USERNAME => 'Benutzername',
],
'roundingMode' => [
\Symfony\Component\Form\Extension\Core\DataTransformer\IntegerToLocalizedStringTransformer::ROUND_DOWN => 'Abrunden (zu 0 hin)',
Expand All @@ -181,5 +184,5 @@
],
\HeimrichHannot\FilterBundle\Filter\AbstractType::VALUE_TYPE_SCALAR => 'Skalar',
\HeimrichHannot\FilterBundle\Filter\AbstractType::VALUE_TYPE_ARRAY => 'Array',
\HeimrichHannot\FilterBundle\Filter\AbstractType::VALUE_TYPE_LATEST => 'Neueste'
\HeimrichHannot\FilterBundle\Filter\AbstractType::VALUE_TYPE_LATEST => 'Neueste',
];

0 comments on commit d8ad089

Please sign in to comment.