Просмотр исходного кода

maj du fichier sql et de public Event pour adapter les category code fnac à OP

Maha Bouchiba 1 год назад
Родитель
Сommit
89ff18cb38

+ 2 - 2
sql/schema-extensions/001-view_public_events.sql

@@ -56,7 +56,7 @@ UNION
         aw.datetimeEnd, 
         aw.price_mini, 
         aw.price_maxi, 
-        aw.categoryCode,
+        aw.subCategory AS categoryCode,
         aw.place AS placeName, 
         NULL AS placeDescription, 
         NULL AS placeFloorSize, 
@@ -73,7 +73,7 @@ UNION
         NULL AS roomFloorSize,
         aw.largeimage AS imageUrl, 
         aw.mediumimage as thumbnailUrl, 
-        aw.categories AS categories, 
+        aw.categoryCode AS categories, 
         'awin' as origin, 
         aw.id as entityId
     FROM AwinProduct as aw

+ 8 - 6
src/Entity/Public/PublicEvent.php

@@ -3,18 +3,19 @@ declare (strict_types=1);
 
 namespace App\Entity\Public;
 
-use ApiPlatform\Metadata\GetCollection;
 use ApiPlatform\Metadata\Get;
+use Doctrine\ORM\Mapping as ORM;
+use ApiPlatform\Metadata\ApiFilter;
 use ApiPlatform\Metadata\ApiResource;
-use ApiPlatform\Doctrine\Orm\Filter\OrderFilter;
+use ApiPlatform\Metadata\GetCollection;
+use App\Filter\ApiPlatform\ArrayFieldFilter;
 use ApiPlatform\Doctrine\Orm\Filter\DateFilter;
-use ApiPlatform\Doctrine\Orm\Filter\NumericFilter;
+use ApiPlatform\Doctrine\Orm\Filter\OrderFilter;
 use ApiPlatform\Doctrine\Orm\Filter\RangeFilter;
-use ApiPlatform\Doctrine\Orm\Filter\SearchFilter;
-use ApiPlatform\Metadata\ApiFilter;
 use App\Filter\ApiPlatform\Utils\DistanceFilter;
 use App\Repository\Public\PublicEventRepository;
-use Doctrine\ORM\Mapping as ORM;
+use ApiPlatform\Doctrine\Orm\Filter\SearchFilter;
+use ApiPlatform\Doctrine\Orm\Filter\NumericFilter;
 
 /**
  * Évènements publics tels que publiés sur l'agenda du site opentalent ou les sites des structures
@@ -40,6 +41,7 @@ use Doctrine\ORM\Mapping as ORM;
 #[ApiFilter(filterClass: DistanceFilter::class)]
 #[ApiFilter(filterClass: OrderFilter::class, properties: ['datetimeStart', 'datetimeEnd'], arguments: ['orderParameterName' => 'order'])]
 #[ApiFilter(filterClass: RangeFilter::class, properties: ['price_mini', 'price_maxi'])]
+#[ApiFilter(filterClass: ArrayFieldFilter::class, properties: ['categories'])]
 
 class PublicEvent
 {

+ 61 - 0
src/Filter/ApiPlatform/ArrayFieldFilter.php

@@ -0,0 +1,61 @@
+<?php
+
+namespace App\Filter\ApiPlatform;
+
+use ApiPlatform\Doctrine\Orm\Filter\AbstractFilter;
+use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface;
+use Doctrine\ORM\QueryBuilder;
+use ApiPlatform\Metadata\Operation;
+
+class ArrayFieldFilter extends AbstractFilter
+{
+    protected function filterProperty(
+        string $property,
+        $value,
+        QueryBuilder $queryBuilder,
+        QueryNameGeneratorInterface $queryNameGenerator,
+        string $resourceClass,
+        ?Operation $operation = null,
+        array $context = []
+    ): void {
+        if (!$this->isPropertyEnabled($property, $resourceClass)) {
+            return;
+        }
+
+        $parameterName = $queryNameGenerator->generateParameterName($property);
+        $valueArray = json_decode($value, true);
+
+        if (is_array($valueArray)) {
+            $queryBuilder->andWhere($queryBuilder->expr()->orX(
+                ...array_map(function ($val) use ($queryBuilder, $property, $parameterName) {
+                    return $queryBuilder->expr()->like(sprintf('o.%s', $property), ':' . $parameterName);
+                }, $valueArray)
+            ));
+            foreach ($valueArray as $key => $val) {
+                $queryBuilder->setParameter($parameterName, '%' . $val . '%');
+            }
+        } else {
+            $queryBuilder->andWhere(sprintf('o.%s LIKE :%s', $property, $parameterName))
+                         ->setParameter($parameterName, '%' . $value . '%');
+        }
+    }
+
+    public function getDescription(string $resourceClass): array
+    {
+        if (!$this->properties) {
+            return [];
+        }
+
+        $description = [];
+        foreach ($this->properties as $property => $strategy) {
+            $description[$property] = [
+                'property' => $property,
+                'type' => 'array',
+                'required' => false,
+                'swagger' => ['description' => "Filter by $property"],
+            ];
+        }
+
+        return $description;
+    }
+}