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).
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. –
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ą. –