Handling fields that contain Component Links
Some Components contain a Component Link field, that is, a reference to a Component. To access the Component Link target in the Content Manager, navigate the data structure as in the following example:
static void ComponentComponentLinksFields(CoreServiceClient client)
{
// Define a filter to return only Components
OrganizationalItemItemsFilterData componentFilter = new OrganizationalItemItemsFilterData
{
ItemTypes = new[] { ItemType.Component }
};
// Get the Publication identified by publicationURI
const string publicationUri = "tcm:0-3-1";
PublicationData publication = (PublicationData)client.Read(publicationUri, null);
// Get the list of Components in the root Folder of the Publication;
XElement components = client.GetListXml(publication.RootFolder.IdRef, componentFilter);
string firstComponentUri = components.Elements().Select(component => component.Attribute("ID").Value).First();
// Get the Fields of the first Component in that list;
ComponentData firstComponent = (ComponentData)client.Read(firstComponentUri, null);
SchemaFieldsData schemaFields = client.ReadSchemaFields(firstComponent.Schema.IdRef, false, null);
ItemFieldDefinitionData seeAlsoFieldDefinition = schemaFields.Fields.Single(f => f.Name == "SeeAlso");
if (seeAlsoFieldDefinition != null)
{
if (seeAlsoFieldDefinition is ComponentLinkFieldDefinitionData)
{
XDocument content = XDocument.Parse(firstComponent.Content);
XNamespace ns = schemaFields.NamespaceUri;
string linkedComponentUri = content.Root.Element(ns + "SeeAlso").Attribute("{http://www.w3.org/1999/xlink}href").Value;
Console.WriteLine("Linked Component Uri: {0}", linkedComponentUri);
}
else
{
Console.WriteLine("Field SeeAlso is not a component link field!");
}
}
else
{
Console.WriteLine("No field named SeeAlso found!");
}
}