2012-02-02 7 views
5

Ora sto combattendo con l'aggiunta di elementi tramite C# al database Sitecore.Come compilare a livello di programmazione elementi Sitecore (Aggiungi elemento e campi)?

Il codice riportato di seguito viene eseguito correttamente, tuttavia gli articoli non vengono creati.

Inoltre, ho notato che l'elemento ["FieldName"] = valore; la sintassi non compila effettivamente la raccolta Fields.

E la raccolta Campi sull'elemento sembra di sola lettura, quindi non posso semplicemente chiamare .Add su di esso (tale metodo non esiste).

Quindi, qual è il modo corretto di creare un elemento figlio e compilare i relativi campi?

Sto utilizzando il database master sia per il backend Sitecore che per questo codice.

Il codice che uso qui di seguito:

using (new Sitecore.SecurityModel.SecurityDisabler()) 
    { 

     Database db = Factory.GetDatabase(this.Database); 

     foreach (var vacancy in Articles.Tables[0].Rows) 
     { 
      var rootItem = db.GetItem(this.RootItem); 
      DataRow dr = (DataRow) vacancy; 

      var newItem = rootItem.Add(string.Format("{0} {1}", dr["numericID"], dr["job_name"]), 
             db.GetTemplate(new ID("{GUID}"))); 

      newItem.Editing.BeginEdit(); 
      newItem["Job Title"] = dr["job_name"].ToString();// 
      newItem.Editing.EndEdit(); 
     } 
} 

Maggiori informazioni: newItem.Template.Fields restituisce un insieme con 100 campi

newItem.Fields restituisce un FieldCollection con solo 9 elementi in esso.

Quando passo il codice newItem ["campo"]. Valore = valore; non incrementa il conteggio delle raccolte newItem.Fields.

Ovviamente il tasto "campo" è coerente con quelli presenti in newItem.Template.Fields [x] .Name.

risposta

5

1) Controllare alcune cose prima f.ex:

assing il modello a una variabile e controllare ciò che arriva. e meglio non farlo per ID piuttosto dal percorso:

var templateItem = db.GetTemplate("yourTemplatePath"); 

ora verificare se tale sia il modello che si desidera? assicurarsi che sia pubblicato (può sempre causare alcune incongruenze)

2) Per quanto riguarda i campi non essere 'visibile', hai provato: item.Fields.ReadAll()

3) Che cosa si intende per "voci non si creano "? come lo controlleresti?

4) Inoltre, sei sicuro che this.Database == "master"?

+0

2) Sì, questo ha aiutato a pre-compilare la raccolta Fields, ti farò sapere come vado d'accordo. –

+0

3) Non li ho visti nell'editor dei contenuti Sitecore quando si utilizza il database master. –

+0

4) Sì ......... –

2

vorrei suggerire l'impostazione del valore di campo come

newItem.Fields["Job Title"].Value = dr["job_name"].ToString();// 

Tutto il resto sembra ok.

+0

Grazie, proverò che ora –

+0

se "nome_lavoro" consente valori nulli, è necessario verificare se il valore non è nullo prima di convertire in stringa. –

+0

Probabilmente vale la pena menzionare che è possibile utilizzare la scorciatoia newItem ["Job Title"] = "qualunque" – geedubb

4

lo consiglio due modifiche:

(1) La voce approccio di denominazione:

var newItem = rootItem.Add(ItemUtil.ProposeValidItemName(string.Format("{0} {1}", dr["numericID"], dr["job_name"])), db.GetTemplate(new ID("{GUID}"))); 

Questo cambiamento di gestire caratteri non validi nel nome proposto dalla altra fonte di dati.

(2) Il campo di impostazione del valore approccio:

newItem.Fields["Job Title"].Value = dr["job_name"].ToString(); 

Questo imposterà il valore grezzo del campo per la stringa fornita.

+0

Grazie. Cosa accadrebbe se assegnassi valori non validi (ad esempio una stringa di testo in un campo Integer)? Avrei ricevuto una bella eccezione dal codice di base Sitecore, o solo (come nel mio caso) nessuna scrittura sarebbe accaduta? –

+0

I campi contengono sempre valori stringa –

+0

Grazie per il suggerimento intelligente di ProposeValidName, anche questo mi mancava, tuttavia in questo caso non si trattava di un problema. Posso solo contrassegnare una risposta come "accettata" però :( –

Problemi correlati