Five New Optimizely Certifications are Here! Validate your expertise and advance your career with our latest certification exams. Click here to find out more
Five New Optimizely Certifications are Here! Validate your expertise and advance your career with our latest certification exams. Click here to find out more
var contentLoader = ServiceLocator.Current.GetInstance<IContentLoader>();
var repository = ServiceLocator.Current.GetInstance<IContentRepository>();
var archiveFolderRef = <%YourContentRefToArchiveFolder%>
var folder = repository.GetDefault<ContentAssetFolder>(archive);
foreach(var fileRef in fileRefs)
{
var mediaFile = repository.Get<MediaData>(fileRef)
folder.Attach(mediaFile);
}
repository.Save(folder, SaveAction.Publish);
I tried similiar code this afternoon, but I kept getting the following errors
"The specified content does not implement IResourcable and hence it cannot have a content asset folder"
Hi Petter
I reflected into MediaData source code, and I saw the MediaData didn't not implement the IResource interface, therefore folder.Attach method gets called, it throws that exception.
public virtual void Attach(IContent content)
{
Validator.ThrowIfNull("content", content);
IResourceable resourceable = content as IResourceable;
if (resourceable == null)
{
throw new ArgumentException("The specified content does not implement IResourcable and hence it cannot have a content asset folder");
}
if ((this.ContentGuid == Guid.Empty) || (content.ContentGuid == Guid.Empty))
{
throw new InvalidOperationException("Both content and ContentAssetFolder must have values assigned for ContentGuid before they can be attached");
}
if (string.IsNullOrEmpty(this.Name))
{
this.Name = content.Name;
}
resourceable.ContentAssetsID = this.ContentGuid;
this.ContentOwnerID = content.ContentGuid;
}
public virtual void Attach(IContent content)
{
Validator.ThrowIfNull("content", content);
IResourceable resourceable = content as IResourceable;
if (resourceable == null)
{
throw new ArgumentException("The specified content does not implement IResourcable and hence it cannot have a content asset folder");
}
if ((this.ContentGuid == Guid.Empty) || (content.ContentGuid == Guid.Empty))
{
throw new InvalidOperationException("Both content and ContentAssetFolder must have values assigned for ContentGuid before they can be attached");
}
if (string.IsNullOrEmpty(this.Name))
{
this.Name = content.Name;
}
resourceable.ContentAssetsID = this.ContentGuid;
this.ContentOwnerID = content.ContentGuid;
}
Hmm didn't have time to try my code while at work. And after playing some at home I still can't find a way to move the file. But I found a workaround.
The following code works in the alloy templates.
var contentAssetFolder = _contentRepository.Get<ContentFolder>(SiteDefinition.Current.SiteAssetsRoot);
var images = _contentRepository.GetChildren<ImageFile>(contentAssetFolder.ContentLink);
var folders = _contentRepository.GetChildren<IContent>(SiteDefinition.Current.SiteAssetsRoot);
foreach (var item in folders)
{
if (item.Name == "Events")
{
var folder = item;
ImageFile image = images.First() as ImageFile;
var newFile = _contentRepository.GetDefault<ImageFile>(item.ContentLink);
newFile.Name = image.Name;
newFile.BinaryData = image.BinaryData;
_contentRepository.Save(newFile , SaveAction.Publish);
_contentRepository.Delete(image.ContentLink, true);
}
}
Here I take the first file in the root folder and then find the Events folder and create a new item in it. Then set the new item to the same binarydata as the old one and save it. Then remove the old one.
Not the way I would want to do it but the only way I could figure out.
Tried with:
if (item.Name == "Events")
{
var folder = item;
ImageFile image = images.First().CreateWritableClone() as ImageFile;
image.ParentLink = folder.ContentLink;
_contentRepository.Save(image , SaveAction.Publish);
}
But that didn't work. So you could use the first snippet in wait for someone more in the know showing us how it's done =)
how about
_contentRepository.Move(mediaContentLink, destinationContentLink);
Hahaha way to easy ;)
Thanks Per. Most have been tired when checking the API.
Hehe, no problem.
Quick tip: If you need to find content matching a name, instead of using .GetChildren, looping through and checking for a matching name, you could instead do:
_contentRepository.GetBySegment(destinationContentLink, "events", null);
I have two media folders - upload and archive. There is a job running in the system processes the file that user uploads in the upload folder. Once it's complete, it needs to move the file to the archive folder.
I can retrieve all the files from the upload folder and process it programatically, but I don't have any clue how to link the processed file to archive folder, can some one provide a code sample?
thanks