2012-09-05 8 views
8

Sto eseguendo una pubblicazione programmata del mio DB master Sitecore utilizzando l'API di pubblicazione Sitecore. Io lo chiamo un servizio web a intervalli pianificati durante il giorno che corre il seguente codice (leggermente condensato per migliorare la leggibilità):Perché Sitecore pubblica articoli bozza dall'API C# e come posso smettere di farlo?

// grab the root content node from sitecore 
Item contentNode = dbSource.Items[ID.Parse("{0DE95AE4-41AB-4D01-9EB0-67441B7C2450}")]; 

PublishOptions options = new PublishOptions(sourceDatabase, targetDatabase, PublishMode.Smart, lang, DateTime.Now); 

options.RootItem = contentNode; 

options.Deep = true; 

Publisher p = new Publisher(options); 

p.PublishAsync(); 

Quando si esegue il codice sopra pubblica tutto nel nodo di contenuti, tra cui tutti i discendenti, a prescindere dalla stato del flusso di lavoro. È come se ignorasse completamente il flusso di lavoro. Questo non è ciò che cerchiamo e sta causando molti problemi sul nostro sito web dal vivo.

Se eseguiamo la stessa azione da Sitecore Desktop, pubblica tutto nel nodo del contenuto, inclusi tutti i discendenti, che sono pubblicabile (nella fase finale del flusso di lavoro). Non pubblica alcun elemento nell'albero che è ancora in modalità bozza. Questo è il bahaviour richiesto.

ho cercato l'attuazione del codice di come un utente non amministratore circondando il codice precedente con la seguente istruzione using:

string userName = @"sitecore\******"; 

Sitecore.Security.Accounts.User user = Sitecore.Security.Accounts.User.FromName(userName, true); 

user.RuntimeSettings.IsAdministrator = false; 

using (new Sitecore.Security.Accounts.UserSwitcher(user)) 
{ 
    ... 
} 

Purtroppo questo non ha avuto alcun effetto.

C'è qualcosa di ovvio che ho perso, o lo sto facendo bene e Sitecore lo sta facendo male? Qualcuno può aiutare, per favore?

La cosa strana che ho notato, inoltre, è che gli articoli bozza che sono stati pubblicati, se visualizzati sul database live, non mostravano assolutamente nulla nel Sitecore Desktop in termini di campi o metadati. Sono stati anche mostrando un avvertimento che "La voce corrente non dispone di una versione in 'inglese:. Inglese'

+0

Non hai bisogno di assistenza per questo. Sitecore ha il proprio scheduler. –

+2

Grazie a @horseman, ma penso che l'utilità di pianificazione di Sitecore funzioni su un intervallo, che può essere facilmente resettato quando l'appPool ASP.NET si ricicla. Ciò può compromettere e correggere qualsiasi programma appropriato per la pubblicazione. Di conseguenza, utilizziamo un servizio Web richiamato su una pianificazione dall'Utilità di pianificazione di Windows. – theyetiman

risposta

4

TL; DR nodo del contenuto Root avevano versione in un'altra lingua, la rimozione di quella versione, oppure solo la pubblicazione in lingua inglese impedito la pubblicazione di articoli in modalità bozza

OK, quindi dopo aver provato @ techphoria414 è suggerito codice , divenne chiaro che il contesto non era il problema. Dopo tutto, l'editore stava aderendo al flusso di lavoro, ma il problema si è rivelato essere il nodo del contenuto root con una versione in un'altra lingua (giapponese - non chiedermi come ci fosse), ma i nodi discendenti non hanno versioni in giapponese affatto. Infatti, il nostro database master è configurato per avere solo l'inglese come lingua, quindi non dovrebbe nemmeno essere possibile per un utente diverso dall'amministratore aggiungere una versione in un'altra lingua.

Ho condotto alcuni test e ho scoperto che l'editore ignora il flusso di lavoro per gli elementi che esistono in un'altra lingua.Si consideri il seguente scenario:

1) Si aggiunge una cartella e qualsiasi voce in basso ("elemento del flusso di lavoro di prova") che ha un flusso di lavoro. Non impegnare l'oggetto, lasciandolo alla versione 1, in modalità bozza (cioè non dovrebbe essere pubblicabile). La cartella contenente ha solo una versione in una lingua (inglese):

You add a folder and any item underneath which has workflow Folder has english version only

