Skip to content

Commit

Permalink
Extend dca field options (#83)
Browse files Browse the repository at this point in the history
* enhance dca field config

* fix test

* increase test coverage
  • Loading branch information
koertho committed Apr 11, 2024
1 parent ffe8ffc commit e3bda97
Show file tree
Hide file tree
Showing 8 changed files with 208 additions and 66 deletions.
33 changes: 0 additions & 33 deletions src/Dca/AuthorFieldConfiguration.php
Original file line number Diff line number Diff line change
Expand Up @@ -44,39 +44,6 @@ public function setUseDefaultLabel(bool $useDefaultLabel): AuthorFieldConfigurat
return $this;
}

public function isExclude(): bool
{
return $this->exclude;
}

public function setExclude(bool $exclude): AuthorFieldConfiguration
{
$this->exclude = $exclude;
return $this;
}

public function isSearch(): bool
{
return $this->search;
}

public function setSearch(bool $search): AuthorFieldConfiguration
{
$this->search = $search;
return $this;
}

public function isFilter(): bool
{
return $this->filter;
}

public function setFilter(bool $filter): AuthorFieldConfiguration
{
$this->filter = $filter;
return $this;
}

public function getType(): string
{
return $this->type;
Expand Down
7 changes: 7 additions & 0 deletions src/Dca/DateAddedField.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,11 @@ protected static function loadConfig(): array
{
return static::$tables;
}

protected static function createOptionObject(string $table): DcaFieldConfiguration
{
$options = parent::createOptionObject($table);
$options->setSorting(true);
return $options;
}
}
73 changes: 73 additions & 0 deletions src/Dca/DcaFieldConfiguration.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,24 @@

class DcaFieldConfiguration
{
/** @var null|int */
private $flag = null;

/** @var bool */
protected $exclude = false;

/** @var bool */
protected $search = false;

/** @var bool */
protected $filter = false;

/** @var bool */
protected $sorting = false;

/**
* @param string $table
*/
public function __construct(private string $table)
{
}
Expand All @@ -12,4 +30,59 @@ public function getTable(): string
{
return $this->table;
}

public function isSorting(): bool
{
return $this->sorting;
}

public function setSorting(bool $sorting): DcaFieldConfiguration
{
$this->sorting = $sorting;
return $this;
}

public function getFlag(): ?int
{
return $this->flag;
}

public function setFlag(?int $flag): DcaFieldConfiguration
{
$this->flag = $flag;
return $this;
}

public function isExclude(): bool
{
return $this->exclude;
}

public function setExclude(bool $exclude): DcaFieldConfiguration
{
$this->exclude = $exclude;
return $this;
}

public function isSearch(): bool
{
return $this->search;
}

public function setSearch(bool $search): DcaFieldConfiguration
{
$this->search = $search;
return $this;
}

public function isFilter(): bool
{
return $this->filter;
}

public function setFilter(bool $filter): DcaFieldConfiguration
{
$this->filter = $filter;
return $this;
}
}
24 changes: 24 additions & 0 deletions src/EventListener/DcaField/AbstractDcaFieldListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use Contao\CoreBundle\Framework\ContaoFramework;
use Contao\Model;
use HeimrichHannot\UtilsBundle\Dca\DcaFieldConfiguration;
use Psr\Container\ContainerInterface;
use Symfony\Contracts\Service\ServiceSubscriberInterface;

Expand All @@ -20,6 +21,29 @@ protected function getModelInstance(string $table, int $id): ?Model
return $framework->getAdapter($modelClass)->findByPk($id);
}

protected function applyDefaultFieldAdjustments(array &$field, DcaFieldConfiguration $configuration)
{
if ($configuration->isFilter()) {
$field['filter'] = true;
}

if ($configuration->isSearch()) {
$field['search'] = true;
}

if ($configuration->isExclude()) {
$field['exclude'] = true;
}

if ($configuration->isSorting()) {
$field['sorting'] = true;
}

if ($configuration->getFlag() !== null) {
$field['flag'] = $configuration->getFlag();
}
}

