Betriebseinschränkungen

Sorry, das Forum funktioniert leider nicht (zuverlässig). Bitte entschuldige die Umstände.
Fragen zu TYPO3 GRÜNE können im Chat gestellt werden.
Bei anderen Fragen kannst Du Dich an Die Netzmacher, Dirk Wildt, wenden: forum@die-netzmacher.de

Probleme mit dem PDF-Button, Parameter und URL-Kodierung

lisardo
Mitglied seit 12. 06. 2012
0 Beiträge

Hallo,

die mitgelieferten Buttons bzw. das Typoscript dafür funktionieren meines Erachtens nur, wenn sie so eingebunden werden, wie in der Doku beschrieben. Wenn man einen PDF-Button braucht, der folgende Möglichkeiten bietet, gehen sie nicht:

- Platzierbar über ein FCE oder über eine TemplaVoila-Seitentemplate
- unabhängig von RealURL
- mit beliebigen Übergabeparametern

Das Problem liegt immer daran, dass die URL nur teilweise bzw. unvollständig rawURLkodiert wird; in der Regel ist das &-Zeichen unkodiert. Dann erkennt pdf-controller die Parameter nicht mehr. In meinem Fall waren das vor allem tt_news-Parameter.

Meine Lösung war, das Button-Typoscript komplett selbst zu erstellen:

[typoscript]

lib.print_pdf = COA
lib.print_pdf {

10 = TEXT
10.value = als PDF downloaden
10 {
typolink {
title = als PDF downloaden
ATagParams = rel="nofollow" class="f-pdf"
parameter = {$plugin.tx_pdfcontroller_pi2.page.pdf_controller}
additionalParams.cObject = COA
additionalParams.cObject {
10 = COA
10 {
10 = TEXT
10.typolink {
parameter = {page:uid},{$plugin.tx_pdfcontroller_pi2.typeNum.print}
parameter.insertData = 1
addQueryString = 1
addQueryString {
exclude = id, cHash
}
returnLast = url
}
stdWrap.rawUrlEncode = 1
}

wrap = &tx_pdfcontroller_pi1[URL]={getIndpEnv:TYPO3_SITE_URL}|
wrap.insertData = 1
}
}

}
rawUrlEncode = 1
}
}

[/typoscript]

Jetzt wird tatsächlich der gesamte Teil nach tx_pdfcontroller_pi1[URL]url-kodiert. So kann der Button jetzt zum Beispiel in einem TemplaVoila-template referenziert werden, oder auch in jedem sonstigen Typoscript. Und nach meinen Tests sollte es unabhängig sein von RealURL.

Wäre gut, wenn das jemand testen könnte - könnte durchaus sein, dass es Situationen gibt, in denen es nicht geht.

Gruß
Peter

harald
Mitglied seit 29. 06. 2012
0 Beiträge

