Heute will ich erklären, wie man in formelCMS aus Rhino einen publish anstösst.
Der Hintergrund: will man dynamsich Seiten zur Content-Base zufügen (zum Beispiel über die Kommentar-Funktion eines Blogs
, so sollten diese Dokumente sowohl im CMS-Repository als auch im Live-Repository eingetragen werden.
Der komfortabelste Weg dafür ist, diekre die im CMS bereits vorhandenen Funktionen der Publikation zu verwenden.
Da formelCMS JAVA/Rhino basiert ist, kann man per Rhino-Scripting direkt auf die formelCMS API zugreifen.
Dies hat zudem den Vorteil, dass der Publish auch protokolliert wird und nachtäglich in der Publish-Übersicht eingesehen werden kann.
In formelCMS wird ein Publish als Job (Thread) gestartet und läuft asynchron ab; somit sind auch keine Verzögerungen/Blockaden zu erwarten, wenn dies innerhalb eines Seitenaufrufs geschieht.
Aufruf in einer Seite:
var list = new Packages.java.util.ArrayList();
list.add( path1 );
list.add( ... );
list.add( path15 );
var job = publish( list );
job.start();
// das war es !
Benutzte Funktion:
function publish( list ) {
var fromRep = config.lookup( "PreviewRepository") ;
var toRep = config.lookup( "LiveRepository") ;
var fromSession = null;
var toSession = null;
try {
fromSession = fromRep.createSession(true) ;
toSession = toRep.createSession(true) ;
var sync = new Packages.com.cosmocode.cms.rep.sync.Synchronizer(
null, fromRep, fromSession, toRep, toSession ) ;
sync.setComparator( new Packages.com.cosmocode.cms.rep.sync.SelectAllComparator() ) ;
var resolver = new Packages.com.cosmocode.cms.rep.sync.UpdateIdCollector( 0, null) ;
sync.synchronize( resolver, list ) ;
var results = resolver.getList() ;
var update = new Packages.com.cosmocode.cms.rep.sync.Update(
"publish", path.ROOT, "SYSTEM", fromRep.getSystem(), new Date(), results ) ;
var scheduler = config.lookup("UpdateScheduler");
var updateJob = new Packages.com.cosmocode.cms.rep.sync.UpdateJob(
null, fromRep, toRep, update, scheduler ) ;
return updateJob;
} finally {
if ( fromSession != null ) fromSession.close() ;
if ( toSession != null ) toSession.close() ;
}
}
Zu Beachten ist, dass der UpdateScheduler in der formel-Konfig-Datei eingetragen werden muss.
Die benutzte Funktion publish lässt sich natürlich bequem in eine zentrale Komponente auslagern.