venerdì 4 marzo 2011

Cancellare programmaticamente un documento

Ho passato il pomeriggio a bestemmiare in tutte le lingue che conosco e a giudicare dagli sguardi che mi circondano, penso di aver raggiunto livelli da "Esorcista" (mancava solo il getto di vomito verde).
Non è che dovevo fare tutto sto lavoro poi... Avendo caricato vari nodi dalla cache e individuato quello da cancellare, utilizzavo il metodo delete() sul documento e ... subito dopo il postback mi ritrovavo il nodo vivo (solo che ripubblicando il sito, spariva come doveva fare).
Il codice assomigliava un po' a questo:
int idNode = 1111;
doc docDaCancellare = new Document(idNode);

docDaCancellare.delete();
umbraco.library.RefreshContent();

ma niente da fare quel maldedetto nodo (sebbene fisicamente sparito dal back-end) continuava a tornare nella mia applicazione come se niente fosse, nonostante ricaricasse un DataTable con tutti i figli del nodo genitore ricaricato.
Alla fine, ho scovato la risposta ai miei problemi in questo post di Tim Saunders (?)
Risultato il codice giusto è qualcosa di simile:
int idNode = 1111;
doc docDaCancellare = new Document(idNode);

if(docDaCancellare.Published)
{
    docDaCancellare.Unpublish();
    umbraco.library.UnpublishSingleNode(docDaCancellare.Id);
}
docDaCancellare.delete();
umbraco.library.RefreshContent();

dove la parte importante per me, la fa umbraco.library.UnpublishSingleNode(docDaCancellare.Id);in quanto rimuove il nodo cancellato dalla cache (file umbraco.config nella cartella data) che sparisce così dalla mia applicazione.
Ora sembra tutto scontato ma dato che il metodo delete() si può chiamare tranquillamente su un documento pubblicato ottenendo la sua cancellazione, non mi sarebbe mai venuto in mente di "depubblicare".
Spero che la mia esperienza possa essere d'aiuto.