2011-10-06 9 views
5

¿Es posible establecer la ubicación del origen de datos (no el origen de datos) como una consulta de sitecore?¿Cómo usar la consulta de sitecore en la ubicación del origen de datos? (datasouce dinámico)

Lo que trato de hacer es hacer que la sublayout establezca su ubicación de origen de datos en una carpeta debajo del elemento que la contiene (elemento actual).

La ubicación del origen de datos secundario debe señalar a una carpeta debajo del elemento actual. Así que intenté establecer la ubicación del origen de datos en query:./Items/* pero eso no funcionó.

¿Alguna sugerencia?

Respuesta

10

No necesita la consulta: la ubicación del origen de datos de sublayout puede simplemente usar una ruta relativa. p.ej.

./Items 

Obviamente, esa carpeta ya debe existir. He querido bloguear este código, y puede ser excesivo, pero lo publicaré aquí porque puede ser útil. Se puede agregar lo siguiente a la canalización getRenderingDatasource para crear una ubicación de origen de datos de ruta relativa si no existe ya. Agréguelo antes del procesador GetDatasourceLocation.

En la sublayout, querrá agregar un parámetro contentFolderTemplate=[GUID] para especificar la plantilla del elemento que se crea.

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

Eso es lo que estaba buscando, gracias por la respuesta detallada. –

+0

@ techphoria414 ¿Qué versión de Sitecore usaba para soportar la ruta relativa en el origen de datos de sublayout? Esto es algo que he querido hacer para algunos proyectos ... –

+0

6.4.1, aunque esto está en la ubicación del origen de datos de la sublayout, que es utilizada por el editor de páginas. Después de elegir el elemento, sigue siendo una ruta absoluta (que cambiamos a un GUID en un elemento: controlador de guardado). Si desea admitir rutas relativas en una fuente de datos en general, puede personalizar la clase de utilidad SublayoutParamHelper (o su versión de la misma) para hacer una consulta de Sitecore en lugar de un GetItem. – techphoria414

Cuestiones relacionadas