Zum Inhalt springen

[HowTo] sr_feuser_register (2.5.24), Felder nach eigenen Kriterien evaluieren

Erstellt am 19. März 2010 · 1 Antwort · letzte Antwort am 5. Januar 2011

Tags: Frage

FloLeBlanc ·

Hallo Forum,

nachdem es mich jetzt doch einiges an Zeit gekostet hat den Hook für die Evaluierung eigener Felder zu implementieren und ich keine genaueren Hinweise dazu im Netz finden konnte hier meine Erfahrungen für Euch.

Worum gehts?
Vorhandene Felder in sr_feuser_register sollen bei der Registrierung bzw. beim Editieren nach eigenen Kriterien geprüft werden.

Im folgenden Beispiel wird das Feld "telephone" darauf geprüft ob es mit + startet und ob abgesehen von diesem + nur Zahlen im Feld vorkommen.

-------------------

1.) Den Hook aufrufen:
typo3conf/ext/sr_feuser_register/ext_localconf.php

Hier gebt ihr an, dass ihr den Hook für evalFunc nutzen wollt, wobei der Klassenname in meinem Fall "tx_srfeuserregister_custevalFunc" ist und der Dateiname "class.tx_srfeuserregister_custevalFunc.php"

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['sr_feuser_register']['tx_srfeuserregister_pi1']['model'][] = 'EXT:sr_feuser_register/hooks/class.tx_srfeuserregister_custevalFunc.php:&tx_srfeuserregister_custevalFunc';

-------------------

2.) Den Hook implementieren
Filename: class.tx_srfeuserregister_custevalFunc.php
Meine Beispielklasse mit den oben genannten Funktionen sieht folgendermaßen aus:

<?php
/***************************************************************
*  Copyright notice
*
*  (c) 2005-2008 Stanislas Rolland <stanislas.rolland(arobas)sjbr.ca>
*  All rights reserved
*
*  This script is part of the Typo3 project. The Typo3 project is
*  free software; you can redistribute it and/or modify
*  it under the terms of the GNU General Public License as published by
*  the Free Software Foundation; either version 2 of the License, or
*  (at your option) any later version.
*
*  The GNU General Public License can be found at
*  http://www.gnu.org/copyleft/gpl.html.
*  A copy is found in the textfile GPL.txt and important notices to the license
*  from the author is found in LICENSE.txt distributed with these scripts.
*
*  This script is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU General Public License for more details.
*
*  This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
/**
 *
 * Example of hook handler for eval_func for extension Front End User Registration (sr_feuser_register)
 *
 * $Id: class.tx_srfeuserregister_custevalFunc.php
 *
 * @author FloLeBlanc (florian.weiss@leblanc.at)
 *
 */


class tx_srfeuserregister_custevalFunc {
   function evalValues($theTable, $dataArray, $origArray, $markContentArray, $cmdKey, $requiredArray, $theField, $cmdParts, $invokingObj){

		// default return value - if an empty string is returned no error is given for this field in class.tx_srfeuserregister_data.php
		$theField = '';

		// Reference to the invoking Object
		$plugin = &$invokingObj;

	    // Get phone number
	    $phonenr = $dataArray['telephone'];

		// Check if the phonenumber only consists of digits (post to position 1 - first is a +)
	    if(!(is_numeric(substr($phonenr,1))))
	    {
				// theField "telephone" is in error
				$theField = 'telephone';
				$theCmd = 'user_phone_check';

				$plugin->inError[$theField] = TRUE;
				// get the error description from the Typoscript Template
				$plugin->failureMsg[$theField][] = $plugin->getFailureText($theField, $theCmd , 'evalErrors_onlyDigits');
		}

		// Check if the phonenumber starts with a +
		if(!(substr($phonenr, 0,1)=="+")){
				// theField "telephone" is in error
				$theField = 'telephone';
				$theCmd = 'user_phone_check';

				$plugin->inError[$theField] = TRUE;
				// get the error description from the Typoscript Template
				$plugin->failureMsg[$theField][] = $plugin->getFailureText($theField, $theCmd , 'evalErrors_startsWithPlus');
		}

		// return the field in error
		return $theField;
	}
}

if (defined('TYPO3_MODE') && $GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['ext/sr_feuser_register/hooks/class.tx_srfeuserregister_custevalFunc.php']) {
	include_once($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['ext/sr_feuser_register/hooks/class.tx_srfeuserregister_custevalFunc.php']);
}

?>

-------------------
3.) Im Typoscript bestimmen welches Feld diesen Hook benutzen soll, in meinem Fall "telephone"

plugin.tx_srfeuserregister_pi1.create.evalValues.telephone = atMost[25], uniqueLocal, hook

(atMost[25] für maximal 25 Zeichen, uniqueLocal für die Einzigartikeit, hook um den oben beschriebenen hook zu verwenden)

--------------------
4.) Im Typoscript die Fehlermeldungen ausführen, hier für Deutsch und für meine beiden Fälle (+ und "nur zahlen")

plugin.tx_srfeuserregister_pi1._LOCAL_LANG.de{
 evalErrors_onlyDigits = Die Handynummer darf nur Zahlen enthalten!
   evalErrors_startsWithPlus = Die Handynummer muss mit + beginnen!
}

--------------------
Anmerkungen:
Wenn man weiß wie - wars das auch schon.

Sollten sich Fehler eingeschlichen, oder ihr eine schönere Lösung haben, bin ich immer für Verbesserungsvorschläge dankbar.

Beste Grüße, hoffe es hilft Euch

Flo

patricks ·

Hi Flo,

der Beitrag ist zwar schon etwas her, ich hab aber trotzdem noch ne Frage dazu, vielleicht weißt du das ja auch.
Ich hab ein zusätzliches Feld für eine Seriennummer gemacht, dass ich validiere. KLappt soweit auch alles wunderbar. Nur möchte ich dem Nutzerdatensatz noch weiter Daten mitgeben, die der Nutzer bei der Registrierung nicht eingibt. Genauer gesagt sind das weitere Produktdaten die anhand der Seriennummer aus einer fremden Datenbank gezogen werden. Diese Daten aus der entsprechenden Tabelle ziehen ist auch kein Problem. Wo ich allerdings nicht weiterkomme ist, dass die zusätzlichen Daten im Nutzerdatensatz gespeichert werden.
Hier mal mein Ansatz (in etwas gekürzter Form) wie ich mir das gedacht habe:

//check for existance of serial number
		if(!$serial){
			// theField "tx_myregister_serialno" is in error
			$theField = 'tx_myregister_serialno';
			$theCmd   = 'serial_check';

			$plugin->inError[$theField] = TRUE;
			// get the error description from the Typoscript Template
			$plugin->failureMsg[$theField][] = $plugin->getFailureText($theField, $theCmd , 'evalErrors_wrongSerial');
		} else {
			//insert product data into user database
			$dataArray['tx_myregister_productname']   =  $productdata[0]['product_name'];
			$dataArray['tx_myregister_productcolor']  =  $productdata[0]['product_color'];
		}

das $dataArray wird richtig befüllt, dass hab ich mit firPHP geprüft. Nur in der fe_user Tabelle werden die entsprechenden Felder nicht gespeichert.