Есть ли способ в Sulu CMS программно создать объект изображения без загрузки фактического изображения через интерфейс администратора?
Вариант использования заключается в том, что я хотел бы отобразить резервное изображение с измененным размером, если пользователь не загружает изображение заголовка.
Вы можете использовать сервис sulu_media.media_manager
и предоставить ему новый экземпляр UploadedFile, например:
$mediaManager->save(
new UploadedFile($path, $fileName, $mimeType),
[
'title' => 'Test',
'locale' => 'de',
'description' => '',
'collection' => $collectionId,
// ...
]
);
Если производительность имеет значение или вам нужно импортировать много файлов, вы должны сами создать сущности (носители, файлы, fileVersion, fileVersionMeta) и использовать службу sulu.media.storage
для сохранения фактического файла, который вернет вам storageOptions, например:
$media = new \Media();
$file = new File();
$file->setVersion(1);
$file->setMedia($media);
$media->addFile($file);
$mediaType = $this->entityManager->getReference(
MediaType::class, $this->mediaTypeManager->getMediaType($this->getMimeType($uploadedFile))
);
$media->setType($mediaType);
$collection = $this->entityManager->getReference(Collection::class, $collectionid);)
$media->setCollection($collection);
$storageOptions = $this->mediaStorage->save($file->getPathname(), $fileName)
$fileVersion = new FileVersion();
$fileVersion->setVersion($file->getVersion());
$fileVersion->setSize($uploadedFile->getSize());
$fileVersion->setName($fileName);
$fileVersion->setStorageOptions($storageOptions);
$fileVersion->setMimeType(/* ... */);
$fileVersion->setFile($file);
$file->addFileVersion($fileVersion);
$fileVersionMeta = new FileVersionMeta();
$fileVersionMeta->setTitle($title);
$fileVersionMeta->setDescription('');
$fileVersionMeta->setLocale($locale);
$fileVersionMeta->setFileVersion($fileVersion);
$fileVersion->addMeta($fileVersionMeta);
$fileVersion->setDefaultMeta($fileVersionMeta);
$this->entityManager->persist($fileVersionMeta);
$this->entityManager->persist($fileVersion);
$this->entityManager->persist($file);
$this->entityManager->persist($media);
// after importing the files or after every 100 files you should flush the entitymanager
$this->entityManager->flush();
// I also recommend in a import doing a clear to keep the entitymanager unitofwork small as possible
$this->entityManager->clear();
Диспетчер типов мультимедиа доступен в разделе sulu_media.type_manager
и в доктрине entityManager doctrine.orm.entity_manager
.
В конце концов мы сделали это, используя прокси изображения (большой палец в нашем случае). Это освобождает нас от ограничений формата изображения sulu и позволяет нам генерировать точно масштабированные / обрезанные версии файла, которые нам нужны — все на основе исходного URL-адреса изображения, который использовался для загрузки.