2012-10-26 15 views
5

Per abilitare le preferenze utente personalizzate durante la pubblicazione vorremmo scoprire nel passaggio di risoluzione (all'interno di un resolver personalizzato) l'utente di pubblicazione (quindi non l'account utente configurato per il servizio di pubblicazione ma l'utente che ha avviato l'operazione di pubblicazione).Come determinare utente/motore di pubblicazione in resolver personalizzato

Per trovare l'utente di pubblicazione originale, è necessario avere accesso all'oggetto PublishTransaction (in particolare la proprietà Creator); non possiamo usare la proprietà User dalla Session all'interno del resolver personalizzato poiché questa Session è creata dal servizio Publisher (e ci darebbe l'account di servizio).

Per trovare l'attuale PublishTransaction Mihai has provided us with an excellent hack. In sostanza; se riusciamo a mettere le mani su un oggetto motore, possiamo determinare la transazione di pubblicazione del contesto.

Fra personalizzato resolver metodo Resolve viene chiamato con quattro parametri:

public void Resolve(
    IdentifiableObject item, 
    ResolveInstruction instruction, 
    PublishContext context, 
    ISet<ResolvedItem> resolvedItems 
) { } 
  • L'articolo può essere utilizzato per fornire un oggetto Session ma né un IdentifiableObject né una sessione tenere un riferimento al Motore.
  • L'istruzione di risoluzione è solo un insieme di proprietà dei dati per la risoluzione.
  • Il contesto di pubblicazione (purtroppo non un PublishingContext) mantiene solo la pubblicazione e il target di pubblicazione.
  • Un Oggetto Risolto può darci di nuovo accesso alla Sessione ma non al Motore.

La mia domanda (finalmente) sarebbe duplice:
1. Ho perso tutti i punti possibili in cui l'account utente contesto può essere determinato da (diverso dal PublishTransaction)?
2. ho perso dei punti potenziali in cui il motore può essere determinato dai parametri con cui viene chiamato il metodo IResolver.Resolve()?


Edit: mi rendo conto che ho lasciato fuori il quadro più ampio su questo che vogliamo personalizzare l'attività pubblicare con i metadati in più (da preferenze dell'utente), perché è un po 'una lunga storia;

Quello che in definitiva ho bisogno è di attivare per una versione specifica di un componente nel modello del componente (passando l'elenco delle versioni e trovando una versione che è collegata a un componente marcatore dedicato) ma per farlo ho bisogno per sapere qual è il componente marcatore. Per questo motivo pubblichiamo il componente marcatore (che risolverà tutti i componenti collegati e in definitiva le pagine) e il risolutore personalizzato ci ha permesso di spingere il TCMURI del componente marcatore nella cache della sessione (rendendolo accessibile nel CT).

Ora vogliamo impostare una "preferenza" per un componente marcatore specifico a livello di utente per consentire la pubblicazione di lotti di attività più piccoli all'interno di questo contesto di marker (anziché pubblicare tutto ciò che è collegato al marcatore in una sola volta).

Poiché gli TBB che corrono all'interno del CT in realtà hanno un oggetto Motore disponibile, possiamo usare il metodo di Mihai e determinare l'utente di pubblicazione (al contrario di premere il contesto del marcatore dal resolver ciò che inizialmente abbiamo fatto) e in questo modo bypassare il problema completamente.

Mi chiedevo perché c'è una tale differenza nella disponibilità di informazioni tra un'operazione di risoluzione e un'operazione di rendering; entrambi sono dopotutto parte dello stesso contesto editoriale.Non posso fare a meno di sentire che sto trascurando qualcosa di molto semplice, ma forse non lo sono e accedere a un contesto o motore di pubblicazione dal resolver è semplicemente impossibile.


Edit: come presume da Dominic e confermato da Nuno non c'è un "motore" al momento di risolvere; in quanto tale è stata data una risposta a questa metà della mia domanda. che lascia

ho perso tutti i potenziali punti da cui è possibile determinare l'account utente di contesto (diverso da PublishTransaction)?

risposta

5

Sono andato giù per questa strada prima in un progetto (cercando di ottenere l'utente in un'estensione Resolver) ed era un mondo di dolore.

Mi sono trasferito da un'estensione Resolver a un'estensione di rendering e ho persino considerato un'estensione di trasporto, solo per tornare all'approccio più semplice possibile: un TBB.

Concesso, il mio caso d'uso era diverso dal tuo, poiché sembra che tu voglia cambiare il comportamento risolutivo in base all'utente (alcuni utenti non amano la propagazione dei link, giusto? - se hanno paura di cambiare contenuto, quindi non dovrebbero cambiarlo ;-)) ma ho finito per non implementandolo in quel modo.

ho che c'era una richiesta di miglioramento per includere ulteriori informazioni sulle azioni scatenanti editoriali degli utenti, ma se questo è implementato nel prodotto sarà per Tridion 2013, non sicuro che si può aspettare così a lungo.

+0

BTW, l'accesso al motore non funziona perché la risoluzione viene eseguita prima del rendering e l'oggetto motore viene istanziato dal motore di rendering del modello. –

+0

Capisco che; tutto quello che sto dicendo è che c'è qualcosa di intrinsecamente strano nel fatto che PublishTransaction non sia disponibile per il Resolver, poiché in questo caso PublishTransaction avvia l'intera catena di risoluzione dei problemi in questo caso ... –

0

Suppongo che a questo punto non sia possibile mettere le mani su un motore. Dopotutto, stai risolvendo, non il rendering. Hai detto che vuoi "abilitare le preferenze dell'utente", ma non ci parli molto di più del tuo problema reale, piuttosto che della linea di indagine che stai seguendo (che potrebbe essere o meno un vicolo cieco).

Che tipo di preferenze utente sono rilevanti per la pubblicazione e perché è necessario averle nel resolver?

Problemi correlati