2011-10-06 6 views
5

È possibile impostare l'ubicazione dell'origine dati (non l'origine dati) come query del sitecore?Come utilizzare la query sitecore nel percorso dell'origine dati? (miscela di dati dinamici)

Quello che sto cercando di fare è che il sottofodice abbia impostato il percorso dell'origine dati in una cartella sotto l'oggetto che lo contiene (elemento corrente).

L'ubicazione dell'origine dati di sottoscheda dovrebbe puntare a una cartella sotto l'elemento corrente. Così ho provato a impostare la posizione dell'origine dati su query:./Items/* ma non ha funzionato.

Qualche suggerimento?

risposta

10

Non è necessaria la query: la posizione dell'origine dati di sottoschera può semplicemente utilizzare un percorso relativo. per esempio.

./Items 

Ovviamente, quella cartella deve esistere già. Ho intenzione di blog questo codice, e potrebbe essere eccessivo, ma pubblicherò qui poiché potrebbe aiutarti. È possibile aggiungere quanto segue alla pipeline getRenderingDatasource per creare un'ubicazione relativa dell'origine dati del percorso, se non esiste già. Aggiungilo prima del processore GetDatasourceLocation.

Nel sottoselezione, è necessario aggiungere un parametro contentFolderTemplate=[GUID] per specificare il modello dell'articolo che viene creato.

public class CreateContentFolder 
{ 
    protected const string CONTENT_FOLDER_TEMPLATE_PARAM = "contentFolderTemplate"; 

    public void Process(GetRenderingDatasourceArgs args) 
    { 
     Assert.IsNotNull(args, "args"); 
     Sitecore.Data.Items.RenderingItem rendering = new Sitecore.Data.Items.RenderingItem(args.RenderingItem); 
     UrlString urlString = new UrlString(rendering.Parameters); 
     var contentFolder = urlString.Parameters[CONTENT_FOLDER_TEMPLATE_PARAM]; 
     if (string.IsNullOrEmpty(contentFolder)) 
     { 
      return; 
     } 
     if (!ID.IsID(contentFolder)) 
     { 
      Log.Warn(string.Format("{0} for Rendering {1} contains improperly formatted ID: {2}", CONTENT_FOLDER_TEMPLATE_PARAM, args.RenderingItem.Name, contentFolder), this); 
      return; 
     } 

     string text = args.RenderingItem["Datasource Location"]; 
     if (!string.IsNullOrEmpty(text)) 
     { 
      if (text.StartsWith("./") && !string.IsNullOrEmpty(args.ContextItemPath)) 
      { 
       var itemPath = args.ContextItemPath + text.Remove(0, 1); 
       var item = args.ContentDatabase.GetItem(itemPath); 
       var contextItem = args.ContentDatabase.GetItem(args.ContextItemPath); 
       if (item == null && contextItem != null) 
       { 
        string itemName = text.Remove(0, 2); 
        //if we create an item in the current site context, the WebEditRibbonForm will see an ItemSaved event and think it needs to reload the page 
        using (new SiteContextSwitcher(SiteContextFactory.GetSiteContext("system"))) 
        { 
         contextItem.Add(itemName, new TemplateID(ID.Parse(contentFolder))); 
        } 
       } 
      } 
     } 
    } 
} 
+0

Questo è quello che stavo cercando, grazie per la risposta dettagliata. –

+0

@ techphoria414 Quale versione di Sitecore stavi utilizzando per supportare il percorso relativo nell'origine dati del sottoseleziona? Questo è qualcosa che ho voluto fare per alcuni progetti ... –

+0

6.4.1, sebbene si trovi nella Posizione origine dati del sottoschermo, che viene utilizzato dall'editor di pagine. Dopo aver scelto l'elemento, è ancora un percorso assoluto (che viene modificato in GUID in un elemento: gestore di salvataggio). Se si desidera supportare i percorsi relativi in ​​un'origine dati in generale, è possibile personalizzare la classe di utilità SublayoutParamHelper (o la propria versione) per eseguire una Query Sitecore anziché un GetItem. – techphoria414

Problemi correlati