2016-02-16 8 views
0

J'utilise Sitecore 6.6 et j'ai un objet Sublayout avec un modèle de paramètre personnalisé. Le modèle param a la section General habituelle (champs Placeholder et Source de données) et une section "Lock" personnalisée qui a juste un champ case à cocher. J'ai ajouté un validateur de champ personnalisé sur la case à cocher, qui est de s'assurer que si la case est cochée - un DataSource est fourni. Dans ma mise en œuvre de validateur j'ai hérité de la classe StandardValidator et je peux vérifier la valeur de la case à cocher cetteObtenir une source de données Sublayout dans l'implémentation du validateur

var currentItem = GetItem(); 
currentItem.Fields["Lock"].Value 

ainsi que par ce paramètre

ControlValidationValue 

Cependant, je ne peux pas trouver un moyen d'accéder aux données champ source. Tous les guides que j'ai trouvé l'obtenir en utilisant le code ci-dessous, mais cela vaut pour les classes héritant du (contrôleur) rendu classe Web.UI.UserControl

if(Parent is Sublayout) 
    _dataSource = Sitecore.Context.Database.GetItem(((Sublayout)Parent).DataSource); 

J'ai besoin de valider la mise en œuvre de StandardValidator afin de fournir une rétroaction dans l'éditeur de contenu et pour empêcher l'enregistrement de l'élément si la validation échoue. Alors, comment puis-je obtenir la valeur du champ DataSource dans l'implémentation de StandardValidator?

Répondre

0

Je l'ai compris finalement. La classe de validateur personnalisé peut hériter de la classe StandardValidator, mais l'élément Sitecore Validator appelant la classe personnalisée doit être un objet ItemValidator, pas FieldValidator. Sinon, il n'y a aucun moyen d'accéder au champ de la source de données. L'inconvénient de ItemValidator est que vous devez l'ajouter à chaque élément qui utilise la sous-couche avec le modèle de paramètre, puis filtrer les rendus/sous-couches qui n'ont pas le modèle de paramètre.

Utilisez la ligne ci-dessous pour obtenir toutes les références de rendu (de la réponse de Sitecore Climber)

var renderingRefs = GetItem().Visualization.GetRenderings(Sitecore.Context.Device, false); 

Ensuite, vous devez filtrer les rendus non pertinents - par exemple faites-les correspondre à une liste de GUID d'élément ou d'ID de modèle qui utilisent votre modèle param. Une fois que vous avez filtré le rendu non pertinent (s), accéder à la source de données comme ceci:

var dataSource = myRendering.Settings.DataSource; 

Aussi, Sitecore vient de rentrer à moi et essentiellement confirmé ce que je disais plus haut. Voici leur réponse

Les paramètres d'un rendu ne sont pas stockés dans un élément spécifique de l'arborescence du contenu, mais dans le champ __renderings de l'élément qui a ce rendu. Ainsi, afin de vérifier la valeur du paramètre DataSource, vous devez créer un validateur pour l'élément de contenu et utiliser l'API suivante pour obtenir le rendu et sa source de données:

foreach (var rendering in item.Visualization.GetRenderings(
     new DeviceItem(master.GetItem("{FE5D7FDF-89C0-4D99-9AA3-B5FBD009C9F3}")), //get correct device item here 
     false)) 
    { 
     if(rendering.RenderingID == new ID("some rendering ID")) 
      //do something with rendering.Settings.DataSource here 
    } 
0

Vous pouvez utiliser le code ci-dessous pour obtenir les sources de données d'un élément, je n'ai pas testé dans un standardValidator mais je suppose que cela fonctionnera

public static class ItemExtensions 
{ 
    public static RenderingReference[] GetRenderingReferences(this Item i) 
    { 
     if (i == null) 
     { 
      return new RenderingReference[0]; 
     } 
     return i.Visualization.GetRenderings(Sitecore.Context.Device, false); 
    } 

    public static List<Item> GetDataSourceItems(this Item i) 
    { 
     List<Item> list = new List<Item>(); 
     foreach (RenderingReference reference in i.GetRenderingReferences()) 
     { 
      Item dataSourceItem = reference.GetDataSourceItem(); 
      if (dataSourceItem != null) 
      { 
       list.Add(dataSourceItem); 
      } 
     } 
     return list; 
    } 

    public static Item GetDataSourceItem(this RenderingReference reference) 
    { 
     if (reference != null) 
     { 
      return GetDataSourceItem(reference.Settings.DataSource, reference.Database); 
     } 
     return null; 
    } 

    private static Item GetDataSourceItem(string id, Database db) 
    { 
     Guid itemId; 
     return Guid.TryParse(id, out itemId) 
           ? db.GetItem(new ID(itemId)) 
           : db.GetItem(id); 
    } 
} 

Dans la classe validateur vous utiliserez:

foreach (Item dataSourceItem in GetItem().GetDataSourceItems()) 
{ 
    //your code 
} 
+0

La ligne 'i.Visualization. GetRenderings (Sitecore.Context.Device, false) 'renvoie 0 références de rendu. –