2012-09-28 13 views
7

Evento codice del gestore di sistema:In che modo il sistema di eventi di Tridion 2011 impedisce la pubblicazione di una singola pagina?

[TcmExtension("My Handler")] 
public sealed class EventSystem : TcmExtension 
{ 
    public EventSystem() 
    { 
     EventSystem.Subscribe<Page, PublishEventArgs>((page, e, phases) => { 
      if (shouldTerminatePublishing(page)) 
      { 
       throw new Exception(ex, page); 
      } 
     }, EventPhases.Initiated, EventSubscriptionOrder.Normal); 
    } 
} 

Con il codice di cui sopra, quando sono stati pubblicati più pagine ed eventi di sistema è solo per bloccare uno di loro (con un'eccezione), allora tutte le pagine siano effettivamente impedito di essere anche pubblicato. La casella di controllo "Ignora errori durante la generazione di contenuto pubblicabile" non ha alcun effetto su questo comportamento.

Come impedire la pubblicazione di una determinata pagina ma consentire comunque la pubblicazione di tutto il resto?

EDIT

codice aggiornato come da suggerimento di Quirijn:

public class MyResolver: IResolver 
{ 
    public void Resolve(
     IdentifiableObject item, 
     ResolveInstruction instruction, 
     PublishContext context, 
     ISet<ResolvedItem> resolvedItems) 
    { 
     var page = item as Page; 

     if (null != page && instruction.Purpose == ResolvePurpose.Publish) 
     { 
      try 
      { 
       // Evaluate whether publishing is allowed 
      } 
      catch (Exception ex) 
      { 
       resolvedItems.Clear(); 
      } 
     } 
    } 
} 

Alcune obiezioni (o meglio domande di follow-up) finora:

  1. Non c'è modo sensato per fornire feedback esplicito all'utente quando l'elemento viene escluso (eccetto il consiglio di selezionare l'opzione "Mostra elementi da pubblicare"), è presente?
  2. Il resolver personalizzato deve esplicitamente tenere conto di tutti i tipi di elementi, ovvero: non solo per "Pagina" ma anche "StrutturaGroup" e "Pubblicazione", non è necessario?
  3. Dato che il codice di valutazione potrebbe essere costoso (chiamata al servizio web), esiste un modo per memorizzare nella cache il risultato almeno tra la preparazione dell'elenco "Mostra elementi da pubblicare" e l'esecuzione della pubblicazione effettiva? (In tal caso la valutazione si verifica almeno due volte).

EDIT 2

Dopo aver guardato in esecuzione resolver standard:

  1. È necessario/preferibilmente per attuare IBulkResolver come bene?

risposta

7

Non dovresti farlo nel sistema di eventi ma in un resolver personalizzato. Questo è un pezzo di codice che viene eseguito per determinare quali pagine/componenti devono essere effettivamente pubblicate quando un articolo viene inserito nella coda di pubblicazione. Qui puoi filtrare qualsiasi pagina o componente che non vuoi pubblicare.

Vedere How to remove items from publishing using a Tridion Resolver?.