Search the FirstSpirit Knowledge Base
Hallo,
ich versuche gerade für die Erstellung einer XML-Sitemap die Seiten auszuschließen, welche im aktuellen Stand nicht freigegeben sind. Ich dachte über PageRef.getReleaseStatus() (SiteStore) wäre dies zu realisieren, bekomme aber als Rückgabewert immer 0. Anscheinen prüft die Funktion, ob es einen allegemeinen freigegebenen Stand gibt. Ist es nun möglich eine Seite innerhalb der Struktur auf "aktuell freigegeben" zu prüfen?
Danke und Viele Grüße
Hallo Donato,
die Seite wird rot angezeigt, klar. Hier ein Ausschnitt aus dem Skript:
"rootFolder" ist vom Typ StoreElement und beinhaltet mehrere Subfolder und Unterseiten...
pagerefs = rootFolder.getChildren(PageRef.class, true);
pagerefIterator = pagerefs.iterator();
while (pagerefIterator.hasNext()) {
try {
pageref = pagerefIterator.next();
context.logInfo("ReleaseStatus: "+pageref.getReleaseStatus()+" Refname: "+pageref.getUid());
...
} catch (Exception e) {
context.logError("Exception found by iteration through the pages: ", e);
}
}
Die Referenznamen aller Seiten stimmen, d. b. dass korrekt durch die Strukturseiten iteriert wird. Allerdings bekomme ich mit pageref.getReleaseStatus() immer 0 obwohl die neu angelegte Seite (Rename "testseite" stimmt überein) noch nie freigegeben wurde.
Danke und Gruß
Woher holst Du Dir denn den rootFolder? Bzw. in welchem Context wird Dein Script aufgerufen?
Hallo,
ich muss kurz ausholen. Bei dem Projekt handelt es sich um ein altes Projekt, in dem sich mehrere Mandanten befinden, die den gleichen Vorlagensatz verwenden. Das Skript wird für EINEN Mandanten ausgeführt, d.h. ich muss mir den RootFolder eines Mandanten holen (Deutschland, Schweiz etc.) und die in diesem RootFolder befindlichen Seiten in der Sitemap ausgeben. Folgendermaßen hole ich mir den rootFolder für z.B. duie Schweiz:
Context: SiteProduction.
store = context.project.getUserService().getStore(Store.SITE_STORE,false); (holen aller Folder Schweiz, Deutschland...)
childrenList = store.getChildren().toList();
childrenIterator = childrenList.iterator();
rootFolder = null;
//iterate throug all children...
while(childrenIterator.hasNext()){
child = childrenIterator.next();
//...and save the folder equals to the actual mandant (aktuelle Mandant = Schweiz)
if(child.getName().equals(mandant)){
rootFolder = child;
break;
}
}
Gruß
Johannes
Off-topic:
childrenList = store.getChildren().toList();
Das sollte auf jeden Fall vermieden werden. "store.getChildren()" ist vom Typ "java.lang.Iterable", da kann man direkt drüber iterieren, ohne die Umwandlung in eine Liste im Hauptspeicher - was dir ab einer gewissen Projekt-Größe mit einem "OutOfMemoryError" um die Ohren knallt...
Wird das Skript während der Generierung ausgeführt?
Dann arbeit es genau mit einer bestimmten Revision des Sitestores, die zum Zeitpunkt des Auftragsstart gültig ist. Normalerweise arbeitet es auch nur mit der Releaseversion des Sitestores. D.h. es kennt nur freigegebene Zustände.
Funktioniert das Skript in der Vorschau?
Wie arbeitest du mit dem Skript weiter, wenn du den Rootknoten für deine Sitemap bestimmt hast?
Verwendest du dann die Kindelemente zur Generierung der URLs oder nur die Referenznamen und damit evtl. doch den "ausschließlich" freigegebenen Sitestore.
Ok, das sind jetzt nur ein paar Gedanken, die vielleicht auch gar nicht weiterhelfen. Aber das sind die Überlegungen die ich ansstellen würde, wenn ich so eine Sitemap generieren müsste.
Grüße
Christian
Hallo Herr Vogel,
das Skript wird über CMS_RENDER in einer Seitenvorlage aufgerufen und gibt mir eine Liste (schon gefilterter) PageRefs zurück über die ich in der Seitenvorlage iteriere (Die Seite -> XML-Sitemap publiziere ich um das Skript auszuführen). Die entsprechende Url baue ich mir aus der entsprechenden Domain+Dateiname zusammen. Klappt soweit auch, nur dass die Filterung eben aufgrund des fehlers beim ReleaseStatus im SKRIPT nicht wie gewünscht funktioniert.
Viele Grüße
Johannes Speckmann
Hallo Herr Vogel,
bzgl. Ihres Kommentars:
"...Dann arbeit es genau mit einer bestimmten Revision des Sitestores, die zum Zeitpunkt des Auftragsstart gültig ist. Normalerweise arbeitet es auch nur mit der Releaseversion des Sitestores. D.h. es kennt nur freigegebene Zustände...."
Auch eine neu angelegte Seite, welche noch NIE freigegeben wurde, hat einen freigegebenen Status?? Kenne Sie eine Möglichkeit, vl. einen Workaround, wie man erkennt, ob eine Seite schonmal freigegeben wurde?
Danke und Gruß
Wie wäre es mit IdProvider.getReleaseRevision(); ?
Diese Methode kann man auf eine Referenz aufrufen. Wenn sie Null zurückgibt, dann wurde die Referenz noch nie freigegeben.
Dann gibt es dazu noch die Methode getRevision(), die die akutelle Revision, die gerde beim Deployment gültig ist rausgibt. Wenn die aktuelle Revision größer ist als die Release-Revision, dann wurde die Referenz nach der Seite nochmal bearbeitet.
Bei einer normalen Generierung, die ja den freigegeben Zustand generiert, erwarte ich jedoch das die Referenz immer genau die Release-Revision hat.
Ich habe die Methoden noch nicht selbst ausprobiert, aber vielleicht klappt es damit.
Grüße
Christian
Meine erste Frage war, ob du auf dem aktuellem Stand arbeitest. Die Antwort war ja. Allerdings bin ich mir nach deinen weiteren Kommentaren nicht mehr so sicher, ob das auch stimmt:
das Skript wird über CMS_RENDER in einer Seitenvorlage aufgerufen
In der Generierung arbeitet man (wie korrekt von meinen Vorrednern angemerkt) immer auf freigegebenen Daten, nur bei der Vorschau ist das variabel.
Auch eine neu angelegte Seite, welche noch NIE freigegeben wurde, hat einen freigegebenen Status??
Natürlich nicht, solche Seiten werden nicht generiert.
Anscheinend suchst du nach einer Möglichkeit, innerhalb einer Generierung solche Seiten zu erkennen, die gegenüber ihrem freigegebenem Stand geändert wurden? Wobei sich mir die Frage stellt, ob (und wenn ja wieso) das innerhalb der Generierung sein muss..
Hallo Herr Jodeleit,
Ziel ist es eine XML-Sitemap zu publizieren, welche alle Seiten ausgibt, die schon einmal freigegeben wurden. Die Seiten die neu angelegt sind und noch nicht freigegeben wurden, sollen ausgschlossen werden (Release Status). Für die Sitemap habe ich mir eine Vorlage erstellt, in welcher ich durch die Ausführung des Skriptes eine Liste der relevanten Seiten bekomme (über CMS_RENDER übergebe ich dem Skript eine Liste, welche innerhalb des Skriptes mit den entsprechenden PageRefs befüllt wird. Diese Liste werte ich in der Vorlage wiederum aus). Ich hoffe der ansatz ist korrekt...
Viele Grüße