News Details

15.06.2010 11:58

Mit TypoScript am Ende – userFunc hilft

Kategorie: userFunc, RSS Feeds, typo3blogger.de
Von: Alex Kellner

Wir haben auf typo3blogger bereits einige Beiträge die sich mit dem Einsatz von userFuncs in TypoScript und in conditions beschäftigen. Dennoch versuche ich das Thema einmal aus Sicht eines Beginners anhand eines konkreten Beispiels zu beleuchten.


Mit TypoScript lassen sich bereits eine Menge Anforderungen abdecken, aber leider eben noch nicht alle. Ein paar spezielle Anforderungen, die vielleicht in PHP einfach umzusetzen wären, vermisst man vielleicht regelmäßig (number_format(), stristr(), mktime(), str_replace(), …). In den beiden nachfolgenden Beispielen, versuche ich die Einbindung einer userFunc etwas transparenter zu machen.

Beispiel 1 – Schritt 1:

Ein einfaches Beispiel wäre die Ausgabe des aktuellen Seitennamens an einem festen Marker.

# pagetitle output

lib.pageTitle = TEXT

lib.pageTitle.field = title

 

# output on marker ###PAGETITLE###

page.10.marks.PAGETITLE < lib.pageTitle

 

Beispiel 1 – Schritt 2:

Eventuell möchte man auf allen Seiten mit dem Namen “Detail” einen anderen Titel anzeigen. Mit TypoScript kein Problem (Die Zeile mit dem Output an dem Marker habe ich an dieser Stelle weggelassen – siehe oben).

lib.pageTitle = CASE

lib.pageTitle {

key.field = title

 

default = TEXT

default.title = title

 

Detail = TEXT

Detail.value = Sie befinden sich innerhalb einer Detailansicht

}

 

Beispiel 1 – Schritt 3:

In unserem Fall wollen wir, sobald sich irgendwo im Titel das Wort “detail” befindet, immer eine andere Ausgabe haben. Ein paar Zeilen PHP im Zusammenhang mit einer userFunc helfen sofort. Die PHP-Funktion stristr() bietet sich an.

In unserer eigenen Funktion müssen wir drei Dinge bereitstellen:

- Der zu überprüfende Text, der auch in den meisten Fällen zurückgegeben werden soll (außer bei “detail”)

- Der zu suchende Begriff – in unserem Fall “detail”

- Einen alternativen Text, falls der zu suchende Begriff gefunden wurde

Im nachfolgenden Beispiel wird zu Beginn mit includeLibs eine PHP Datei geladen, die unsere neue Funktion beinhaltet. Eine Funktion mit Namen stristrTypoScript() innerhalb einer Klasse user_misc wird direkt durch lib.pageTitle aufgerufen. Alle Werte innerhalb der userFunc (titleField, searchFor, foundText) stehen als einfaches Array in PHP zur Verfügung. Dabei fällt auf, dass sich searchFor von den beiden anderen Werten irgendwie unterscheidet:

- titleField (stdWrap mit TEXT)

- searchFor (String)

- foundText (stdWrap mit TEXT)

Bei titleField und foundText wird TypoScript nicht nur gelesen, sondern auch geparst und interpretiert, während bei searchFor lediglich ein Wert übergeben wird. Der Unterschied: Wir wollen die TypoScript Flexibilität auch bei titleField und bei foundText.

# include php file

includeLibs.user_misc = fileadmin/user_misc.php

 

lib.pageTitle = USER

lib.pageTitle {

userFunc = user_misc->stristrTypoScript

userFunc {

# whole string

titleField = TEXT

titleField.field = title

 

# keyword to search for

searchFor = detail

 

# TypoScript if keyword found

foundText = TEXT

foundText.value = Sie befinden sich innerhalb einer Detailansicht

}

}

 

Unsere PHP Datei mit Namen user_misc.php befindet sich im fileadmin Verzeichnis und hat nachfolgenden Inhalt.

<?php

class user_misc {

function stristrTypoScript($content = '', $conf = array()) {

// config

global $TSFE;

$local_cObj = $TSFE->cObj; // cObject

$conf = $conf['userFunc.']; // ts config

$searchFor = $conf['searchFor']; // get string

$titleField = $local_cObj->cObjGetSingle($conf['titleField'], $conf['titleField.']); // stdWrap for title

$foundText = $local_cObj->cObjGetSingle($conf['foundText'], $conf['foundText.']); // stdWrap for alternative Text

 

// let's go

if (stristr($titleField, $searchFor)) { // if keyword found

return $foundText; // return alternative text

} else { // keyword not found

return $titleField; // return title

}

}

}

?>

 

Beispiel 2 – Schritt 1:

Ein weit einfacheres Beispiel zeige ich im Zusammenhang mit number_format. Eine Zahl soll mit Hilfe einer userFunc formatiert zurückgegeben werden (wie es z.B. die Warenkorb Extension wt_cart macht). Wir wollen also eine Währung anzeigen – Anstatt 100 die Ausgabe 100,00 € oder eben anstatt 23.5 die Ausgabe 23,50 €.

