Как использовать запрос sitecore в расположении источника данных? (динамический источник данных)

Можно ли установить местоположение источника данных (а не источник данных) в качестве запроса sitecore?

Я пытаюсь сделать так, чтобы подмакет установил местоположение источника данных в папку под элементом, содержащим его (текущий элемент).

Расположение источника данных подмакета должно указывать на папку в текущем элементе. Поэтому я попытался установить местоположение источника данных на query:./Items/*, но это не сработало.


person Community    schedule 06.10.2011    source источник


Ответы (1)


Вам не нужен запрос — местоположение источника данных подмакета может просто использовать относительный путь. например

./Items

Однако очевидно, что эта папка уже должна существовать. Я хотел опубликовать этот код в блоге, и это может быть излишним, но я опубликую здесь, так как это может вам помочь. В конвейер getRenderingDatasource можно добавить следующее, чтобы создать расположение источника данных относительного пути, если оно еще не существует. Добавьте его перед процессором GetDatasourceLocation.

В подмакете вам нужно добавить параметр contentFolderTemplate=[GUID], чтобы указать шаблон создаваемого элемента.

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)));
                    }
                }
            }
        }
    }
}
person nickwesselman    schedule 06.10.2011
comment
Это то, что я искал, спасибо за подробный ответ. - person ; 07.10.2011
comment
@ techphoria414 Какую версию Sitecore вы использовали для поддержки относительного пути к источнику данных вложенного макета? Это то, что я хотел сделать для нескольких проектов... - person Jay S; 01.11.2011
comment
6.4.1, хотя это находится в расположении источника данных подмакета, который используется редактором страниц. После того, как элемент выбран, это по-прежнему абсолютный путь (который мы меняем на GUID в обработчике элемента: сохранение). Если вы хотите поддерживать относительные пути в источнике данных в целом, вы можете настроить служебный класс SublayoutParamHelper (или его версию) для выполнения запроса Sitecore вместо GetItem. - person nickwesselman; 02.11.2011