protected function getMapping($obj, $fieldName, $className = null) { $mapping = $this->factory->fromField($obj, $fieldName, $className); if ($mapping === null) { throw new MappingNotFoundException(sprintf('Mapping not found for field "%s"', $fieldName)); } return $mapping; }
/** * {@inheritDoc} */ public function resolvePath($obj, $field) { $mapping = $this->factory->fromField($obj, $field); if (null === $mapping) { throw new \InvalidArgumentException(sprintf('Unable to find uploadable field named: "%s"', $field)); } return sprintf('%s/%s', $mapping->getUploadDir(), $mapping->getFileNameProperty()->getValue($obj)); }
/** * Dans le cas d'un document nouvellement enregistré, je vais renommer le nom du fichier uploadé si besoin * @param LifecycleEventArgs $eventArgs [description] * @return [type] [description] */ public function postPersist(LifecycleEventArgs $eventArgs) { $document = $eventArgs->getDocument(); $dm = $eventArgs->getDocumentManager(); $is_uploadable = $this->metadata_reader->isUploadable(ClassUtils::getClass($document)); if ($is_uploadable) { // Récupération des champs uploadable $fields = $this->metadata_reader->getUploadableFields(ClassUtils::getClass($document)); // Pour chacun de ces champs, je récupère le mapping associé pour vérifier le namer et le nom du champ foreach ($fields as $field) { $mapping = $this->mapping_factory->fromField($document, $field['propertyName']); if ($mapping->getNamer() instanceof \Redking\Bundle\UploadBundle\Naming\ObjectNamer) { $filename = $mapping->getFileName($document); $file = $mapping->getFile($document); // Si il y a bien un fichier, je vérifie son nom if (!is_null($filename) && $file instanceof File) { $filename_normalized = $mapping->getNamer()->getNormalizedName($document, $filename); // Si les deux noms ne correspondent pas, je renomme et réassigne if (strcmp($filename, $filename_normalized) !== 0) { $base_directory = $mapping->hasDirectoryNamer() ? $mapping->getDirectoryNamer()->directoryName($document, $mapping) . '/' : ''; $adapter = $this->filesystem_map->get($mapping->getUploadDestination())->getAdapter(); $adapter->rename($base_directory . $filename, $base_directory . $filename_normalized); if ($adapter->exists($base_directory . $filename)) { $adapter->delete($base_directory . $filename); } // On vérifie si il y a des fichiers resized à renommer foreach ($this->resizes as $suffix => $resize_conf) { $resize_filename = $base_directory . ResizedNamer::getName($filename, $suffix); $resize_filename_normalized = $base_directory . ResizedNamer::getName($filename_normalized, $suffix); if ($adapter->exists($resize_filename)) { $adapter->rename($resize_filename, $resize_filename_normalized); if ($adapter->exists($resize_filename)) { $adapter->delete($resize_filename); } } } $mapping->setFileName($document, $filename_normalized); // Ré-enregistrement $class = $dm->getClassMetadata(get_class($document)); $dm->getUnitOfWork()->recomputeSingleDocumentChangeSet($class, $document); } } } // Traitement du répertoire basé sur l'id pour voir si le fichier est bien dedans $directory_namer = $mapping->getDirectoryNamer(); if (!is_null($directory_namer) && $directory_namer instanceof BaseDirectoryIdNamer) { $adapter = $this->filesystem_map->get($mapping->getUploadDestination())->getAdapter(); $filename = $mapping->getFileName($document); $good_path = ltrim($directory_namer->directoryName($document, $mapping) . '/' . $filename, '/'); $bad_path = ltrim($directory_namer->directoryNameError($document, $mapping) . '/' . $filename, '/'); if (!$adapter->exists($good_path) && $adapter->exists($bad_path)) { $success = $adapter->rename($bad_path, $good_path); } } } } }
/** * {@inheritDoc} */ public function resolveUri($obj, $field) { $mapping = $this->factory->fromField($obj, $field); if (null === $mapping) { throw new \InvalidArgumentException(sprintf('Unable to find uploadable field named: "%s"', $field)); } $name = $mapping->getFileNameProperty()->getValue($obj); if ($name === null) { throw new \InvalidArgumentException(sprintf('Unable to get filename property value: "%s"', $field)); } $uriPrefix = $mapping->getUriPrefix(); return $name ? $uriPrefix . '/' . $name : ''; }
/** * Test that the fromField method returns null when an invalid * field name is specified. */ public function testFromFieldReturnsNullOnInvalidFieldName() { $obj = new DummyEntity(); $class = new \ReflectionClass($obj); $uploadable = $this->getMockBuilder('Vich\\UploaderBundle\\Mapping\\Annotation\\Uploadable')->disableOriginalConstructor()->getMock(); $this->adapter->expects($this->any())->method('getReflectionClass')->will($this->returnValue($class)); $this->driver->expects($this->once())->method('readUploadable')->with($class)->will($this->returnValue($uploadable)); $this->driver->expects($this->once())->method('readUploadableField')->with($class)->will($this->returnValue(null)); $factory = new PropertyMappingFactory($this->container, $this->driver, $this->adapter, array()); $mapping = $factory->fromField($obj, 'oops'); $this->assertNull($mapping); }
/** * Test that the fromField method returns null when an invalid * field name is specified. */ public function testFromFieldReturnsNullOnInvalidFieldName() { $obj = new DummyEntity(); $this->metadata->expects($this->once())->method('isUploadable')->with('Vich\\UploaderBundle\\Tests\\DummyEntity')->will($this->returnValue(true)); $this->metadata->expects($this->once())->method('getUploadableField')->with('Vich\\UploaderBundle\\Tests\\DummyEntity')->will($this->returnValue(null)); $factory = new PropertyMappingFactory($this->container, $this->metadata, array()); $mapping = $factory->fromField($obj, 'oops'); $this->assertNull($mapping); }