public static function getSubscribedServices(): array
{
return [
Expand Down
13 changes: 8 additions & 5 deletions src/EventListener/DcaField/DateAddedFieldListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,15 @@ public function onLoadDataContainer(string $table): void
$GLOBALS['TL_DCA'][$table]['config']['onload_callback'][] = [self::class, 'onLoadCallback'];
$GLOBALS['TL_DCA'][$table]['config']['oncopy_callback'][] = [self::class, 'onCopyCallback'];

$GLOBALS['TL_DCA'][$table]['fields']['dateAdded'] = [
'label' => &$GLOBALS['TL_LANG']['MSC']['dateAdded'],
'sorting' => true,
'eval' => ['rgxp' => 'datim', 'doNotCopy' => true],
'sql' => "int(10) unsigned NOT NULL default '0'",
$field = [
'label' => &$GLOBALS['TL_LANG']['MSC']['dateAdded'],
'eval' => ['rgxp' => 'datim', 'doNotCopy' => true],
'sql' => "int(10) unsigned NOT NULL default '0'",
];

$this->applyDefaultFieldAdjustments($field, DateAddedField::getRegistrations()[$table]);

$GLOBALS['TL_DCA'][$table]['fields']['dateAdded'] = $field;
}

public function onLoadCallback(DataContainer $dc = null): void
Expand Down
48 changes: 21 additions & 27 deletions src/EventListener/DcaField/DcaAuthorListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,14 @@

use Contao\BackendUser;
use Contao\CoreBundle\DependencyInjection\Attribute\AsHook;
use Contao\CoreBundle\Framework\ContaoFramework;
use Contao\DataContainer;
use Contao\FrontendUser;
use Contao\Model;
use HeimrichHannot\UtilsBundle\Dca\AuthorField;
use HeimrichHannot\UtilsBundle\Dca\AuthorFieldConfiguration;
use Symfony\Component\Security\Core\Security;

class DcaAuthorListener
class DcaAuthorListener extends AbstractDcaFieldListener
{
private ContaoFramework $framework;
private Security $security;

public function __construct(ContaoFramework $framework, Security $security)
{
$this->framework = $framework;
$this->security = $security;
}

#[AsHook("loadDataContainer")]
public function onLoadDataContainer(string $table): void
{
Expand All @@ -31,13 +20,10 @@ public function onLoadDataContainer(string $table): void
}

$options = AuthorField::getRegistrations()[$table];

$authorFieldName = $this->getAuthorFieldName($options);
$security = $this->container->get('security.helper');

$authorField = [
'exclude' => $options->isExclude(),
'search' => $options->isSearch(),
'filter' => $options->isFilter(),
'inputType' => 'select',
'eval' => [
'doNotCopy' => true,
Expand All @@ -49,20 +35,22 @@ public function onLoadDataContainer(string $table): void
'sql' => "int(10) unsigned NOT NULL default 0",
];

$this->applyDefaultFieldAdjustments($authorField, $options);

if ($options->isUseDefaultLabel()) {
$authorField['label'] = &$GLOBALS['TL_LANG']['MSC']['utilsBundle']['author'];
}

$authorField['default'] = 0;
if (AuthorField::TYPE_USER === $options->getType()) {
if ($this->security->getUser() instanceof BackendUser) {
$authorField['default'] = $this->security->getUser()->id;
if ($security->getUser() instanceof BackendUser) {
$authorField['default'] = $security->getUser()->id;
}
$authorField['foreignKey'] = 'tl_user.name';
$authorField['relation'] = ['type'=>'hasOne', 'load'=>'lazy'];
} elseif (AuthorField::TYPE_MEMBER === $options->getType()) {
if ($this->security->getUser() instanceof FrontendUser) {
$authorField['default'] = $this->security->getUser()->id;
if ($security->getUser() instanceof FrontendUser) {
$authorField['default'] = $security->getUser()->id;
}
$authorField['foreignKey'] = "tl_member.CONCAT(firstname,' ',lastname)";
$authorField['relation'] = ['type'=>'hasOne', 'load'=>'lazy'];
Expand All @@ -77,22 +65,21 @@ public function onConfigCopyCallback(int $insertId, DataContainer $dc): void
{
$options = AuthorField::getRegistrations()[$dc->table];
$authorFieldName = $this->getAuthorFieldName($options);
$security = $this->container->get('security.helper');

/** @var class-string<Model> $modelClass */
$modelClass = $this->framework->getAdapter(Model::class)->getClassFromTable($dc->table);
$model = $this->framework->getAdapter($modelClass)->findByPk($insertId);
$model = $this->getModelInstance($dc->table, $insertId);
if (!$model) {
return;
}

$model->{$authorFieldName} = 0;
if (AuthorField::TYPE_USER === $options->getType()) {
if ($this->security->getUser() instanceof BackendUser) {
$model->{$authorFieldName} = $this->security->getUser()->id;
if ($security->getUser() instanceof BackendUser) {
$model->{$authorFieldName} = $security->getUser()->id;
}
} elseif (AuthorField::TYPE_MEMBER === $options->getType()) {
if ($this->security->getUser() instanceof FrontendUser) {
$model->{$authorFieldName} = $this->security->getUser()->id;
if ($security->getUser() instanceof FrontendUser) {
$model->{$authorFieldName} = $security->getUser()->id;
}
}
$model->save();
Expand All @@ -113,4 +100,11 @@ protected function getAuthorFieldName(AuthorFieldConfiguration $options): string
return $options->getFieldNamePrefix() . 'Author';
}
}

public static function getSubscribedServices(): array
{
$services = parent::getSubscribedServices();
$services['security.helper'] = Security::class;
return $services;
}
}
61 changes: 61 additions & 0 deletions tests/EventListener/DcaField/DateAddedFieldListenerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,67 @@ public function testOnLoadDataContainer()
$this->assertArrayHasKey('dateAdded', $GLOBALS['TL_DCA'][$table]['fields']);
}

public function dateAddedConfig():array
{
return [
[null, false, false, false, false],
[1, true, false, false, false],
[2, false, true, false, false],
[null, false, false, true, false],
[null, false, false, false, true],
];
}

/**
* @dataProvider dateAddedConfig
* @runInSeparateProcess
*/
public function testConfig(?int $flag, bool $sorting, bool $exclude, bool $filter, bool $search)
{
$container = $this->createMock(ContainerInterface::class);

$listener = new DateAddedFieldListener($container);
$table = 'test_table';

// Mock the global array
$GLOBALS['TL_DCA'][$table] = [
'config' => [],
'fields' => [],
];

$config = DateAddedField::register($table);
$config->setFlag($flag);
$config->setSorting($sorting);
$config->setExclude($exclude);
$config->setFilter($filter);
$config->setSearch($search);

$listener->onLoadDataContainer($table);

$this->assertArrayHasKey('dateAdded', $GLOBALS['TL_DCA'][$table]['fields']);
$field = $GLOBALS['TL_DCA'][$table]['fields']['dateAdded'];
if ($flag) {
$this->assertArrayHasKey('flag', $field);
$this->assertEquals($flag, $field['flag']);
}
if ($sorting) {
$this->assertArrayHasKey('sorting', $field);
$this->assertTrue($field['sorting']);
}
if ($exclude) {
$this->assertArrayHasKey('exclude', $field);
$this->assertTrue($field['exclude']);
}
if ($filter) {
$this->assertArrayHasKey('filter', $field);
$this->assertTrue($field['filter']);
}
if ($search) {
$this->assertArrayHasKey('search', $field);
$this->assertTrue($field['search']);
}
}

public function testOnLoadCallback()
{
// Without DataContainer
Expand Down
Loading

0 comments on commit e3bda97

Please sign in to comment.