2013-08-02 14 views
6

Ho un modello Parametro di rendering applicato a un sottotesto. Ha un singolo campo Droptree su di esso e voglio impostare l'origine di quel campo su una query Sitecore in modo da limitare le opzioni disponibili per quel campo.Imposta origine interrogabile nel campo Modello parametro di rendering

Fonte può essere:

query:./*

o

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

La query ha solo bisogno di afferrare gli elementi relativi al l'elemento di contenuto che siamo sulla. Questo normalmente funziona con i campi Droptree nell'editor di contenuti.

Tuttavia, sto trovando che la query non funziona qui perché siamo nei parametri di rendering, quindi non sta utilizzando l'elemento di contenuto come è il contesto. La query non riesce e ho appena ottenuto l'albero completo Sitecore.

ho trovato questo può essere fissato per il campo Origine dati con 'Queryable origine dati Luoghi' a questo link: - http://www.cognifide.com/blogs/sitecore/reduce-multisite-chaos-with-sitecore-queries/

Tuttavia non so da dove cominciare per ottenere questo a lavorare per altri il rendering campi dei parametri.

Qualche idea? (Sto usando Sitecore 6.6 Update 5)

+0

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

+0

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

risposta

7

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

5

La chiave qui sarebbe quella di impostare il contesto del Field Editor in modo che sia relativo all'elemento che si sta modificando invece dei parametri di Rendering (che penso che abbia per impostazione predefinita). Così si potrebbe avere il processore:

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; 
     } 
    } 
} 

agganciato come:

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

Insieme ResolveQueryableDatasources dal blog di Przemek questo dovrebbe risolvere il problema.

+1

Domanda diversa ma hai inavvertitamente risolto un problema con cui mi sono battuto per un giorno intero, quindi grazie enorme =) http://sdn.sitecore.net/forum/ShowPost.aspx?PostID=62695#62695 – getsetcode

Problemi correlati