- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Liste aller PDF-Dokumente in den Medien
Hallo Zusammen,
Ich muss eine Liste aller Namen der PDF Dokumente die in den Medien liegen erstellen.
Das ganze soll als dynamische CSV-Tabelle dargestellt werden.
Dazu sollen noch mehrere Spalten hinzugefรผgt werden wie die MD5-Prรผfsumme, Dateigrรถรe .... und weiteres.
Ich bin noch relativ unvertraut mit Firstspirit.
Dank der Hilfe hier im Forum wurde mir gesagt das ich den Ausgabekanal des Seitentemplates mit csv รผberschreiben kann.
Die Frage wรคre wie ich eine Solche CSV-Tabelle in Firstspirit erstelle. Kann mir da wer helfen?
Wenn ihr irgendwas unklar beschrieben haben sollte oder ihr mehr informationen braucht sagt bescheid.
Grรผรe
Artur
- Labels:
-
Developers
Accepted Solutions
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Artur,
am einfachsten wรคre es wohl tatsรคchlich, das รผber ein entsprechendes Seitentemplate zu erledigen und darauf basierend eine Inhaltsseite und Seitenreferenz anzulegen. Am besten nimmst Du hierfรผr den HTML-Ausgabekanal und รคnderst hierfรผr die Dateierweiterung auf csv (bzw. txt - siehe Hinweis unten).
Der Template-Code wรคre dann z.B. so:
$CMS_TRIM(level:3)$
$CMS_SET(set_mediastoreRoot, #global.project.userService
.getStore(
class("de.espirit.firstspirit.access.store.Store$Type").MEDIASTORE,
!#global.preview
)
)$
UID,Name,CRC,Size
$CMS_SET(Media, class("de.espirit.firstspirit.access.store.mediastore.Media"))$
$CMS_FOR(for_media,set_mediastoreRoot.getChildren(Media,true))$
$CMS_IF(for_media.getType()==Media.FILE)$
$CMS_SET(set_file,for_media.getFile(#global.language))$
$CMS_IF(set_file.extension=="pdf")$
$CMS_TRIM(level:4)$
$-- media info --$
$CMS_VALUE(for_media.uid)$,
$CMS_VALUE(for_media.getDisplayName(#global.language))$,
$CMS_VALUE(set_file.getCrc())$,
$CMS_VALUE(set_file.getSize())$
$CMS_END_TRIM$
$CMS_END_IF$
$CMS_END_IF$
$CMS_END_FOR$
$CMS_END_TRIM$
An die einzelnen Informationen kommst Du hier รผber zwei Stellen: Einmal das Medienobjekt selbst (im Beispiel ist dies die Variable for_media). Hier kannst Du alle Methoden des interfaces Media nutzen. Fรผr Informationen der hinterlegten Datei (im Beispiel die Variable set_file) stehen die Methoden des Interfaces File zur Verfรผgung.
Kleiner Hinweis: Wenn Du die Erweiterung auf "csv" setzt, bekommst Du in der SA-Vorschau ggf. einen Download-Dialog wenn der Erweiterung "csv" kein Mime-Type zugeordnet ist (z.B. falls der interne Jetty verwendet wird). Zum Testen ist es darum hilfreich, die Erweiterung erstmal auf txt zu setzen.
Im Code sind jetzt Feinheiten wie Escaping von Kommata / Anfรผhrungszeichen noch nicht enthalten, aber vielleicht reicht es ja als Starthilfe.
Viele Grรผรe
Michael
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Artur,
am einfachsten wรคre es wohl tatsรคchlich, das รผber ein entsprechendes Seitentemplate zu erledigen und darauf basierend eine Inhaltsseite und Seitenreferenz anzulegen. Am besten nimmst Du hierfรผr den HTML-Ausgabekanal und รคnderst hierfรผr die Dateierweiterung auf csv (bzw. txt - siehe Hinweis unten).
Der Template-Code wรคre dann z.B. so:
$CMS_TRIM(level:3)$
$CMS_SET(set_mediastoreRoot, #global.project.userService
.getStore(
class("de.espirit.firstspirit.access.store.Store$Type").MEDIASTORE,
!#global.preview
)
)$
UID,Name,CRC,Size
$CMS_SET(Media, class("de.espirit.firstspirit.access.store.mediastore.Media"))$
$CMS_FOR(for_media,set_mediastoreRoot.getChildren(Media,true))$
$CMS_IF(for_media.getType()==Media.FILE)$
$CMS_SET(set_file,for_media.getFile(#global.language))$
$CMS_IF(set_file.extension=="pdf")$
$CMS_TRIM(level:4)$
$-- media info --$
$CMS_VALUE(for_media.uid)$,
$CMS_VALUE(for_media.getDisplayName(#global.language))$,
$CMS_VALUE(set_file.getCrc())$,
$CMS_VALUE(set_file.getSize())$
$CMS_END_TRIM$
$CMS_END_IF$
$CMS_END_IF$
$CMS_END_FOR$
$CMS_END_TRIM$
An die einzelnen Informationen kommst Du hier รผber zwei Stellen: Einmal das Medienobjekt selbst (im Beispiel ist dies die Variable for_media). Hier kannst Du alle Methoden des interfaces Media nutzen. Fรผr Informationen der hinterlegten Datei (im Beispiel die Variable set_file) stehen die Methoden des Interfaces File zur Verfรผgung.
Kleiner Hinweis: Wenn Du die Erweiterung auf "csv" setzt, bekommst Du in der SA-Vorschau ggf. einen Download-Dialog wenn der Erweiterung "csv" kein Mime-Type zugeordnet ist (z.B. falls der interne Jetty verwendet wird). Zum Testen ist es darum hilfreich, die Erweiterung erstmal auf txt zu setzen.
Im Code sind jetzt Feinheiten wie Escaping von Kommata / Anfรผhrungszeichen noch nicht enthalten, aber vielleicht reicht es ja als Starthilfe.
Viele Grรผรe
Michael
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Michael,
danke fรผr die schnelle Hilfe, wenn ich auf weitere Probleme treffe melde ich mich nochmals.
Ich versuch mich mal damit ^^.
Grรผรe
Artur
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Ok ich verzweifle weiterhin
ich hab mich mit den Interfaces von Media und File auseinandergesetzt aber ich glaube mir fehlt da grundsรคtzliches Wissen.
Ich hab gerade Schwierigkeiten den Ablageort (Referenzname des Baumes) der Dokumente zu ermitteln,
auf welchen Seiten das Dokument referenziert ist und die MD5-Prรผfsumme zu errechnen.
Ich weiร das CrC mรถglich ist hast du ja auch in dem Beispiel schon implementiert aber mein Chef will MD5 haben.
Den Ablageort kann man doch รผber getStoredUrl kriegen oder?
Die Seiten auf dehnen das Dokument referenziert ist kriegt man รผber eine Verschachtelung von CMS_VALUE und CMS_REF oder?
Grรผรe
Artur
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Artur,
in FS gibt es ja erstmal keinen "Ablageort" fรผr Medien im Dateisystem, sondern die liegen im internen Berkeley Repository. Erst bei der Generierung werden die Dateien wirklich geschrieben - und je nach Deployment-Mechanismus (z.B. FTB) nichtmal unbedingt dann.
Was ist denn genau der Anwendungsfall hinter der Anforderung?
Wenn Du hier wirklich "eigene Operationen" auf den Daten ausfรผhren willst, mรผsstest Du ein Modul in Java implementieren, dass die MD5 berechnet.
Theoretisch kannst Du natรผrlich auch nach der Generierung auf den generierten Files arbeiten (aber letztlich brauchst Du auch da ein Stรผck Java-Code). Und hier hast Du dann natรผrlich die Objektinfos nicht mehr bzw. mรผsstest eine entsprechende Zuprdnungsmรถglichkeit bauen...
Viele Grรผรe
Michael
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Michael,
Mit Ablageort meine ich den root folder des Dokuments in Firstspirit.
Ich weiร leider nicht was der Anwendungsfall ist. Ich glaube es soll einfach eine CSV Tabelle mit den hier schon genanten werten sein damit diese Intern Sinn und Zweck erfรผllt.
Das hilft mir jetzt in die richtige Richtung ^^.
Grรผรe
Artur
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Artur,
ohne den Anwendungsfall genauer zu kennen ist es natรผrlich schwierig hier eine sinnvolle Vorgehensweise zu empfehlen...
Es geht z.B. um Fragen wie:
- Geht es um eine Liste aller Publizierten PDFs oder ist das eher ein "Redakteurs-Tool"?
- Wer braucht die Checksumme fรผr welchen Zweck?
- Soll die Prรผfsumme auf dem freigegebenen oder dem current Stand durchgefรผhrt werden?
- Von wievielen PDFs mit welcher Grรถรe reden wir hier? Das hat z.B. Einfluss auf die Umsetzung - fรผr 10.000 grรถรere PDFs jedes Mal ein MD5 berechnen zu wollen wรคre wohl z.B. keine so gute Idee - hier mรผsste man sich รผber ein Caching bzw. eine Speicherung inkl. Einbindung der Berechnung in den Freigabeworkflow Gedanken machen.
Selbst die von mir vorgeschlagene Variante der sog. "Full Store Iteration" ist nicht in jedem Fall (=bei vielen Medien) empfehlenswert.
Vor der eigentlichen Generierung sind die PDFs nicht รผber das Dateisystem zugreifbar, weil sie in der internen Berkeley-DB liegen.
Viele Grรผรe
Michael
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Michael,
es geht um eine Liste aller Publizierten PDFs.
Fรผr welchen Zweck ich diese MD5 Prรผfsumme benรถtige wรผsste ich gerne selber, aber in die Grรผnde bin ich nicht eingeweiht.
Die Prรผfsumme soll auf den freigegebenen Stand sein.
Es handelt sich um weniger als 4000 Dokumente die alle von unterschiedlicher grรถรe sind, eher kleiner als groร.
Grรผรe
Artur
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Artur,
hmm, 4000 ist schon ne Hausnummer. Wieviele Medien habt ihr denn insgesamt? Also Anzahl aller Objekte im Mediastore?
Da kรถnnte sich nรคmlich allein schon die von mir initial vorgeschlagene Full-Store-Iteration ungรผnstig auswirken - und die MD5 mรผsste ja auch noch berechnet werden. Ich weiร jetzt nicht, wie schnell so eine MD5-Berechnung ist, aber es muss ja zumindest mal die ganze Datei eingelesen werden.
Wie generiert bzw. publiziert ihr denn aktuell? (Teil-/Voll-/Delta-Generierung?)
Was man generell machen kรถnnte (zumindest einige Ansรคtze - nicht unbedingt vollstรคndig!) wรคre Folgendes:
a) Full-Store-Iteration + Modulcode zur Berechnung von MD5, Generierung der CSV รผber "technische Seite" (mein initialer Vorschlag)
Vorteile:
- Recht einfach zu bauen (Utility-Klasse mit Modul, ggf. ein bisschen Tricksen um da im Template ranzukommen)
- Anpassungen / Hinzufรผgen von Infos (zumindest solcher fรผr die nicht weiterer Modul-Code geschrieben werden muss, die sich also direkt aus dem FS-Medienobjekt abgreifen lassen) durch Template-Entwickler mรถglich
Nachteile:
- Full-Store-Iteration bei groรem Store ungรผnstig was die Performance betrifft.
- MD5 wรผrde ggf. - je nach Generierungsmodell - "unnรถtig" mehrfach berechnet
- Sonderfรคlle wie Escaping mรผssen "manuell" im Template gemacht werden
b) Einbau der Berechnung in den Freigabeworkflow, Speicherung an den FirstSpirit-Metadaten, Ausgabe รผber "technische Seite"
Vorteile:
- Performancetechnisch optimal, da nur dann gerechnet wird wenn es sein muss
- Ausgabe komplett รผber Template, Erweiterung fรผr Template-Entwickler mรถglich
- MD5 wรผrde im Metadaten-Formular stehen und somit sichtbar sein (da wir den Anwendungsfall ja beide nicht genau kennen - wer weiร ob das nicht praktisch ist)
Nachteile:
- Full-Store-Iteration notwendig um "alle PDFs" zu finden
- Sonderfรคlle wie Escaping mรผssen "manuell" im Template gemacht werden
- Mehr Modul-Implementierung - hier sollte man sich schon ein bisschen in der API auskennen
- Fรผr bereits freigegebene PDFs mรผsste das Ganze einmal "nachgeholt" werden (das dann wieder รผber Full-Store-Iteration, Berechnung, Merken in den Metadaten und erneute Freigabe). Wobei "irgendwann" muss es halt eh gemacht werden. Theoretischer Problemfall (=etwas mehr Aufwand): Bereits einmal freigegebene, inzwischen aber geรคnderte und nicht wieder freigegebene Medien, die aber aus irgendwelchen Grรผnden (noch) nicht wieder freigegeben werden sollen
c) Erzeugung der CSV komplett รผber ein Modul nach der Generierung basierend auf den tatsรคchlich generierten PDFs (also quasi auf Dateisystem-Ebene)
Vorteile:
- Hier gibt es eine Hilfsklasse (CsvWriter) in der FS-API, die einem das Escaping abnimmt
Nachteile:
- Man mรผsste sich hier eine Art "รbergabemรถglichkeit" schaffen, um die Infos die sich nicht allein aus dem Dateisystem ermitteln lassen (z.B. Anzeigename) bei der Erstellung auch zur Verfรผgung zu haben.
- Zwar keine Full-Store-Iteration - aber dafรผr wรผrde man im Filesystem suchen mรผssen
- Auch hier wird die MD5 - je nach Generierungsmechanismus - ggf. unnรถtig oft durchgefรผhrt
- Allgemein stรคrkere Abhรคngigkeit vom Generierungsmechanismus, falls ihr z.B. keine Vollgenerierung macht, wird es etwas auswendiger das fรผr bereits publizierte Medien nachzuholen weil man sie ja auf jeden Fall einmal generieren mรผsste
Alternative zur jeweiligen Full-Store-Iteration um die PDFs zu finden wรคre noch die Nutzung des QueryAgent mรถglich - der aber nur auf dem Current-Stand arbeitet. D.h. man mรผsste dann im Current-Stand suchen (was hier sehr einfach und effizient mรถglich ist per Suche nach fs.extension=pdf), die Daten dann aber aus dem Release-Stand nehmen bzw. erstmal schauen ob das jew. PDF schon freigegeben ist (letzteres ist aber einfach). Theoretisch Gefahr hรถchstens, dass man publizierte PDFs "nicht erwischt", die in FS gelรถscht wurden aber deren Lรถschung noch nicht freigegeben wurde.
Es gibt bestimmt noch weitere Varianten bzw. Kombinationsmรถglichkeiten... Fรผr die eigentliche Berechnung der MD5 wirst Du aber in jedem Fall ein Modul bauen mรผssen, weil es da eben keine fertige Lรถsung in FS gibt.
Variante c) kรถnnte hรถchstens noch interessant sein, wenn man alle Infos auch rein in den generierten Dateien hat, also keine Infos aus FS und dem Filesystem "zusammenfรผhren" muss - dann wird es einfacher.
Persรถnlich wรผrde ich eher zu Variante b) tendieren.
Du kรถnntest es natรผrlich auch erstmal mit a) versuchen und schauen wie die Performance ist und ob man sich da รผberhaupt Gedanken machen muss. Ein Modul brauchst Du ja eh und auch den Code um die MD5 zu erzeugen - d.h. es wรคre zumindest mal keine Zeitverschwendung ๐
Viele Grรผรe
Michael
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Michael,
tut mir Leid fรผr die spรคte Antwort. Das ist mir eine groรe Hilfe, danke dir vielmals.
Ich setzt mich nochmal ran und guck mal wofรผr ich mich Entscheide.
Falls nochmal was sein sollte wodurch sich ein spezifisches Problem ergibt erรถffne ich einen neuen post.
Mit freundlichen Grรผรen
Artur Kammerloch

