Property editors can be extended further to track entity references that may be selected or referenced inside the property editor. For example in the core of the CMS we have added this to numerous property editors.
A good example of this is the Media Picker. The CMS stores a reference to the selected media item, enabling the identification of content nodes that use that particular media item. This avoids it being accidentally deleted if it is being used.
When a content node is saved it will save the entity references as relations.
Viewing References
For Media Items
Go to the Media section.
Select a media item and click the Info tab.
For Content Nodes
Go to the Settings section.
Under the Relation Types folder, select Related Document relations and click Relations.
For Data Types
Go to the Settings section.
Expand the Data Types folder.
Select the Data Type you wish to view the references
Navigate to the Info tab.
Example
The following example shows how to implement tracking for the inbuilt CMS property editor Content Picker. It will always add a specific media reference, regardless of what value is picked in the content picker. In your own implementations, you will need to parse the value stored from the property editor you are implementing. You will also need to find any references to picked items in order to track their references.
usingSystem;usingSystem.Collections.Generic;usingUmbraco.Cms.Core;usingUmbraco.Cms.Core.Composing;usingUmbraco.Cms.Core.DependencyInjection;usingUmbraco.Cms.Core.Models;usingUmbraco.Cms.Core.Models.Editors;usingUmbraco.Cms.Core.PropertyEditors;usingUmbraco.Extensions;namespaceUmbraco.Web.PropertyEditors{publicclassExampleComposer:IComposer {publicvoidCompose(IUmbracoBuilder builder) {builder.DataValueReferenceFactories().Append<TrackingExample>(); } }publicclassTrackingExample:IDataValueReferenceFactory,IDataValueReference {publicIDataValueReferenceGetDataValueReference() =>this; // Which Data Editor (Data Type) does this apply to - in this example it is the built in content picker of UmbracopublicboolIsForEditor(IDataEditor dataEditor) =>dataEditor.Alias.InvariantEquals(Constants.PropertyEditors.Aliases.ContentPicker);publicIEnumerable<UmbracoEntityReference> GetReferences(object value) { // Value contains the raw data that is being saved for a property editor // You can then analyse this data be it a complex JSON structure or something more trivial // To add the chosen entities as references (as any UDI type including custom ones) // A very simple example // This will always ADD a specific media reference to the collection list // When it's a ContentPicker datatypevar references =newList<UmbracoEntityReference>();var udiType =ObjectTypes.GetUdiType(UmbracoObjectTypes.Media);var udi =Udi.Create(udiType,Guid.Parse("fbbaa38d-bd93-48b9-b1d5-724c46b6693e"));var entityRef =newUmbracoEntityReference(udi);references.Add(entityRef);return references; } }}
usingSystem;usingSystem.Collections.Generic;usingUmbraco.Cms.Core;usingUmbraco.Cms.Core.Composing;usingUmbraco.Cms.Core.DependencyInjection;usingUmbraco.Cms.Core.Models;usingUmbraco.Cms.Core.Models.Editors;usingUmbraco.Cms.Core.PropertyEditors;usingUmbraco.Extensions;namespaceUmbraco.Web.PropertyEditors{publicclassExampleComposer:IComposer {publicvoidCompose(IUmbracoBuilder builder) {builder.DataValueReferenceFactories().Append<TrackingExample>(); } }publicclassTrackingExample:IDataValueReferenceFactory,IDataValueReference {publicIDataValueReferenceGetDataValueReference() =>this; // Which Data Editor (Data Type) does this apply to - in this example it is the built in content picker of UmbracopublicboolIsForEditor(IDataEditor? dataEditor) =>dataEditor?.Alias==Constants.PropertyEditors.Aliases.ContentPicker;publicIEnumerable<UmbracoEntityReference> GetReferences(object? value) { // Value contains the raw data that is being saved for a property editor // You can then analyse this data be it a complex JSON structure or something more trivial // To add the chosen entities as references (as any UDI type including custom ones) // A very simple example // This will always ADD a specific media reference to the collection list // When it's a ContentPicker datatypevar references =newList<UmbracoEntityReference>();var udiType =ObjectTypes.GetUdiType(UmbracoObjectTypes.Media);var udi =Udi.Create(udiType,Guid.Parse("fbbaa38d-bd93-48b9-b1d5-724c46b6693e"));var entityRef =newUmbracoEntityReference(udi);references.Add(entityRef);return references; } }}