2013-05-17 2 views
1

Есть ли способ параметризовать источник данных для поля «источник» в построителе шаблонов?Sitecore Multisite Manager и поле «source» в построителе шаблонов

У нас есть многоуровневая установка. Как часть этого, это сэкономит массу времени и раздражения, если мы сможем указать, что наши Дрепты и Трелисты указывают на соответствующие места, а не на обычных родителей.

Например:

Content 
    --Site1 
    --Data 
    --Site2 
    --Data 

Вместо того, чтобы указать наш сайт в корневой папке Content Я хочу, чтобы указать его в отдельных папках данных, так что я хочу сделать что-то вроде:

DataSource=/sitecore/content/$sitename/Data 

Я не могу найти статей об этом. Это что-то возможно?

ответ

0

С Sitecore 7 требует VS 2012 и наша компания не собирается модернизировать в ближайшее время я вынужден был найти Sitecore 6.

Опираясь на this article и this one Я придумал это решение.

public class SCWTreeList : TreeList 
{ 
    protected override void OnLoad(EventArgs e) 
    { 
     if (!String.IsNullOrEmpty(Source)) 
      this.Source = SourceQuery.Resolve(SContext.ContentDatabase.Items[ItemID], Source); 

     base.OnLoad(e); 
    } 
} 

Это создает пользовательский TreeList контроль и передает это поле Source через к классу, чтобы справиться с этим. Все, что нужно сделать, это разрешить все, что у вас есть в поле Source, в путь запроса sitecore, который затем можно переназначить в поле источника. Затем это будет обрабатываться собственным механизмом запросов Sitecore.

Так что для нашего решения на несколько сайтов это позволило пути, таким как это:

{A588F1CE-3BB7-46FA-AFF1-3918E8925E09}/$sitename 

постановить пути, такие, как это:

/sitecore/medialibrary/Product Images/Site2 

Наших управления будут показывать только элементы для правильного сайт.

Это метод, который обрабатывает разрешения GUIDs и жетоны:

public static string Resolve(Item item, string query) 
{ 
    // Resolve tokens 
    if (query.Contains("$")) 
    { 
     MatchCollection matches = Regex.Matches(query, "\\$[a-z]+"); 
     foreach (Match match in matches) 
      query = query.Replace(match.Value, ResolveToken(item, match.Value)); 
    } 

    // Resolve GUIDs. 
    MatchCollection guidMatches = Regex.Matches(query, "^{[a-zA-Z0-9-]+}"); 
    foreach (Match match in guidMatches) 
    { 
     Guid guid = Guid.Parse(match.Value); 
     Item queryItem = SContext.ContentDatabase.GetItem(new ID(guid)); 

     if (item != null) 
      query = query.Replace(match.Value, queryItem.Paths.FullPath); 
    } 

    return query; 
} 

Токен обработки ниже, как вы можете видеть, что это требует, чтобы любой элемент, используя $siteref маркер находится внутри Site Folder элемента, который мы создали. Это позволяет нам использовать поле, содержащее имя, которое должно соответствовать всем нашим папкам с несколькими сайтами, - Site Reference. До тех пор, пока это соглашение об именах соблюдается, оно позволяет нам ссылаться на папки в медиа-библиотеке или на любом другом общем содержимом в Sitecore.

static string ResolveToken(Item root, string token) 
{ 
    switch (token) 
    { 
     case "$siteref": 
      string sRef = string.Empty; 

      Item siteFolder = root.Axes.GetAncestors().First(x => x.TemplateID.Guid == TemplateKeys.CMS.SiteFolder); 
      if (siteFolder != null) 
       sRef = siteFolder.Fields["Site Reference"].Value; 

      return sRef; 
    } 

    throw new Exception("Token '" + token + "' is not recognised. Please disable wishful thinking and try again."); 
} 

До сих пор это работает для TreeLists, DropTrees и DropLists. Было бы неплохо заставить его работать с DropLinks, но этот метод, похоже, не работает.

Это похоже на царапину на поверхности, я уверен, что с этим подходом вы можете многое сделать.

2

не по умолчанию, но вы можете использовать эту технику, чтобы кодировать свои источники данных: http://newguid.net/sitecore/2013/coded-field-datasources-in-sitecore/

+0

Отличная статья, спасибо. Похоже, что Sitecore 7 стоит ждать в неделю, и это новая функциональность. – Jon

+0

Если вы можете подождать Sitecore 7, это будет стоить того! –

+0

Выйдет ли Sitecore 7 на следующей неделе !? Я думал, что это займет немного больше времени. – Younes

1

Вы могли бы, возможно, использовать относительные пути, если он подходит с остальной частью структуры сайта. Это может быть так просто, как:

./Data 

Но если поля на случайных элементов по всему дереву, что не может быть Каталог путешествий.

В противном случае попробуйте посмотреть на:

How to use sitecore query in datasource location? (dynamic datasouce)

1

Вы можете посмотреть на использовании Querable Datasource Location и закупорки в getRenderingDatasource трубопровода.

Это действительно зависит от ваших случаев использования. То, что мне нравится в этом решении, заключается в том, что нет необходимости создавать целую кучу элементов управления, которые эффективно делают то же самое, что и Sitecore по умолчанию, и вам не нужно индивидуально кодировать каждый необходимый вам источник данных - просто установите запрос вам нужно получить данные. Вы также можете просто задать запрос источника данных в файле __standard values для шаблонов.

Это очень похоже на предложение Хольгера, я просто думаю, что этот код аккуратнее :)

Смежные вопросы