I had some discussions about this blog post and had to check up some things. Accidently I found the IContentRepository.GetReferenceInformationForContent(ContentReference contentLink, bool includeDecendents) (implemented on DataFactory) which runs the Stored Procedure [editDeletePageCheck]. This is normally used to warn an editor about referencing pages when editing och deleting content.
According to the ExpressProfiler it goes to the database each time I run the command so it might be good to keep this in mind.
Here is the new code:
var contents = new List<ContentData>(); var repository = ServiceLocator.Current.GetInstance<IContentRepository>(); IEnumerable references = repository.GetReferencesToContent(contentLink, false); foreach (ReferenceInformation reference in references) { ContentReference ownerContentLink = reference.OwnerID; CultureInfo ownerLanguage = reference.OwnerLanguage; ILanguageSelector selector = new LanguageSelector(ownerLanguage.Name); var content = repository.Get<ContentData>(ownerContentLink, selector); var contentArea = content["ResponsibleEditors"] as ContentArea; if (contentArea != null) { if (contentArea.ContentFragments.Any(fragment => fragment.ContentLink == contentLink)) contents.Add(content); } }
While browsing in the tblContentProperty I stumbled upon how a ContentArea is saved in the database.
It’s quite similar to how Dynamic Content is serialized in a XhtmlString:
<div data-classid=”36f4349b-8093-492b-b616-05d8964e4c89″ data-contentguid=”7cef1c69-b345-493c-a60e-ce011fe42c31″ data-contentlink=”35″ data-contentname=”Content Name”>{}</div><div data-classid=”36f4349b-8093-492b-b616-05d8964e4c89″ data-contentguid=”216210e0-f687-4f7a-9bc9-c2a51badab1a” data-contentlink=”701″ data-contentname=”Another Content Name”>{}</div>
In my example I have a Page Type called EditorPage presenting all persons in the staff who can be responsible to the web sites articles.
To present an articles responsible editor I have added a ContentArea where the editor simply drops Editor Pages.
On the Editor Page I want to list all the article where the Editor is connected.
So all I have to do to find pages that have a specific Content (for example Page or Block) referenced in a ContentArea is this:
string id = ID-TO-YOUR-CONTENT; PropertyCriteriaCollection criterias = new PropertyCriteriaCollection { new PropertyCriteria { Condition = CompareCondition.Contained, Name = "ResponsibleEditors", Required = true, Type = PropertyDataType.String, Value = string.Format("data-contentlink=\"{0}\"", id) } }; IPageCriteriaQueryService queryService = ServiceLocator.Current.GetInstance<IPageCriteriaQueryService>(); PageDataCollection pages = queryService.FindPagesWithCriteria(ContentReference.StartPage, criterias);
You can also use the content GUID and use this as Value: string.Format(“data-contentguid=\”{0}\””, guid)
As usual, if you want to use FindPagesWithCriteria, remember to put a cache on it since it can be quite heavy on the database.