vendor/easycorp/easyadmin-bundle/src/Collection/FieldCollection.php line 153

Open in your IDE?
  1. <?php
  2. namespace EasyCorp\Bundle\EasyAdminBundle\Collection;
  3. use EasyCorp\Bundle\EasyAdminBundle\Contracts\Collection\CollectionInterface;
  4. use EasyCorp\Bundle\EasyAdminBundle\Contracts\Field\FieldInterface;
  5. use EasyCorp\Bundle\EasyAdminBundle\Dto\FieldDto;
  6. use EasyCorp\Bundle\EasyAdminBundle\Field\Field;
  7. /**
  8.  * @author Javier Eguiluz <javier.eguiluz@gmail.com>
  9.  */
  10. final class FieldCollection implements CollectionInterface
  11. {
  12.     /** @var FieldDto[] */
  13.     private array $fields;
  14.     /**
  15.      * @param FieldInterface[]|string[] $fields
  16.      */
  17.     private function __construct(iterable $fields)
  18.     {
  19.         $this->fields $this->processFields($fields);
  20.     }
  21.     public function __clone()
  22.     {
  23.         $clonedFields = [];
  24.         foreach ($this->fields as $fieldDto) {
  25.             $clonedFieldDto = clone $fieldDto;
  26.             $clonedFields[$clonedFieldDto->getUniqueId()] = $clonedFieldDto;
  27.         }
  28.         $this->fields $clonedFields;
  29.     }
  30.     /**
  31.      * @param FieldInterface[]|string[] $fields
  32.      */
  33.     public static function new(iterable $fields): self
  34.     {
  35.         return new self($fields);
  36.     }
  37.     public function get(string $fieldUniqueId): ?FieldDto
  38.     {
  39.         return $this->fields[$fieldUniqueId] ?? null;
  40.     }
  41.     /**
  42.      * It returns the first field associated to the given property or null if none found.
  43.      * Some pages (index/detail) can render the same field more than once.
  44.      * In those cases, this method always returns the first field occurrence.
  45.      */
  46.     public function getByProperty(string $propertyName): ?FieldDto
  47.     {
  48.         foreach ($this->fields as $field) {
  49.             if ($propertyName === $field->getProperty()) {
  50.                 return $field;
  51.             }
  52.         }
  53.         return null;
  54.     }
  55.     public function set(FieldDto $newOrUpdatedField): void
  56.     {
  57.         $this->fields[$newOrUpdatedField->getUniqueId()] = $newOrUpdatedField;
  58.     }
  59.     public function unset(FieldDto $removedField): void
  60.     {
  61.         unset($this->fields[$removedField->getUniqueId()]);
  62.     }
  63.     public function add(FieldDto $newField): void
  64.     {
  65.         $this->fields[$newField->getUniqueId()] = $newField;
  66.     }
  67.     public function prepend(FieldDto $newField): void
  68.     {
  69.         $this->fields array_merge([$newField->getUniqueId() => $newField], $this->fields);
  70.     }
  71.     public function insertBefore(FieldDto $newFieldFieldDto $existingField): void
  72.     {
  73.         $newFields = [];
  74.         $existingFieldUniqueId $existingField->getUniqueId();
  75.         foreach ($this->fields as $fieldUniqueId => $field) {
  76.             if ($existingFieldUniqueId === $fieldUniqueId) {
  77.                 $newFields[$newField->getUniqueId()] = $newField;
  78.             }
  79.             $newFields[$fieldUniqueId] = $field;
  80.         }
  81.         $this->fields $newFields;
  82.     }
  83.     public function first(): ?FieldDto
  84.     {
  85.         if (=== \count($this->fields)) {
  86.             return null;
  87.         }
  88.         return $this->fields[array_key_first($this->fields)];
  89.     }
  90.     public function isEmpty(): bool
  91.     {
  92.         return === \count($this->fields);
  93.     }
  94.     public function offsetExists(mixed $offset): bool
  95.     {
  96.         return \array_key_exists($offset$this->fields);
  97.     }
  98.     public function offsetGet(mixed $offset): FieldDto
  99.     {
  100.         return $this->fields[$offset];
  101.     }
  102.     public function offsetSet(mixed $offsetmixed $value): void
  103.     {
  104.         $this->fields[$offset] = $value;
  105.     }
  106.     public function offsetUnset(mixed $offset): void
  107.     {
  108.         unset($this->fields[$offset]);
  109.     }
  110.     public function count(): int
  111.     {
  112.         return \count($this->fields);
  113.     }
  114.     /**
  115.      * @return \ArrayIterator<FieldDto>
  116.      */
  117.     public function getIterator(): \ArrayIterator
  118.     {
  119.         return new \ArrayIterator($this->fields);
  120.     }
  121.     /**
  122.      * @param FieldInterface[]|string[] $fields
  123.      *
  124.      * @return FieldDto[]
  125.      */
  126.     private function processFields(iterable $fields): array
  127.     {
  128.         $dtos = [];
  129.         // for DX reasons, fields can be configured as a FieldInterface object and
  130.         // as a simple string with the name of the Doctrine property
  131.         /** @var FieldInterface|string $field */
  132.         foreach ($fields as $field) {
  133.             if (\is_string($field)) {
  134.                 $field Field::new($field);
  135.             }
  136.             $dto $field->getAsDto();
  137.             if (null === $dto->getFieldFqcn()) {
  138.                 $dto->setFieldFqcn($field::class);
  139.             }
  140.             $dtos[$dto->getUniqueId()] = $dto;
  141.         }
  142.         return $dtos;
  143.     }
  144. }