Eigene Formulare/PHP Scripten mit Typo3 6.2

Aus Debacher-Wiki
Wechseln zu:Navigation, Suche

Gelegentlich brauche ich mal ein bisschen PHP-Code, z.B. für ein Formular innerhalb von Typo3. Bisher gabe es dafür die Extension page_php_content, aber die funktioniert jetzt ja nicht mehr. Die Scripten haben in der Regel ihre Ausgabe einfach per echo-Befehl erzeugt. Zum Glück ist die Einbindung von eigenem Code nicht wesentlich komplizierter geworden.

Achtung: Solche schnell hingehauenen Programme können schnell zum Sicherheitsrisiko werden, wenn die Benutzereingaben nicht sorgfältig genug überprüft werden. Deshalb benutze ich in dem Beispiel nicht etwas wie

$nname=$_REQUEST['nname']; 

sondern

$nname=filter_input(INPUT_GET, 'nname', FILTER_SANITIZE_STRING);

Als Beispiel nehme ich das folgende kleine Script:

if (!filter_has_var(INPUT_GET, 'nname')):
    echo "Wie ist ihr Name bitte?.<br>";   
    echo "<FORM action=\"scripttest.html\" method=\"get\">";
    echo "Nachname: <INPUT type=\"text\" size=40 name=\"nname\" >";
    echo "<br><INPUT type=\"submit\" value=\"Abschicken\">";
    echo "<INPUT type=\"reset\" value=\"Verwerfen\">";        
    echo "</FORM>";
  else:
    echo "<h1>Hallo ".filter_input(INPUT_GET, 'nname', FILTER_SANITIZE_STRING)."</h1>";                        
  endif;
  $foo = ob_get_contents();
  ob_end_clean();
  return $foo;     

Dieses Script wird nun am Anfang um drei Zeilen erweitert und am Ende ebenfalls. Erst einmal muss für Typo3 eine Klasse definiert werden und dann innerhalb der Klasse eine Funktion. Mit ob_start() wird eine Pufferung der Ausgabe eingeleitet, wir können uns dann am Ende das Ergebnis abholen.

<?php

 class user_klasse {
  function funktion($content, $conf) {
  ob_start();

  if (!filter_has_var(INPUT_GET, 'nname')):
    echo "Wie ist ihr Name bitte?.<br>";   
    echo "<FORM action=\"scripttest.html\" method=\"get\">";
    echo "Nachname: <INPUT type=\"text\" size=40 name=\"nname\" >";
    echo "<br><INPUT type=\"submit\" value=\"Abschicken\">";
    echo "<INPUT type=\"reset\" value=\"Verwerfen\">";        
    echo "</FORM>";
  else:
    echo "<h1>Hallo ".filter_input(INPUT_GET, 'nname', FILTER_SANITIZE_STRING)."</h1>";                        
  endif;

  $foo = ob_get_contents();
  ob_end_clean();
  return $foo;   
  }   
 }    
 ?>

An Ende wird das Ergebnis der Ausgaben in die Variable $foo übergeben und diese als Funktionsergebnis zurück gegeben. Das Programm könnte natürlich auch noch auf eine Datenbank zugreifen oder ähnliche Dinge vornehmen.

Nun müssen wir das Script noch auf einer Seite einbinden, der wir den Alias-Namen scripttest geben (siehe Formular). Dazu erstellen wir auf der Seite ein Erweiterungstemplate und geben im Setup-Feld folgenden Code ein:

includeLibs.time = fileadmin/meinscript.php

tmp.code = USER_INT
tmp.code {
   userFunc = user_klasse->funktion
}
#page.10.marks.CONTENT.15 < tmp.code
lib.field_maincontent.10 < tmp.code

Die erste Zeile verweist auf das vorher erstellte PHP-Script. Dann kommt der Zugriff auf die in dem Script erstellte Funktion. Die Bezeichner user_klasse und funktion stammen aus dem PHP-Script. In tmp.code ist dann also die komplette Ausgabe des Scripts enthalten. Die muss jetzt noch in den Inhaltsbereich übertragen werden. Bei meiner Vorlage mit TempaVoila ist der Hauptinhalt in lib.field_maincontent.10 zu finden. Arbeitet man mit Markern, so könnte die entsprechende Zeile so aussehen, wie der auskommentierte Code. Dies hängt also etwas vom vorhandenen Seiten-Template ab.

Nachtrag

Mir ist aufgefallen, dass das Beispiel hier nicht ausführlich genug ist. Ich habe mir eine Datei test.php erstellt

<?php

 class user_klasse {
  function funktion($content, $conf) {
  ob_start();

  if (!filter_has_var(INPUT_GET, 'nname')):
    echo "Wie ist ihr Name bitte?.<br>";   
    echo "<FORM action=\"index.php\" method=\"get\">";
    echo "<input name=\"id\" value=\"323\" type=\"hidden\">";
    echo "Nachname: <INPUT type=\"text\" size=40 name=\"nname\" >";
    echo "<br><INPUT type=\"submit\" value=\"Abschicken\">";
    echo "<INPUT type=\"reset\" value=\"Verwerfen\">";        
    echo "</FORM>";
  else:
    echo "<h1>Hallo ".filter_input(INPUT_GET, 'nname', FILTER_SANITIZE_STRING)."</h1>";                        
  endif;

  $foo = ob_get_contents();
  ob_end_clean();
  return $foo;   
  }   
 }    
 ?>

Diese Datei speichert man entweder im Verzeichnis fileadmin oder im Verzeichnis einer Extension ab. Der Zugriff erfolgt dann über ein Erweiterungstemplate auf der Seite mit der id=323 (ggf. anpassen im Script)

Der Inhalt des Setup-Feldes im Template ist dann:

page.10.marks.CONTENT = USER_INT
page.10.marks.CONTENT {
#  includeLibs = fileadmin/test.php
 includeLibs = EXT:user_kinodb/test.php
 userFunc = user_klasse->funktion
}

Den Pfad zu einer Extension muss man wie hier dargestellt angeben und nicht über typo3conf/ext/...