Ein Feldinhalt könnte als Dezimalzahl (mit Punkt statt Komma) vorliegen und würde eben als solcher wieder ausgegeben werden.

zahl = TEXT

zahl.field = number

# Output: 23.4

 

Beispiel 2 – Schritt 2:

Über einen Wrap können wir ein Euro Zeichen hinten anfügen.

zahl = TEXT

zahl.field = number

zahl.field.wrap = |&nbsp;&euro;

# Output: 23.4 €

 

Beispiel 2 – Schritt 3:

Nun zur Formatierung der Ausgabe über die PHP Funktion number_format().

includeLibs.user_misc = fileadmin/user_misc.php

 

zahl = USER

zahl.userFunc = user_misc->numberFormatTypoScript

zahl {

number = TEXT

number.field = number

}

# Output: 23,40

<?php

class user_misc {

function numberFormatTypoScript($content = '', $conf = array()) {

global $TSFE;

$local_cObj = $TSFE->cObj; // cObject

$conf = $conf['userFunc.']; // TS configuration

 

$number = $local_cObj->cObjGetSingle($conf['number'], $conf['number.']); // get number

return number_format($number, 2, ',', '.');

}

}

?>

 

Beispiel 2 – Schritt 4:

Dummerweise lässt sich eine userFunc nicht so einfach wrappen, weswegen wir für unser Euro Zeichen noch ein COA außen herumpacken sollten

includeLibs.user_misc = fileadmin/user_misc.php

 

zahl = COA

zahl {

wrap = |&nbsp;&euro;

10 = USER

10.userFunc = user_misc->numberFormatTypoScript

10.userFunc {

number = TEXT

number.field = number

}

}

# Output: 23,40 €

 

Beispiel 2 – Schritt 5:

Das I-Tüpfelchen wäre natürlich, wenn man die Parameter der Funktion number_format nicht hart in der userFunc hinterlegen würde, sondern auch noch über TypoScript verfügbar macht:

includeLibs.user_misc = fileadmin/user_misc.php

 

zahl = COA

zahl {

wrap = |&nbsp;&euro;

10 = USER

10.userFunc = user_misc->numberFormatTypoScript

10.userFunc {

number = TEXT

number.field = number

 

decimal = 2

dec_point = ,

thousands_sep = .

}

}

# Output: 23,40 €

<?php

class user_misc {

function numberFormatTypoScript($content = '', $conf = array()) {

global $TSFE;

$local_cObj = $TSFE->cObj; // cObject

$conf = $conf['userFunc.']; // TS configuration

 

$number = $local_cObj->cObjGetSingle($conf['number'], $conf['number.']); // get number

return number_format($number, $conf['decimal'], $conf['dec_point'], $conf['thousands_sep']);

}

}

?>

 

Links zum Thema

Freue mich immer über jeden Kommentar…

Gruß aus dem verregneten München, Alex

------------------------------------------------------
Dies ist ein Post vom TYPO3 Blog typo3blogger.de!

 


Kommentare zu dieser News

4 Kommentare
#4 Tobias schrieb am 10.12.2010 13:11

Hallo,

 

wie müßte der php code aussehen, damit ich die userfunc auch innerhalb eines split nutzen kann.

 

ich würde gern im folgenden Beispiel den Wert von number.value.cObject.value.current = 1 umwandeln.

es geht aber nur mit zb number.value = 12

 

ich kenne mich leider mit php noch gar nicht.

 

Gruß

Tobias

 

 

zahl = TEXT

zahl {

wrap =

|

value = 1,2,3,4,5

split {

token = ,

cObjNum = 1

1 {

cObject = COA

cObject {

10 = COA

10 {

10 = USER

10.userFunc = user_misc->numberFormatTypoScript

10.userFunc {

number = TEXT

number {

value {

cObject = HTML

cObject.value.current = 1

cObject.value.wrap = {DB:table:|:field}

insertData = 1

#cObject.value = 512.34

}

#value = 12

#value >

#current = 1

}

}

wrap =

| €

}

}

}

}

}

#1 Bob schrieb am 05.08.2010 12:11

Hi,bei mir funktioniert das nicht. Ich bekomme einfach keine Ausgabe. HIer mein TS:

 

10 = TEXT

10.field = name

 

10.postUserFunc = user_MenuWrapper->main

10.postUserFunc {

test = TEXT

test.field = name

}

 

mein php:

global $TSFE;

$local_cObj = $TSFE->cObj;

$c $conf['userFunc.'];

echo $local_cObj->cObjGetSingle($conf['name'],$conf['name']);

 

...kommt nix bei rum??

 

Gruss

Bob

#2 Bob schrieb am 05.08.2010 12:12

hab natürlich $c $conf['userFunc.'] in meinem Code stehen!

#3 Bob schrieb am 05.08.2010 12:23

Hallo, o.k. für mich hab ich die Lösung jetzt gefunden, denn wie beim Zugriff eigens erzeugter Inhaltselementen kann ich ja auch hier auf den Datensatz per $this->cObj->data zugreifen!

 

Gruss

Typo3