Search the FirstSpirit Knowledge Base
Ich habe ein Anfängerproblem aus der Template-Entwicklung mit FirstSpirit 5.2, bei der mir noch das Aha-Erlebnis fehlt.
Ich möchte eine XML-Datei erstellen, die Pfade zu Objekten auflistet.
Das Ergebnis soll ungefähr so aussehen:
<?xml version="1.0" encoding="UTF-8"?>
<pathlist>
<path>medien/pdf/service/anfahrt.pdf</path>
<path>medien/assets/Icinga.txt</path>
<path>medien/assets/img/android_icon_192x192.png</path>
</pathlist>
Dazu habe ich eine Seitenvorlage mit folgendem Formular erstellt:
<CMS_MODULE>
<FS_CATALOG name="pt_providedMedia" height="10" useLanguages="no" viewMode="headers">
<LANGINFOS>
<LANGINFO lang="*" label="Links"/>
</LANGINFOS>
<TEMPLATES type="link">
<TEMPLATE uid="media_item_link"/>
</TEMPLATES>
</FS_CATALOG>
</CMS_MODULE>
und folgendem html-code:
<?xml version="1.0" encoding="UTF-8"?>
<pathlist>
$CMS_FOR(for_providedMedia, pt_providedMedia)$
<path>$CMS_VALUE(for_providedMedia)$</path>
$CMS_END_FOR$
</pathlist>
Hier kommt allerdings nur folgendes raus:
<?xml version="1.0" encoding="UTF-8"?>
<pathlist>
<path></path>
<path></path>
<path></path>
</pathlist>
Bisher habe ich es schon geschafft, einen einzelnen Pfad wie folgt anzuzeigen:
Formular (Seitenvorlage)
<CMS_MODULE>
<FS_REFERENCE name="pt_providedMedia" hFill="yes" useLanguages="no">
<LANGINFOS>
<LANGINFO lang="*" label="Medien für externe Anwendungen"/>
</LANGINFOS>
<PROJECTS>
<LOCAL name=".">
<SOURCES>
<FOLDER name="root" store="mediastore"/>
</SOURCES>
</LOCAL>
</PROJECTS>
</FS_REFERENCE>
</CMS_MODULE>
html
<?xml version="1.0" encoding="UTF-8"?>
<path>$CMS_REF(pt_providedMedia)$</path>
Inhalt von providedMedia.xml
<?xml version="1.0" encoding="UTF-8"?>
<path>medien/pdf/service/anfahrt.pdf</path>
Was muss ich tun, um die Pfade der Objekte im FS_CATALOG anzuzeigen?
Der Titel lautet richtig Objektpfade im FS-CATALOG
Hallo,
die Laufrichtung ist gar nicht falsch. Um detaillierter zu antworten fehlt noch die Information, wie denn das Formular für media_item_link aussieht.
Generell liefert die Schleife über den Katalog Einträge vom Typ Card. Eine Card beinhaltet die Formulardaten des zugrunde liegenden Links. Auf der Beschreibungsseite für Card finden sich auch Beispiele für die Auswertung in einer Vorlage. Hier gibt es zwei Möglichkeiten:
Ich hoffe, dies hilft Ihnen weiter.
Mit besten Grüßen
Stefan
Hallo Stefan,
bei mir hat es noch nicht "klick" gemacht.
Das Formular für die Verweisvorlage media_item_link sieht so aus:
<CMS_MODULE>
<FS_REFERENCE name="lt_target" hFill="yes" imagePreview="yes" sections="no" upload="yes" useLanguages="no">
<FILTER>
<ALLOW type="file"/>
<ALLOW type="picture"/>
</FILTER>
<LANGINFOS>
<LANGINFO lang="*" label="Medium"/>
</LANGINFOS>
<PROJECTS>
<LOCAL name=".">
<SOURCES>
<FOLDER name="assets" store="mediastore"/>
<FOLDER name="pdf" store="mediastore"/>
</SOURCES>
</LOCAL>
</PROJECTS>
</FS_REFERENCE>
<CMS_INPUT_TEXT name="lt_text" hFill="yes" singleLine="no" useLanguages="no">
<LANGINFOS>
<LANGINFO lang="*" label="Bezeichnung"/>
</LANGINFOS>
</CMS_INPUT_TEXT>
</CMS_MODULE>
Mein Problem ist: Ich weiß noch nicht, wie ich in Html einzeilne Attribute des for_providedMedia-Objekes abrufen kann.
In der mittleren Zeile aus
$CMS_FOR(for_providedMedia, pt_providedMedia)$
<path>
$CMS_VALUE(for_providedMedia)$
</path>
$CMS_END_FOR$
müsste etwas ähnliches stehen wie:
$CMS_VALUE(for_providedMedia.item.getPath())$ oder
$CMS_VALUE(for_providedMedia.getItem.SOURCE)$ oder
$CMS_VALUE(for_providedMedia.target)$ oder
oder irgendetwas, das mir den Pfad zur Datei angibt.
In der ODFS sehe ich unter
http://www.e-spirit.com/odfs52/access/?de/espirit/firstspirit/forms/FormData.html oder http://www.e-spirit.com/odfs52/vorlagenentwick/vorlagensyntax/datentypen/card/
noch keinen Hiweis dazu, wie ich einzelne Attribute auslesen kann.
Wie würdest du dir denn den Pfad ausgeben lassen?
Viele Grüße
Rolf
Es beantwortet zwar nicht deine Frage, die ich auch gerne beantwortet bekommen würde, aber hilft es dir, wenn du dir in der Verweisvorlage die Werte "plain" ausgibst? Oder gibt es Gründe das nicht zu tun?
Schön Pfingsten
Diana
Hallo Rolf,
hier solltest Du innerhalb der FOR-Schleife mit folgendem Ausdruck weiter kommen:
<path>$CMS_REF(for_providedMedia.item.lt_target)$</path>
Wichtig ist hier die Nutzung von $CMS_REF (da es ja eine URL zu einem FirstSpirit-Objekt ist). Im ODFS ist an der entsprechenden Stelle mit "BEZEICHNER" der Name der Eingabekomponente im "inneren" Template gemeint.
Viele Grüße
Michael
Hallo Michael,
danke für deinen Betrag - so wird mir der Pfad korrekt angezeigt .
Ich schaffe es nun auch, mir den Inhalt von lt_text mit dem Ausdruck
$CMS_VALUE(for_providedMedia.item.lt_text)$
anzeigen zu lassen. Der Name lt_text kommt im Link-Template vor, weshalb ich diesen Ausdruck sofort ausprobiert habe.
Jetzt möchte ich mir von der referenzierten Datei nicht nur den Pfad, sondern auch den Namen und den Mime-Type (pdf) anzeigen lassen. Diese kann ich aber nicht direkt aus dem Template entnehmen, weil es Dateieigenschaften sind. Wie lautet der Ausdruck, um diese Daten abzufragen?
Der Ausdruck müsste so ähnlich aussehen wie
$CMS_VALUE(for_providedMedia.item.name)$ oder
$CMS_VALUE(for_providedMedia.item.mime_type)$
Viele Grüße
Rolf
@Diana: Wie lautet der Ausdruck, um plain auszugeben? Mit
$CMS_VALUE(for_providedMedia.item.plain)$ oder
$CMS_REF(for_providedMedia.item.plain)$
erhalte ich keine Ausgabe.
Viele Grüße
Rolf
Hallo Rolf,
das ist eigentlich ganz normale Template-Logik entsprechend der API bzw. dem ODFS.
Schritt für Schritt läuft das Ganze so ab:
Das for_providedMedia.item ist - wie auch im ODFS erklärt - ein FormData, über das man mit angehängtem Eingabekomponenten-Namen an den Wert des Formularfeldes kommt. Das ist eine Kurzschreibweise, die man im Template nutzen kann anstelle der "reinen" API-Variante, bei der man zwischendurch noch ein FormField bekommt.
Die "reine API-Variante"
for_providedMedia.item.get(#global.language, "lt_target").get()
kann somit im Template abgekürzt werden mit
for_providedMedia.item.lt_target
Das "item" selbst weiß hier noch überhaupt nichts von irgendeiner verlinkten Datei - diese Information steckt ja erst in der FS_REFERENCE "lt_target".
Die Frage ist nun, wie es von hier aus weiter geht. Dazu braucht man erstmal die Info, was für ein Objekt man denn bisher "in der Hand" hat. Dazu hilft ein Blick ins ODFS in der Doku zu (in diesem Fall) "FS_REFERENCE" im grauen Kasten rechts oben - hier ist immer der "innere" Datentyp der jeweiligen Eingabekomponente unter "zu den Methoden" verlinkt bzw. vermerkt. In diesem Fall TargetReference. Das ist somit der Typ von for_providedMedia.item.lt_target.
Folgt man dem Link, findet man darauf im ODFS die Methode .get(), die das eigentlich referenzierte Objekt vom Typ "IDProvider" liefert.
for_providedMedia.item.lt_target.get() //Typ laut API: IDProvider
IDProvider ist nun ein recht allgemeiner Typ. Ab hier kommt man besser mit dem JavaDoc weiter - erstmal beim IDProvider.
In Deinem Fall hast Du - da Du ja ein Medium verlinkt hast - ein Objekt vom Typ Media (Spezialfall bzw. "Sub-Interface" von IDProvider).
Aus einem Media-Objekt bekommt man die Dateiendung nicht "direkt" sondern nur vom konkreten Daten-Objekt innerhalb des Media-Objektes. Das kann entweder ein File oder ein Picture sein - in Deinem Fall (da es kein Bild ist) ein File, das Du mit .getFile(Language language) bekommst.. Hier muss man dann allerdings die Sprache mit angeben, weil die Methode so in der API definiert ist und es hier im Template (erstmal...) keine "Kurzschreibweise" gibt:
for_providedMedia.item.lt_target.get().getFile(#global.language) // Typ: File
Und hier liefert die API zu File dann letztlich die Methode getExtension() - die man wie alle parameterlosen Getter im Template schlicht wie eine öffentliche Property schreiben kann - also einfach extension:
for_providedMedia.item.lt_target.get().getFile(#global.language).extension
Es gibt allerdings in diesem Fall letztlich mit der Funktion ref() eine "Abkürzung", die einem direkt das referenzierte Picture oder File liefert (stimmt technisch nicht zu 100%, läuft aber letztlich in etwa darauf hinaus):
ref(for_providedMedia.item.lt_target).extension
Man kann in diesem Fall also beides nutzen:
$CMS_VALUE(for_providedMedia.item.lt_target.get().getFile(#global.language).extension)$
$CMS_VALUE(ref(for_providedMedia.item.lt_target).extension)$
Ich wollte aber auch mal den allgemeinen Weg aufzeigen, wie man sich generell "an der Doku entlang bewegt", der dann auch bei anderen Eingabekomponenten funktioniert, bei denen man das ref() nicht benutzen kann 😉
Viele Grüße
Michael
Hallo Michael,
vielen Dank. Deine ausführliche Antwort war genau das, was ich brauchte.
Jetzt ist das Aha-Erlebnis da .
Viele Grüße
Rolf