[color=#00cc00]Die LÖSUNG mit BEGRÜNDUNG (Ein kleines stdWrap-Tutorial)[/color]
Ja, hallo an euch alle.

Alle, die meinen letzten Artkel gelesen haben, wundern sich vielleicht, warum dieser verschunden ist. Der Grund ist simpel - er war FALSCH.

Entschuldigt, dass dieser Artikel etwas länger wird, aber es geht nicht anders. Ich möchte nämlich, dass nahezu jeder versteht, was ich hier erkläre. Warum? Ganz einfach: Das Problem, welches ich hier behandle, hat nur bedingt mit pdfcontroller zu tun. Das Thema heißt einfach TypoScript im Allgemeinen und im Speziellen stdWrap!!! Wir gehen Step by Step vor.

Die Ausgangssituation:
Wir haben Tutorial I und II (Version 1.3.0) von Dirk abgearbeitet. Falls man, so wie ich, das MasterTemplate "pdf_and_print_button_realUrl" benutzt, passiert erstmal nur "Warning #2", weil da nämlich nichts drin steht. Macht nix - kann man sich ja von woanders klauen.

Gesagt getan. Geht wieder nicht.
Das Problem ist, wie lisardo beireits beschrieb, dass die bereits vorhandenen und nicht bereits mit realUrlEncode behandelten Parameter (z.B. tt_news[backPid]=123) auch weiterhin nicht "behandelt" werden und so im pdfcontroller nicht funktionieren.

Der Plan:
Wir brauchen einen Link auf "http/www.myweb.de/pdf-controller/". Das ist kein Problem, kann man ja mit typolink machen, indem man einfach nur "parameter=id" angibt.
Zusatzlich brauchen wir noch Parameter, wie z.B. &tx_pdfcontroller_pi1[URL]=4711. Auch kein Problem, schießlich hat ein ordentlicher typolink die Eigenschaft "additionalParams". Da "additionalParams" vom Typ string/stdWrap ist, können wir hier super wieder einen wrap oder einen typolink konstruieren. Letzteres müssen wir wählen, weil wir Register benutzen wollen und noch einen zusätzlichen wrap machen müssen. Ein String ist eben nur ein string und kein typolink (ein Typolink-Tanga wäre auch mal was nettes. :D

Jetzt gehts los. Ich gehe davon aus, dass wir auf der Seite "http/www.myweb.de/mysite/?bar=bar&foo=foo" sind.
Wir bauen von innen nach außen die Struktur auf, beginnen also mit dem Basteln der Parameter:

Schritt 1:
Wir bauen zunächst den Parameter, also den inneren typolink (das eigentliche Problem).

[typoscript]page.10.subparts.default.100 = TEXT
page.10.subparts.default.100 {
wrap = Ergebnis:<br />|
typolink {
parameter = {page:uid},{$plugin.tx_pdfcontroller_pi2.typeNum.print}
parameter.insertData = 1
addQueryString = 1
returnLast = url
}
}
[/typoscript]
Ergebnis:
mysite/?type=98&bar=bar&foo=foo

Schitt 2:
So, das hätten wir. Aber pdfcontroller kommt nunmal mit dem Parameterstring "?type=98&bar=bar&foo=foo" nicht zurecht. Den müssen wir noch mit der PHP-Funktion rawurlencode() bearbeiten. Das sollte eigentlich kein Problem sein, denn unser Contentelement (im Folgenden CE genannt) vom Typ TEXT hat ja selbst alle Eigenschaften von stdWrap. Also könnten wir doch eigentlich das Folgende formulieren:

[typoscript]page.10.subparts.default.100 = TEXT
page.10.subparts.default.100 {
wrap = Ergebnis:<br />|
typolink {
parameter = {page:uid},{$plugin.tx_pdfcontroller_pi2.typeNum.print}
parameter.insertData = 1
addQueryString = 1
returnLast = url
}
rawUrlEncode = 1
}
[/typoscript]
Ergebnis:
mysite/?type=98&bar=bar&foo=foo :bang:

Fuck! Hat nicht gefunzt. Aber warum? Meistens geht jetzt die Probiererei los. Aber nicht hier. Ich hab euch ja ein kleines "stdWrap-Tutorial" versprochen.
Also schauen wir mal in die TsRef rein und lesen was da so zu stdWrap steht. Und jetzt kommt der allerwichtigste Satz in diesem Beitrag, den sich bitte alle ganz dick hinter die Ohren Schreiben:

[color=#dd0000]Die stdWrap-Eigenschaften werden in exakt der Reihenfolge abgearbeitet, wie sie in der Tabelle im TsRef aufgeführt sind!!![/color][/b]

Wir haben also hier ein CE vom Typ TEXT, welches selbst über alle stdWrap-Eigenschaften verfügt. Dann haben wir die Eigenschaften "rawUrlEncode" und "typolink" definiert. Die beiden gehören zur Gruppe der "Parse Data"-Eigenschaften. Doch ein Blick in die TsRef verrät, dass "rawUrlEncode" VOR "typolink" ausgeführt wird! "rawUrlEncode" wird also auf ein noch leeres Textobjekt angewendet, was natürlich im Ergebnis wieder ein leeres Textobjekt ergibt. Erst danach kommt typolink dran und ergibt selbstverstänlich genau das, was wir oben sehen. Doch es gibt glücklicherweise mindestens zwei Lösungen, die mir dazu einfallen.

[b]Schritt 3a: Lösung 1
Was also tun? Man könnte auf die Idee kommen, stdWrap's zu verschachteln. Wir müssen ja ohnehin, wenn wir den Parameter für den Link fertig haben, noch einen typolink außen drumherum basteln. Ein Blick in die TsRef verrät, dass die rekursive Eigenschaft namens "stWrap" eines stdWrap's VOR "typolink" und "rawUrlEncode" dran ist. Es sollte also möglich sein, den "typolink" in den inneren stdWrap zu legen, welcher vor dem "rawUrlEncode" des äußeren stdWraps dran ist. Das sähe dann so aus:

[typoscript]page.10.subparts.default.100 = TEXT
page.10.subparts.default.100 {
stdWrap.typolink {
parameter = {page:uid},{$plugin.tx_pdfcontroller_pi2.typeNum.print}
parameter.insertData = 1
addQueryString = 1
returnLast = url
}
rawUrlEncode = 1
}
[/typoscript]

Ergebnis:
mysite%2F%3Ftype%3D98%26bar%3Dbar%26foo%3Dfoo

Yeah! Ein Hoch auf die TsRef.

Schritt 3b: Lösung 2
Ein anderer, aber ähnlicher Ansatz ist, dass ein CE erst erzeugt werden muss, bevor man an den Eigenschaften was machen kann. An den Eigenschaften eines noch nicht existierenden Objektes zu fummeln ist ja echter Quatsch mit Soße.
Wenn wir also zwei CE's ineinander schachteln, dann wird zuerst das äußere CE erzeugt. Dies ist erst vollständig, wenn als zweites das innere CE erzeugt wird. Da letzteres keine weiteren CE's enthält werden als drittes die Eigenschaften des inneren CE's abgearbeitet. Nun ist das äußere CE fertig und dessen Eigenschaften werden abgearbeitet.
Wir können also hier wie beim Schitt 3a vorgehen und den typolink in das innere CE legen, rawUrlEncode hingegen in das äußere. Das ist übrigens die Grundidee, auf der lisardo's Lösung (s.o.) basiert, auch wenn diese nicht ganz korrekt ist.
Das klassische Standard-CE zum Verschachteln von CE's ist das "Content Object Array", genannt COA. Doch aufgepasst: Im Gegensatz zum Objekt TEXT verfügt ein COA nicht selbst über stdWrap-Eigenschaften. Es hat aber sehr wohl eine Eigenschaft namens stdWrap, die von Typ stdWrap ist. Diese können wir für unsere Zwecke nutzen. Allerdings dürfen wir dann nicht "rawUrlEncode" schreiben, sondern müssen "stdWrap.rawUrlEncode" notieren.
Hier der Typoscript-Code dazu:

[typoscript]page.10.subparts.CONTENT_MAIN.100 = COA
page.10.subparts.CONTENT_MAIN.100 {
10 = TEXT
10 {
typolink {
parameter = {page:uid},{$plugin.tx_pdfcontroller_pi2.typeNum.print}
parameter.insertData = 1
addQueryString = 1
returnLast = url
}
}
stdWrap.rawUrlEncode = 1
}
[/typoscript]
Ergebis:
mysite%2F%3Ftype%3D98%26bar%3Dbar%26foo%3Dfoo

Yeah! Ein zweites Hoch auf die TsRef.

Schritt 4:
So ihr Lieben, ich denke, dass ich euch jetzt genug mit der TsRef gequält habe.
Aber jetzt wisst ihr alle nicht nur wie es geht, sondern auch WARUM es genau so geht. Und das war mir an dieser Stelle absolut wichtig. Schließlich steht im Netz bereits mehr Typoscript-Unsinn als Sinn.

Im letzten Schritte hier also nur noch den kompletten Code (realUrl-Variante), wie er für pdfcontroller funzt. Ich nehme dazu die Lösung aus Schritt 3a - ich find die eleganter:

[typoscript]page.10.subparts.default {
5 < plugin.tx_pdfcontroller_pi2.master_templates.pdf_and_print_button_realUrl
5.10.imageLinkWrap {
enable = 1
typolink {
target = _blank
parameter = {$plugin.tx_pdfcontroller_pi2.page.pdf_controller}
additionalParams = TEXT
additionalParams {
wrap = &tx_pdfcontroller_pi1[URL]={getIndpEnv:TYPO3_SITE_URL}|
insertData = 1
stdWrap.typolink {
parameter = {page:uid},{$plugin.tx_pdfcontroller_pi2.typeNum.print}
parameter.insertData = 1
addQueryString = 1
addQueryString.exclude = id,cHash
returnLast = url
}
rawUrlEncode = 1
}
ATagParams = rel="nofollow"
}
}
5.20.imageLinkWrap.typolink.target = _blank
}
[/typoscript]

Und noch eine kleines Anliegen an Die Netzmacher. Bitte übernehmt die Lösung. Hab mir hier so viel Mühe gegeben.

Euer Harald

Hallo Harald,
ich bin halt ein Neuling in Fragen Typoscript und habe auf meiner Testseite den PDF-Controller eingebaut. Hänge schon den ganzen Tag daran - und ich bekomme es nicht hin :bang:.
Die URL ist:

[url=]http/www.webdesign-kl.de/startseite.html[/url]

Die allgemeine Druckversion mit printlink geht, aber nicht mit dem PDF-Controller.

Mein Pagescript habe ich wie folgt definiert

[typoscript]page = PAGE
page.100 < temp.addJs

# Indizieren der Website aktivieren
page.config.index_enable = 1

# Indexierung fuer externe Dateien
page.config.index_externals = 1

page.typeNum = 0

#Allgemeine Seiteneigenschaften setzen
page {


# Das Template wird eingebunden
10 = TEMPLATE
10 {
template = FILE
template.file = fileadmin/templates/vorlage.html
workOnSubpart = DOKUMENT

marks {
LOGO < temp.logo
MENU_GLOBALS < temp.menu_globals
SUCHE < temp.suche
MENU_OBEN < temp.menu_oben
SLIDER < temp.slider
BREADCRUMP < temp.breadcrump
SPRACHE < temp.sprache
MENU_LINKS < temp.menu_links
LINKS < temp.links
INHALT < temp.inhalt
RECHTS < temp.rechts
MENU_UNTEN < temp.menu_unten
DRUCKVERSION < plugin.tx_cronprintlink_pi1

}
}
}

# Eine Druckversion mit PRINTLINK
druckversion = PAGE
druckversion.includeCSS {
10 = fileadmin/templates/css/print.css
10.media = print
}

print = PAGE
print.includeCSS {
20 = fileadmin/templates/css/print.css
20.media = print
}
[/typoscript]

Darin angebunden das Script vom PDF-Controller

[typoscript]plugin.tx_pdfcontroller_pi2.page.pdf_controller = 31
page.10.marks.PDFVERSION < plugin.tx_pdfcontroller_pi2.master_templates.pdf_and_print_button

# PDF + DRUCKSEITE DEFINIEREN
# *********************************************
print = PAGE

print.includeCSS {
file1 = fileadmin/templates/css/print.css
file1.media = screen
}

print {
typeNum = 123
config.index_enable = 0

10 = TEMPLATE
10 {
template = FILE
template.file = fileadmin/templates/pdf.html
workOnSubpart = startDocument
page.10.marks.INHALT < styles.content.get
}
}

page.10.marks.INHALT.100 = TEXT
page.10.marks.INHALT.100 {
5 < plugin.tx_pdfcontroller_pi2.master_templates.pdf_and_print_button_realUrl
5.10.imageLinkWrap {
enable = 1
typolink {
target = _blank
parameter = {$plugin.tx_pdfcontroller_pi2.page.pdf_controller}
additionalParams = TEXT
additionalParams {
wrap = &tx_pdfcontroller_pi1[URL]={getIndpEnv:TYPO3_SITE_URL}|
insertData = 1
stdWrap.typolink {
parameter = {page:uid},{$plugin.tx_pdfcontroller_pi2.typeNum.print}
parameter.insertData = 1
addQueryString = 1
addQueryString.exclude = id,cHash
returnLast = url
}
rawUrlEncode = 1
}
ATagParams = rel="nofollow"
}
}
5.20.imageLinkWrap.typolink.target = _blank
}
[/typoscript]

Ich stehe leider auf dem Schlauch und so fit bin ich leider nicht mit Typoscript. Bin aber dabei mich einzuarbeiten und finde es sehr variabel.

Danke im Vorfeld für die Unterstützung.

andyman

harald
Mitglied seit 29. 06. 2012
0 Beiträge

Hallo andyman,

also bei mir gehen beide Buttons nicht. Allerdings sind die Links korrekt, du hast mein Scriptschnipsel also ordentlich eingebaut.

Vor dem eigentlichen Fehler noch zwei Sachen:

1.
Es scheint hier was Grundsätzliches schief zu laufen:

[typoscript]print {
typeNum = 123
config.index_enable = 0

10 = TEMPLATE
10 {
template = FILE
template.file = fileadmin/templates/pdf.html
workOnSubpart = startDocument
page.10.marks.INHALT < styles.content.get
}
}
[/typoscript]

In dem Template gibt es keinen Subpart "startDocument". Der heißt dort "DOCUMENT_BODY". Ich gehe mal davon aus, dass du heftig am basteln bist und es daher nicht geht.

2.
Der IE8 hängt sich beim laden von [url=]www.webdesign-kl.de/startseite.html[/url] komplett auf. Kann aber auch an meiner Installation liegen. Habe daher mit Chrome mal nachgeschaut.

DER FEHLER:
Aber das hier ist wohl der Fehler: Der pdfcontroller wird nicht gefunden, denn die Zeile

[color=#dd0000]plugin.tx_pdfcontroller_pi2.page.pdf_controller = 31[/color][/b]

[b][color=#00dd00]gehört nicht in Setup deines Typoscript-Templates, sondern in die Konstanten.[/color] Ich sag dir auch warum:

Da ich jetzt keine Lust habe zu überprüfen, ob das so in der Doku steht, ein kurzer Auszug aus:

.../typo3conf/ext/pdfcontroller/static/pi2/setup.txt

[typoscript]plugin.tx_pdfcontroller_pi2 {
master_templates {
pdf_and_print_button {
10 {
imageLinkWrap {
typolink {
parameter = {$plugin.tx_pdfcontroller_pi2.page.pdf_controller}
}
}
}
}
}
}
[/typoscript]

Um das also im Setup zu machen müsstes du schreiben:
[typoscript]plugin.tx_pdfcontroller_pi2.master_templates.pdf_and_print_button.10.imageLinkWrap.typolink.parameter = 31
[/typoscript]

Und um dir diese Odyssee zu ersparen hat Dirk freundlicher weise eine Konstante definiert.
Und falls es dich beruhigt oder freut: Für einen Neuling sieht dein Typoscript schon ganz ordentlich aus! :D
UND: Diesen Fehler haben schon unendlich viele Leute gemacht - ich auch!

HTH
Harald

Hallo Harald,
vielen Dank für schnelle Hilfe.
Den Fehler mit dem ie8 muss ich noch testen.
Ich habe die Änderungen im Script vorgenommen.
Die Printversion wird jetzt angezeigt, aber leider das PDF-File nicht.
Leider werden auch die beiden Versionen (Print und PDF) nicht in einem neuen Fenster geöffnet.

Kostanten
[typoscript]plugin.tx_pdfcontroller_pi2.page.pdf_controller = 31
plugin.tx_pdfcontroller_pi2.typeNum.print = 123
plugin.tx_pdfcontroller_pi2.realUrl.print = fileadmin/templates/pdf.html
[/typoscript]

Setup

[typoscript]page.10.marks.PDFVERSION < plugin.tx_pdfcontroller_pi2.master_templates.pdf_and_print_button

# PDF + DRUCKSEITE DEFINIEREN
# *********************************************
print = PAGE

print.includeCSS {
20 = fileadmin/templates/css/print.css
20.media = screen
}

print {
typeNum = 123
config.index_enable = 0

10 = TEMPLATE
10 {
template = FILE
template.file = fileadmin/templates/pdf.html
workOnSubpart = DOCUMENT_BODY
marks.INHALT < styles.content.get
}
}

marks.INHALT = TEXT
marks.INHALT {
5 < plugin.tx_pdfcontroller_pi2.master_templates.pdf_and_print_button_realUrl
5.10.imageLinkWrap {
enable = 1
typolink {
target = _blank
parameter = {$plugin.tx_pdfcontroller_pi2.page.pdf_controller}
additionalParams = TEXT
additionalParams {
wrap = &tx_pdfcontroller_pi1[URL]={getIndpEnv:TYPO3_SITE_URL}|
insertData = 1
stdWrap.typolink {
parameter = {page:uid},{$plugin.tx_pdfcontroller_pi2.typeNum.print}
parameter.insertData = 1
addQueryString = 1
addQueryString.exclude = id,cHash
returnLast = url
}
rawUrlEncode = 1
}
ATagParams = rel="nofollow"
}
}
5.20.imageLinkWrap.typolink.target = _blank
}
[/typoscript]

Wo kann da noch der Fehler liegen?

Danke andyman

harald
Mitglied seit 29. 06. 2012
0 Beiträge

Also mein Scriptschnipsel wirkt im Moment gar nicht, weil du
[typoscript]marks.INHALT = TEXT
marks.INHALT {
[/typoscript]
geschrieben hast. Gestern war ws noch page.10.marks.INHALT.100
Im Originalscript (setup.txt) ist kein target=_blank drin, daher öffnet sich die Seite auch nicht im neuen Fenster.

Arbeitest du auch wirklich mit realurl? Deine Links sehen doch etwas anders aus, nämlich so:

/www.webdesign-kl.de/bibliotheken/pdf-controller.html?tx_pdfcontroller_pi1%5BURL%5D=http%3A%2F%2Fwww.webdesign-kl.de%2Fstartseite.html%3Ftype%3D123" rel="nofollow">http/www.webdesign-kl.de/bibliotheken/pdf-controller.html?tx_pdfcontroller_pi1%5BURL%5D=http%3A%2F%2Fwww.webdesign-kl.de%2Fstartseite.html%3Ftype%3D123

Also da wäre schon mal das Stück "/pdf-controller.html?...". Das sollte eigentlich "/pdf-controller/%3F..." lauten. %3f entspricht den "?". Den Slash vermisse ich. Und das Fragezeichen ist nicht als "%3F" hexadezimal codiert.

Weiter hinten, vor type, steht dann nochmal "%3F". Damit wird wohl der vordere oder hintere Teil der Parameter ignoriert und Typo3 bekommt vom Apache oder ... nicht alle GET-Parameter rüber. Klar, dass das nicht funktionieren kann.

Bei mir steht der type als erstes, also ".../pdf-controller/%3Ftype...".

Tut mir leid, ist mir gestern nicht aufgefallen. Hab mir halt die hexadezimalen Zahlen nicht so genau angeschaut.
Aber ich denke, du suchst auf der falschen Baustelle. Ich weiß jetzt nicht so ganau, wie die realurl-Integration im pdf-controller codiert ist. Aber ich sage dir: Bring erstmal deine realurl-Konfiguration in Ordnung, dann wird auch der Rest noch werden. Aber eben in dieser Reihenfolge.

HTH
Harald

  • 1