2013-08-02 28 views
6

Mam szablon Renderowanie parametrów zastosowany do sublayout. Ma jedno pole DropTree na nim i chcę ustawić źródło tego pola na kwerendę Sitecore, więc mogę ograniczyć opcje dostępne dla tego pola.Ustaw źródło kwerendy w polu Szablon szablonu renderowania

źródłowy może być:

query:./*

lub

query:./ancestor-or-self::*[@@templatename='MyTemplate']/

Kwerenda po prostu musi chwycić elementów względem elementu treści, że jesteśmy na. Zwykle działa z polami Droptree w edytorze treści.

Jednak stwierdzam, że zapytanie nie działa tutaj, ponieważ jesteśmy w parametrach renderowania, więc nie używa elementu treści w jego kontekście. Kwerenda nie powiedzie się i właśnie dostaję pełne drzewo Sitecore.

znalazłem ten może zostać ustalona na polu DataSource z „Queryable DataSource Lokalizacje” pod tym linkiem: - http://www.cognifide.com/blogs/sitecore/reduce-multisite-chaos-with-sitecore-queries/

Jednak nie wiem od czego zacząć, aby uzyskać to działa dla innych renderowania pola parametrów.

Wszelkie pomysły? (Używam Sitecore 6.6 Update 5)

+0

Jeśli zmienisz źródło danych w typ "konfiguracyjny" w tym polu, może on mieć normalną kontrolę Droptree ze źródłem zapytań, tak jak to opisałeś. Dodatkowo, ponieważ trzymasz się źródła danych, twoja kontrola będzie łatwa do spersonalizowania i testowania na wiele odmian. –

+0

Właściwość Personalizacja i testowanie jest prawdą, jednak ta kontrolka już używa pola DataSource jako innej właściwości kontrolki. Zgadzam się jednak, że DataSource mógłby zostać użyty zamiast tego, gdyby był jedyną możliwą do wybrania własnością. –

Odpowiedz

7

Niestety, rurociąg wspomniany w Adam Najmanowicz's answer działa dla niektórych innych typów, takich jak Droplink i Multilist, ale potok nie jest uruchamiany dla pól Droptree.

Po patrząc na to głębiej okazało się, że źródło pola Droptree korzysta niewłaściwy element kontekstu, jak wspomniano Adam, ale kod pochodzi z pola Droptree samego: -

Sitecore.Shell.Applications.ContentEditor.Tree, Sitecore.Kernel

Wykorzystując kod ciągu zapytania z odpowiedzi Adama, możemy utworzyć "stałe" pole niestandardowe Droptree, które jest prawie takie samo jak zwykły obiekt Droptree, ale zamiast tego użyje właściwego elementu kontekstowego. Kod dziedziczy ze zwykłej kontrolki drzewa i zmienia tylko sposób ustawiania właściwości źródła.

public class QueryableTree : Sitecore.Shell.Applications.ContentEditor.Tree 
{ 
    // override the Source property from the base class 
    public new string Source 
    { 
     get 
     { 
      return StringUtil.GetString(new string[] 
      { 
       base.Source  // slightly altered from the original 
      }); 
     } 
     set 
     { 
      Assert.ArgumentNotNull(value, "value"); 
      if (!value.StartsWith("query:", StringComparison.InvariantCulture)) 
      { 
       base.Source = value;   // slightly altered from the original 
       return; 
      } 
      Item item = Client.ContentDatabase.GetItem(this.ItemID); 

      // Added code that figures out if we're looking at rendering parameters, 
      // and if so, figures out what the context item actually is. 
      string url = WebUtil.GetQueryString(); 
      if (!string.IsNullOrWhiteSpace(url) && url.Contains("hdl")) 
      { 
       FieldEditorParameters parameters = FieldEditorOptions.Parse(new UrlString(url)).Parameters; 
       var currentItemId = parameters["contentitem"]; 
       if (!string.IsNullOrEmpty(currentItemId)) 
       { 
        Sitecore.Data.ItemUri contentItemUri = new Sitecore.Data.ItemUri(currentItemId); 
        item = Sitecore.Data.Database.GetItem(contentItemUri); 
       } 
      } 

      if (item == null) 
      { 
       return; 
      } 
      Item item2 = item.Axes.SelectSingleItem(value.Substring("query:".Length)); 
      if (item2 == null) 
      { 
       return; 
      } 
      base.Source = item2.ID.ToString();   // slightly altered from the original 
     } 
    } 

Powyższy kod jest prawie taka sama jak właściwość source na Drzewo pola podstawy, oprócz tego, że możemy dowiedzieć się właściwą pozycję kontekstowe z adresu URL, jeśli Wykryliśmy, że jesteśmy w okno dialogowe wyświetlania parametrów.

Aby utworzyć niestandardowe pole, wystarczy edytować plik Web.Config zgodnie z opisem here. Następnie dodaj niestandardowe pole do głównej bazy danych zgodnie z opisem podanym pod adresem here.

Oznacza to, że parametry mogą teraz mieć zapytania dla ich źródła, co pozwala nam ograniczyć dostępne elementy do edytora treści. (Przydatny w przypadku rozwiązań wielostronnych).

5

Kluczem byłoby ustawienie kontekstu edytora pola względem względnie edytowanego obiektu zamiast parametrów renderowania (domyślnie domyślnie). Więc można mieć Procesor:

public class ResolveRelativeQuerySource 
{ 
    public void Process(GetLookupSourceItemsArgs args) 
    { 
     Assert.IsNotNull(args, "args"); 
     if (!args.Source.StartsWith("query:")) 
      return; 
     Item contextItem = null; 
     string url = WebUtil.GetQueryString(); 
     if (!string.IsNullOrWhiteSpace(url) && url.Contains("hdl")) 
     { 
      FieldEditorParameters parameters = FieldEditorOptions.Parse(new UrlString(url)).Parameters; 
      var currentItemId = parameters["contentitem"]; 
      if (!string.IsNullOrEmpty(currentItemId)) 
      { 
       Sitecore.Data.ItemUri contentItemUri = new Sitecore.Data.ItemUri(currentItemId); 
       contextItem = Sitecore.Data.Database.GetItem(contentItemUri); 
      } 
     } 
     else 
     { 
      contextItem = args.Item; 
     } 
    } 
} 

dośrodkowaniu jak:

<sitecore> 
    <pipelines> 
    <getLookupSourceItems> 
    <processor patch:before="*[@type='Sitecore.Pipelines.GetLookupSourceItems.ProcessQuerySource, Sitecore.Kernel']" 
     type="Cognifide.SiteCore.Logic.Processors.ResolveRelativeQuerySource, Cognifide.SiteCore" /> 
    </getLookupSourceItems> 
    </pipelines> 
</sitecore> 

Razem z ResolveQueryableDatasources z blogu Przemka to powinno rozwiązać problem.

+1

Inne pytanie, ale przypadkowo rozwiązałeś problem, z którym borykałem się przez cały dzień, tak bardzo dziękuję =) http://sdn.sitecore.net/forum/ShowPost.aspx?PostID=62695#62695 – getsetcode