/**
* Replace resource on an asset. Takes variants and redirect handling into account.
*
* @param AssetInterface $asset
* @param PersistentResource $resource
* @param array $options
* @return void
*/
public function replaceAssetResource(AssetInterface $asset, PersistentResource $resource, array $options = [])
{
$originalAssetResource = $asset->getResource();
$asset->setResource($resource);
if (isset($options['keepOriginalFilename']) && (bool) $options['keepOriginalFilename'] === true) {
$asset->getResource()->setFilename($originalAssetResource->getFilename());
}
$uriMapping = [];
$redirectHandlerEnabled = isset($options['generateRedirects']) && (bool) $options['generateRedirects'] === true && $this->packageManager->isPackageAvailable('Neos.RedirectHandler');
if ($redirectHandlerEnabled) {
$uriMapping[$this->resourceManager->getPublicPersistentResourceUri($originalAssetResource)] = $this->resourceManager->getPublicPersistentResourceUri($asset->getResource());
}
if (method_exists($asset, 'getVariants')) {
$variants = $asset->getVariants();
/** @var AssetVariantInterface $variant */
foreach ($variants as $variant) {
$originalVariantResource = $variant->getResource();
$variant->refresh();
if (method_exists($variant, 'getAdjustments')) {
foreach ($variant->getAdjustments() as $adjustment) {
if (method_exists($adjustment, 'refit')) {
$adjustment->refit($asset);
}
}
}
if ($redirectHandlerEnabled) {
$uriMapping[$this->resourceManager->getPublicPersistentResourceUri($originalVariantResource)] = $this->resourceManager->getPublicPersistentResourceUri($variant->getResource());
}
$this->getRepository($variant)->update($variant);
}
}
if ($redirectHandlerEnabled) {
/** @var \Neos\RedirectHandler\Storage\RedirectStorageInterface $redirectStorage */
$redirectStorage = $this->objectManager->get(\Neos\RedirectHandler\Storage\RedirectStorageInterface::class);
foreach ($uriMapping as $originalUri => $newUri) {
$existingRedirect = $redirectStorage->getOneBySourceUriPathAndHost($originalUri);
if ($existingRedirect === null) {
$redirectStorage->addRedirect($originalUri, $newUri, 301);
}
}
}
$this->getRepository($asset)->update($asset);
$this->emitAssetResourceReplaced($asset);
}