2) si pubblica la cartella con un profondo pubblicare sul web db (utilizzando il codice nella mia interrogazione). Ciò comporta quanto segue (cartella aggiunta, ma bozza "elemento flusso di lavoro di prova" non aggiunta). Questo è un comportamento previsto - yay!

You publish the folder with a deep publish

3) Aggiungere una nuova versione per il contenente la cartella in una lingua diversa.

Add a new version to the containing folder in a different language

4) Controllare lo stato del flusso di lavoro dell'elemento bambino ora che il giapponese è selezionato come la lingua. Si noti che nella canalina non è più detto che è in modalità bozza, ma non esiste alcuna versione in giapponese (come visto a destra).

Check the workflow state of the child item now that Japanese is selected as the language

5) Pubblicare la contenente la cartella in tutte le lingue al db web, esattamente la stessa di prima. Si noti ora che la "voce del flusso di lavoro di prova" è stata pubblicata, ma senza alcuna versione. Questo è quello che è successo con la nostra pubblicazione, tranne dal nodo contenuti radice che significava innumerevoli articoli ricevuti pubblicati che non avrebbe dovuto essere pubblicato

Publish again using the exact same code

Ora, perché il nostro nodo del contenuto principale ha una versione in giapponese è un mistero completo, ma almeno abbiamo capito il motivo per cui i nostri articoli sono stati pubblicati, quindi possiamo prevenirlo in futuro. Sospetto che abbia qualcosa a che fare con l'aggiornamento di Sitecore in quanto esistono 2 versioni in giapponese che corrispondono approssimativamente alle date di aggiornamento degli ultimi 2 anni.

+0

Risposta ben documentata. Questo è in realtà un comportamento previsto e un motivo per cui è importante controllare item.Versions.Count> 0 nel codice prima di eseguire il rendering del contenuto. Un controllo nulla non è sufficiente. – techphoria414

+2

Grazie per questo. Funzionava esattamente nello stesso problema. Il nodo "contenuto" predefinito aveva versioni giapponesi, tedesche e danesi ... che diamine? Nessun'altra lingua definita in System/Languages ​​a parte l'inglese. Assolutamente e completamente in disaccordo sul fatto che dovrei dover verificare esplicitamente item.Versions.Count> 0 ogni volta che eseguo il rendering di qualcosa. Ridicolo! SOPRATTUTTO quando quelle versioni NON si presentano in Content Editor! – Bryan

14

Probabilmente il problema è che il servizio web non è in esecuzione in un contesto sito che è il flusso di lavoro attivato

.

il modo più semplice per fare questo all'interno del codice è quello di utilizzare un SiteContextSwitcher per cambiare al sito "guscio"

using (new SiteContextSwitcher(SiteContextFactory.GetSiteContext("shell"))) 
{ 
    //do your publish 
} 

quanto riguarda gli articoli pubblicati senza versioni:. In teoria, sarebbe ancora accadere anche con la pubblicazione regolare Il flusso di lavoro limita la pubblicazione delle versioni degli articoli, non gli articoli stessi. Nel codice, quando iterando gli articoli e in in altri casi, è necessario verificare se item.Versions.Count > 0 prima del rendering.

+0

+1. Ho avuto lo stesso problema e il problema era che il mio codice era in esecuzione nel contesto del sito "scheduler" che non ha un flusso di lavoro. Ancora peggio, il metodo 'Item.Publishing.IsPublishable()' restituirà true se/quando il flusso di lavoro di un articolo non è disponibile. Ho trovato questo nel modo più duro ... non uno dei miei giorni migliori. –

+0

Grazie mille - questo sembra del tutto plausibile in quanto è un servizio WCF. Ho intenzione di fare un tentativo a breve per vedere se funziona e tornerò da te. La cosa strana che ho notato, inoltre, è che gli articoli draft che sono stati pubblicati, se visualizzati sul database live, non mostravano assolutamente nulla nel Sitecore Desktop in termini di campi o metadati. Stavano anche mostrando un avvertimento che "L'elemento corrente non ha una versione in" Inglese: Inglese ". – theyetiman

+0

In teoria, ciò si verifica anche con la pubblicazione periodica. Il flusso di lavoro limita la pubblicazione delle versioni degli articoli, non gli oggetti stessi. il tuo codice, quando iterando gli articoli e in altri casi, devi controllare se item.Versions.Count> 0 prima del rendering. – techphoria414