<?php /* * Copyright (C) 2015 IRSTEA * All rights reserved. */ namespace Irstea\FileUploadBundle\Form\DataTranformer; use Irstea\FileUploadBundle\Entity\UploadedFile; use Irstea\FileUploadBundle\Service\FileManagerInterface; use Rhumsaa\Uuid\Uuid; use Symfony\Component\Form\DataTransformerInterface; use Symfony\Component\Form\Exception\TransformationFailedException; /** * Description of UploadedFileTransformer */ class UploadedFileTransformer implements DataTransformerInterface { /** * * @var boolean */ private $multiple; /** * * @var FileManagerInterface */ private $fileManager; public function __construct(FileManagerInterface $fileManager, $multiple = false) { $this->fileManager = $fileManager; $this->multiple = $multiple; } /** * {@inheritdoc} */ public function reverseTransform($value) { if(!$this->multiple) { return $this->reverseTransformFile($value); } if(null === $value || '' === $value) { return []; } if(!is_array($value) && !$value instanceof \Traversable) { throw new TransformationFailedException('Expected an array or a \Traversable.'); } $result = []; foreach($value as $index => $identifier) { if(null !== $file = $this->reverseTransformFile($identifier)) { $result[$index] = $file; } } return $result; } /** * {@inheritdoc} */ public function transform($value) { if(!$this->multiple) { return $this->transformFile($value); } if(empty($value)) { return []; } if(!is_array($value) && !$value instanceof \Traversable) { throw new TransformationFailedException('Expected an array or a \Traversable.'); } $result = []; foreach($value as $index => $file) { if(null !== $item = $this->transformFile($file)) { $result[$index] = $item; } } return $result; } /** * * @param mixed $value * @return mixed */ protected function transformFile($value) { if(null === $value) { return null; } if(!$value instanceof UploadedFile) { throw new TransformationFailedException('Expected an UploadedFile.'); } return $value; } /** * * @param mixed $value * @return UploadedFile */ protected function reverseTransformFile($value) { if(is_string($value) && Uuid::isValid($value)) { $value = $this->fileManager->get($value); } if(null === $value || '' === $value) { return null; } if($value instanceof UploadedFile) { if($value->isOrphelin()) { $value->setEtat(UploadedFile::ETAT_NORMAL); } return $value; } throw new TransformationFailedException('Expected an UploadedFile or a valid file UUID.'); } }