Commit b785a499 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Nouveau filtre de valeur de colonne CallableColumnValueFilter.

parent 4b0adc4b
Loading
Loading
Loading
Loading
+1 −0
Changes for CHANGELOG.md: 1 added line, 0 removed lines.
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@ Changelog
- Possibilité de spécifier un data extractor précis pour une source (+ gestion des extractors par un plugin manager).
- Migration des lignes de commandes d'import/synchro au format Symfony (lancer `vendor/bin/laminas` pour avoir la liste des commandes).
- Configuration : navigation déplacée dans config/unicaen-db-import.global.php.dist pour ne pas imposer le menu du module.
- Nouveau filtre de valeur de colonne CallableColumnValueFilter.
- [FIX] Logs : ils étaient recherchés dans la connection orm_default alors qu'ils se trouvent dans la connection destination de l'import/synchro.
- [FIX] Ajouts de strtolower/strtoupper() faisant défaut.

+3 −0
Changes for src/UnicaenDbImport/Config/ColumnValueFilterConfigFactoryTrait.php: 3 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@ namespace UnicaenDbImport\Config;
use Assert\Assertion;
use Assert\AssertionFailedException;
use Psr\Container\ContainerInterface;
use UnicaenDbImport\Filter\ColumnValue\CallableColumnValueFilter;
use UnicaenDbImport\Filter\ColumnValue\ColumnValueFilterInterface;
use UnicaenDbImport\Filter\ColumnValue\SameColumnValueFilter;

@@ -61,6 +62,8 @@ trait ColumnValueFilterConfigFactoryTrait
            $filterInstance = $this->getColumnValueFilter($spec[$key], $container);
            $filterParams = $spec['params'] ?? [];
            $filterInstance->setParams($filterParams);
        } elseif (is_callable($spec)) {
            $filterInstance = new CallableColumnValueFilter(['callable' => $spec]);
        } elseif (is_string($spec)) {
            if ($container->has($spec)) {
                $filterInstance = $container->get($spec);
+63 −0
Changes for src/UnicaenDbImport/Filter/ColumnValue/CallableColumnValueFilter.php: 63 added lines, 0 removed lines.
Original line number Diff line number Diff line
<?php

namespace UnicaenDbImport\Filter\ColumnValue;

use InvalidArgumentException;

class CallableColumnValueFilter extends AbstractColumnValueFilter
{
    private string $sourceColumn;
    private $callable;

    public function __toString(): string
    {
        return sprintf(
            "Colonne '%s' = callable('%s')",
            $this->column,
            $this->sourceColumn,
        );
    }

    public function setParams(array $params): void
    {
        if (array_key_exists('source_column', $params)) {
            $this->setSourceColumn($params['source_column']);
        }
        if (array_key_exists('callable', $params)) {
            $this->setCallable($params['callable']);
        }

        parent::setParams($params);
    }

    public function setSourceColumn(string $sourceColumn): void
    {
        $this->sourceColumn = $sourceColumn;
    }

    public function setCallable(callable $callable): void
    {
        $this->callable = $callable;
    }

    public function filter($value): array
    {
        if (!is_array($value)) {
            throw new InvalidArgumentException("Les données reçues ne sont pas un tableau");
        }
        if (!array_key_exists($this->sourceColumn, $value)) {
            throw new InvalidArgumentException("La colonne suivante est introuvable dans les données reçues : " . $this->column);
        }

        $value[$this->column] = $this->applyCallable($value[$this->sourceColumn]);

        return $value;
    }

    protected function applyCallable($sourceColumnValue)
    {
        $callable = $this->callable;

        return $callable($sourceColumnValue);
    }
}
 No newline at end of file