Sfortunatamente, la pipeline menzionata in Adam Najmanowicz's answer funziona per altri tipi, come Droplink e Multilist, ma la pipeline non viene eseguita per i campi Droptree.
Dopo aver guardato in questo più profondo che ho trovato che la fonte di un campo Droptree sta usando la voce di contesto sbagliato, come detto Adam, ma il codice viene da campo Droptree stessa: -
Sitecore.Shell.Applications.ContentEditor.Tree, Sitecore.Kernel
Utilizzando il codice stringa di query dalla risposta di Adam, possiamo creare un campo personalizzato Droptree 'fisso', che è quasi lo stesso del Droptree normale ma utilizzerà invece l'elemento di contesto corretto. Il codice erediterà dal controllo Tree normale e cambierà solo il modo in cui è impostata la proprietà Source.
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
}
}
Il codice di cui sopra è praticamente la stessa della proprietà Source sulla base Albero campo, se non che noi capire l'elemento giusto contesto dall'URL se abbiamo rilevato che siamo in finestra di dialogo dei parametri di rendering.
Per creare il campo personalizzato, è sufficiente modificare il file Web.Config come descritto here. Quindi aggiungere il campo personalizzato al database principale come descritto in here.
Ciò significa che ora i parametri possono avere query per la loro origine, consentendoci di limitare gli articoli disponibili all'editor di contenuti. (Utile per soluzioni multi-sito).
fonte
2013-08-05 14:13:16
Se si rende l'origine dati un tipo di "configurazione" di articolo con questo campo, può avere un normale controllo Droptree con origine query come descritto. Inoltre, dal momento che ti stai attenendo alla fonte dati, il tuo controllo sarà facilmente personalizzabile e verificabile multivariato. –
La verifica di personalizzazione e verifica è vera, tuttavia questo controllo sta già utilizzando il campo DataSource come un'altra proprietà sul controllo. Sono d'accordo però, il DataSource potrebbe essere usato invece se fosse l'unica proprietà selezionabile. –