2012-09-28 13 views
7

Evento código de controlador de sistema:¿Cómo puede evitar el sistema de eventos Tridion 2011 que se publique una sola página?

[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 el código anterior cuando múltiples páginas se publican y de sucesos del sistema es de sólo bloquear uno de ellos (por lanzar una excepción), a continuación, todas las páginas se impide con eficacia de ser publicado también. La casilla de verificación "Ignorar las fallas al generar contenido que se puede publicar" no afecta este comportamiento.

Cómo evitar que una página determinada se publique, pero todavía permite publicar todo el resto?

EDITAR

código actualizado según la sugerencia de 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(); 
      } 
     } 
    } 
} 

Algunas objeciones (o más bien las preguntas de seguimiento) hasta el momento:

  1. ¡No hay manera sensata para proporcionar retroalimentación explícita al usuario cuando el artículo se excluye (excepto aconsejar marcar la opción "Mostrar elementos para publicar"), ¿está ahí?
  2. La resolución personalizada debe tener en cuenta explícitamente todos los tipos de elementos, es decir: no solo para 'Página' sino también 'GrupoDeEstructura' y 'Publicación', ¿no es así?
  3. Dado que el código de evaluación puede ser costoso (llamada al servicio web), ¿hay alguna manera de almacenar en caché su resultado al menos entre preparar la lista "Mostrar elementos para publicar" y realizar la publicación real? (En tal caso, la evaluación ocurre al menos dos veces).

EDITAR 2

Después de mirar en aplicación resolutores estándar:

  1. ¿Es necesario/preferiblemente para implementar IBulkResolver así?

Respuesta

7

No debe hacer esto en el sistema de eventos sino en una resolución personalizada. Este es un fragmento de código que se ejecuta para determinar qué páginas/componentes deben publicarse efectivamente cuando un artículo se coloca en la cola de publicación. Aquí puede filtrar cualquier página o componente que no desee que se publique.

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

Cuestiones relacionadas