Zum Inhalt springen

Formulareingabe prüfen vor Abschicken

Erstellt am 1. März 2010 · 7 Antworten · letzte Antwort am 2. März 2010

Tags: Frage

DJ-Mingo ·

Hallo.

Suche einen kurzen Code-Schnippsel zur Prüfung eines Frontendformulars, das ich in eine selbstgeschriebene Extension integriert habe oder einen guten Tipp, wie ich da vorgehen muss.

Mir schwebt folgendes einfache Szenario vor:
FE-User gibt seine Werte in das Formular ein. Wenn er den Senden-Knopf drückt, soll ein kleines Popup-Fenster erscheinen, wo er sich überlegen soll, ob die Angaben nochmal überprüft werden sollen oder nicht. Klickt er "Ja", dann werden die Daten in die Datenbank geschrieben...

Gruss
Christian

karlchen ·

kleiner Tipp am Rande aus Sicht der Sicherheit, vertraue NIEMALS einer Benutzereingabe, immer überprüfen, niemals den Benutzer entscheiden lassen, vorallen wenn du Sachen auch in die Datenbank geschrieben werden.

Wegen der Überprüfung, es gibt einige JavaScripte die eine erste FormValidrung vornehmen können. Dort kannst du bestimmen was in Felder eingetragen werden soll und was nicht, schönes Beispiel ist immer die gültige Email Adresse.

Auf PHP Seite solltest du allerdings immer prüfen, dort kannst du in deiner Extension die alle übergebenen Variablen mit $this->piVars[] abfragen*, auswerten und dann entsprechend darauf reagieren.

* vorausgesetzt, in dem Formular haben die InputFelder die folgende Struktur name="tx_deineExtenions_pi1[​email]

DJ-Mingo ·

Hallo karlchen,

vielen Dank für deine Anmerkungen. Meine Typo3 Installation befindet sich in einem Intranet ;-) und auf die Seite kommen nur Leute mit entsprechendem Zugriff. Also nicht ganz so riskant.

Ok...dann werde ich mal ein wenig in Sumas nach Java Scripten suchen. Vielleicht finde ich ja da was gescheites. Bin noch nicht gar so fit, was das Einbinden angeht, aber das wird dann schon.

VG Christian

ammannd ·

im prinzip muss ich karlchen zustimmen. aber wenn du nur eine nachfrage haben willst, bevor du das formular absendest, dann genügt folgender submit button:

<input type="submit" value="Abschicken" name="submit" onclick="javascript:if(!confirm('Wirklich abschicken?')) {return false;}" />

wenn du aber die felder noch zusätzlich validieren willst, dann findest du bestimmt irgendwo auf dem internet code-schnipsel. ich meinerseits habe noch oft mit clients zu tun, wo Javascript deaktiviert wurde (man glaubts kaum, aber es ist leider so...), deshalb validiere ich meine daten meistens auf server-seite (also im PHP skript).

DJ-Mingo ·

Hallo Dave,
wieder mal vielen Dank für den hilfreichen Tipp.
Bei mir funzt das nur leider nicht, weil folgende Meldung kommt:

Parse error: syntax error, unexpected T_STRING in /var/www/BSP-BDT-ELB/typo3conf/ext/tkbestand/pi1/class.tx_tkbestand_pi1.php on line ...

Ja, ich würde ja gerne auf php-Ebene validieren, doch dazu fehlt mir (noch) das Wissen 😉 , wie ich das programmieren muss.

Meine Function Main sieht ja so aus:

function main($content, $conf)	{
	
		$this->conf=$conf;
		$this->pi_setPiVarDefaults();
		$this->pi_loadLL(); 
		
		if(isset($this->piVars['submit_button'])) { // WHAT TO DO if content is submit

			
			//t3lib_div::debug($this->piVars);
			
				
// ---------------------- Schnippsel für Aktualisierung der Historie	

		$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'tx_tkbestand_basis','akttk = "'.$this->piVars['DATA']['alter_tk'].'"');
		$count = $GLOBALS['TYPO3_DB']->sql_num_rows($res);
		if ($count) {
			while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))   {
        		$neuerTkRecord = array (
             		'akttk' => addslashes($this->piVars['DATA']['neuer_tk']),
             		'history' => $row['history'].'<br>'.strftime('%Y-%m-%d %H:%M',strtotime('now')).': Umlagerung in '.$this->piVars['DATA']['neuer_tk'],
             		'tstamp' => strtotime('now')
                  );                                   
        		$res2 = $GLOBALS['TYPO3_DB']->exec_UPDATEquery('tx_tkbestand_basis','akttk = "'.$this->piVars['DATA']['alter_tk'].'" AND not consumed',$neuerTkRecord);
			}
			
		}
                
		$GLOBALS['TYPO3_DB']->sql_free_result($res); 
		
// --------------------------------------------------------------------------------------------------------------------
			
 				//echo mysql_error(); 
 			header ('Location: '.t3lib_div::locationHeaderUrl('index.php? id=56'));
 		
		} else {
		switch((string)$conf['CMD'])	{
			case 'singleView':
				list($t) = explode(':',$this->cObj->currentRecord);
				$this->internal['currentTable']=$t;
				$this->internal['currentRow']=$this->cObj->data;
				return $this->pi_wrapInBaseClass($this->singleView($content, $conf));
			break;
			default:
				if (strstr($this->cObj->currentRecord,'tt_content'))	{
					$conf['pidList'] = $this->cObj->data['pages'];
					$conf['recursive'] = $this->cObj->data['recursive'];
				}
				return $this->pi_wrapInBaseClass($this->listView($content, $conf));
			break;
		}
		}
	}


....
$fullTable.='
				<h3>Wechsel des TKS:</h3>
				<form action="'.$this->pi_getPageLink($GLOBALS["TSFE"]->id).'" method="POST">
					<input type="hidden" name="no_cache" value="1">
					<table id="TKS_Wechsel_Formular">
						<tr>
							<th>Alter TKS</th>
							<th>Neuer TKS</th>
						</tr>
						<tr>
							<td><input type="text" name="'.$this->prefixId.'[DATA][alter_tk]" value=""></td>
							<td><input type="text" name="'.$this->prefixId.'[DATA][neuer_tk]" value=""></td>
							<td><input type="submit" name="'.$this->prefixId.'[submit_button]" value="Senden!" onclick="javascript:if(!confirm('Wirklich abschicken?')) {return false;}"></td>
						</tr>
						<tr>
							<td colspan=2><p>Format der Eingabe: <span style="color:red">TK01, TK02, TK03...TK11</span></p></td>
					</table>
				</form>
				<BR>
				<P>Sie k&ouml;nnen hier klicken um '.$this->pi_linkToPage("diese Seite zu aktualisieren",$GLOBALS["TSFE"]->id).'</P>
			';

Dürfte dir ja bekannt sein...

Gruss
Christian

ammannd ·

du musst auf zeile 69 in obigem code halt die single quotes escapen, also so:

<td><input type="submit" name="'.$this->prefixId.'[submit_button]" value="Senden!" onclick="javascript:if(!confirm(\'Wirklich abschicken?\')) {return false;}"></td>

ansonsten erkennt er die einfachen anführungszeichen als ende des textes...