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)));
}
}
}
}
}
}
Eso es lo que estaba buscando, gracias por la respuesta detallada. –
@ 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 ... –
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