2012-09-28 8 views
7

kod zdarzenia obsługi systemu:W jaki sposób system zdarzeń Tridion 2011 może uniemożliwić publikację jednej strony?

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

Z powyższego kodu po kilku stron są opublikowane i zdarzeń systemowych jest tylko do jednego bloku z nich (rzucając wyjątek), a następnie wszystkie strony skutecznie zapobiega się opublikowane również. Pole wyboru "Ignoruj ​​awarie podczas generowania treści do opublikowania" nie ma wpływu na to zachowanie.

Jak uniemożliwić opublikowanie danej strony, ale mimo to zezwolić na publikację całej pozostałej strony?

EDIT

Zaktualizowany kod zgodnie Quirijn za sugestia:

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

pewne zastrzeżenia (lub raczej pytania uzupełniające) do tej pory:

  1. Nie ma żadnego sensownego sposobu dostarczenia wyraźną informację zwrotną dla użytkownika, gdy przedmiot zostanie wykluczony (z wyjątkiem doradzania, aby zaznaczyć opcję "Pokaż elementy do opublikowania"), czy istnieje?
  2. Niestandardowy przelicznik musi jawnie uwzględniać wszystkie typy pozycji, to znaczy: nie tylko dla "strony", ale także "struktury grupy" i "publikacji", czyż nie?
  3. Biorąc pod uwagę, że kod oceny może być kosztowny (wywołanie usługi sieciowej), czy istnieje sposób na buforowanie jego wyniku co najmniej między przygotowaniem listy "Pokaż elementy do opublikowania" i wykonaniem faktycznego publikowania? (W takim przypadku ocena następuje co najmniej dwa razy).

EDIT 2

Po patrząc na realizację standardowych przeliczniki:

  1. Czy konieczne/najlepiej wdrożyć IBulkResolver, jak również?

Odpowiedz

7

Nie należy tego robić w systemie zdarzeń, ale w niestandardowym przeliczniku. Jest to fragment kodu, który jest wykonywany w celu ustalenia, które strony/komponenty powinny być skutecznie opublikowane, gdy element zostanie umieszczony w kolejce publikacji. Tutaj możesz odfiltrować dowolną stronę lub komponent, których nie chcesz opublikować.

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

Powiązane problemy