Zum Inhalt springen

hooks sr_feuser_register

Erstellt am 14. November 2007 · 6 Antworten · letzte Antwort am 8. Januar 2008

Tags: Frage

nicokaiser ·

Hallo Leute,

ich habe folgendes Problem. Ich habe eine Registrierungsseite, wo ein Promotioncode eingegeben werden kann. Ist der eingegebene Promotioncode mit einem in der Datenbank hinterlegten Code identisch, so wird der Nutzer für eine bestimmte Zeit freigeschaltet. Ist der eingebene Code falsch, so soll dem Nutzer zurück auf die Eingabeseite kommen und Ihm ein Fehler ausgegeben werden.

Folgendes habe ich schon hinbekommen.

function registrationProcess_beforeConfirmCreate(&$recordArray, &$invokingObj) {
		
	if ($invokingObj->feUserData['preview']) {
		
		$sql = 'SELECT COUNT(*) FROM tx_ocpromotion_promocode WHERE promotioncode=\''.$recordArray['tx_ocpromotion_promoid'].'\' AND UNIX_TIMESTAMP()>=starttime AND UNIX_TIMESTAMP()<=endtime';
		$ds = $GLOBALS['TYPO3_DB']->sql_query($sql);
		$ds = $GLOBALS['TYPO3_DB']->sql_fetch_row($ds);
		
		if ($ds[0]==0)	{
			//var_dump("passt nicht");
		} else	{
			//var_dump("passt");	
		};
	}
}

Hiermit greife ich auf einen Hook zu und überprüfe, ob der eingeben Promotioncode korrekt ist. Leider bekomme ich es aber nicht hin, das wenn der Code falsch ist, zurück zur Eingabeseite gesprungen wird und dem Nutzer eine Meldung ausgegeben wird.

Vielleicht könnt Ihr mir ein wenig helfen

Grüße Nico

nicokaiser ·

Hallo Leute,

ich habe das Problem jetzt lösen können.

function registrationProcess_beforeConfirmCreate(&$recordArray, &$invokingObj) {
	$this->pi_loadLL();
	$invokingObj->markerArray['###MESSAGE###'] = '';
	if ($invokingObj->feUserData['preview']==1 && !empty($recordArray['tx_ocpromotion_promoid'])) {
		 $sql = 'SELECT promouseperiodvalue AS value, promouseperiodunit AS unit FROM tx_ocpromotion_promocode WHERE promotioncode=\''.mysql_real_escape_string($recordArray['tx_ocpromotion_promoid']).'\' AND UNIX_TIMESTAMP()>=starttime AND UNIX_TIMESTAMP()<=endtime';
		$ds = $GLOBALS['TYPO3_DB']->sql_query($sql);
		if ($GLOBALS['TYPO3_DB']->sql_num_rows($ds)==0)	{
			if (strlen($invokingObj->failure)>0)	{
				$invokingObj->failure.=',tx_ocpromotion_promoid';
			} else	{
				$invokingObj->failure.='tx_ocpromotion_promoid';
			}
			$invokingObj->previewLabel='';
			$invokingObj->feUserData['preview'] = 0;
			$invokingObj->markerArray['###EVAL_ERROR_FIELD_tx_ocpromotion_promoid###'] = $this->pi_getLL('evalErrors_tx_ocpromotion_promoid');
		} elseif ($GLOBALS['TYPO3_DB']->sql_num_rows($ds)>0) {
			$ds = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($ds);
			$invokingObj->markerArray['###MESSAGE###'] = '<p>'.sprintf($this->pi_getLL('tx_ocpromotion_promocode.message'),($ds['value'].' '.$this->pi_getLL('tx_ocpromotion_promocode.promouseperiodunit.'.($ds['value']>1||$ds['value']<1?'p':'s').'.'.$ds['unit']))).'</p>';
		}
	}
	//echo 'registrationProcess_beforeConfirmCreate';
}

Wenn der eingebene Promotioncode falsch ist, wird wieder zum EingabeFeld gesprungen und ein Fehlercode ausgegeben. Wir kein Promotioncode eingeben, wird die IF-Abfrage nicht durchlaufen.

Grüße Nico

nicokaiser ·

Tach Michael,

die Registrierung war schon lange fertig, nur sollte halt diese Feature noch eingebaut werden. Jetzt käuft bei der Registrierung alles einwandfrei. Wenn der Promocode richtig ist, wird mittels UPDATE des Users in der FE-User eine starttime und eine endtime gesetzt und eine angepasste Mail versendet, bzw dem Nutzer angezeigt, wie lange sein Account funktioniert.

Ich bin jetzt an einem neuen Ding dran, welches einen Bezahlprozess in der Registrierung abbildet.

Grüße Nico

ameisenkiller ·

Hallo nicokaiser,

ich habe ebenfalls vor bei der Registrierung ein Code Feld einzubauen. Hier hat mir das Beispiel deines Hooks schon viel geholfen. Allerdings habe ich immer noch das Problem, dass bei der Eingabe eines falschen Codes nicht auf die Reg.Seite zurück gesprungen wird, sondern direkt weiter zur preview.

Hast du zufällig noch Änderungen außerhalb des Hooks vorgenommen? Ich hoffe du kannst mir hier ein wenig weiterhelfen.

nicokaiser ·

Hallo Ameisenkiller,

das Beispiel was ich angegeben haben, ist für die Sr_feuser_register Version 2.2.5. Für die neuere Version musst du ein bisschen anders arbeiten. Auch müssen in der Sr_feuser einige Fehler beseitigt werden.

Was genau geändert werden muss habe ich in diesem Post geschrieben
#674722

Hier kommt nun ein Codefragment, welches einen Paymentprozess abbildet. Dieses funktioniert aber nur, wenn die Fehler in der sr_feuser_register behoben sind.

Der Abblauf lässt sich wiefolgt beschreiben.
Zuerst werden die Felder gesetzt die benötigt werden. Da Lastschriftverfahren und Kreditkartenzahlung nicht zur gleichen Zeit angezeigt werden können prüft das Programm welche Zahlungsoption ausgewählt ist und setzt dann die entsprechenden Felder als required.(Zeile 12-22)

In Zeile 63-68 pflanze ich der sr_feuserregister mein Template ein. Dynamische Werte in der Zeilen 69-90 in das Template eingebracht. In Zeile 57 pflanze ich mein locallang file in die sr_feuser ein.

Ab Zeile 92 wird dann der wenn eine Validierung nicht positiv ist zum Editscreen gesprungen und die jeweiligen Fehler an den Feldern ausgegeben.

Grüße Nico

function registrationProcess_beforeConfirmCreate(&$recordArray, &$invokingObj) {
		$this->pi_loadLL();
		if ($invokingObj->controlData->getCmd()=='create'){
			$this->config = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['oc_payment']);
			//$this->pi_setPiVarDefaults();
			$invokingObj->marker->markerArray['###TX_OCPAYMENT_POSHERR###']='';
			$invokingObj->marker->markerArray['###TX_OCPAYMENT_RC###']='';
			$this->fieldList = array('payment','ctype','cholder','cnumber','ccheck','cexp','cexpm','cexpy','accountholder','account','bank','bankcode');
			$this->directList = array('accountholder','account','bank','bankcode');
			$this->creditList = array('ctype','cholder','cnumber','ccheck','cexpm','cexpy',);
			
			foreach ($this->fieldList AS $value)	{
				$invokingObj->data->fieldList.=','.$this->prefixId.'_'.$value;
				$invokingObj->pibase->auth->pibase->conf['create.']['fields'].=','.$this->prefixId.'_'.$value;
				$invokingObj->pibase->auth->pibase->conf['invite.']['fields'].=','.$this->prefixId.'_'.$value;
				if ($recordArray['tx_ocpayment_payment']!='direct' && $recordArray['tx_ocpayment_payment']!='credit'){
					array_push($invokingObj->controlData->requiredArray,$this->prefixId.'_'.$value);
					$invokingObj->pibase->auth->pibase->conf['invite.']['required'].=','.$this->prefixId.'_'.$value;
					$invokingObj->pibase->auth->pibase->conf['create.']['required'].=','.$this->prefixId.'_'.$value;
				}
			}
			
			if($invokingObj->data->getFeUserData('submit') || $invokingObj->data->getFeUserData('doNotSave'))	{
				if ($recordArray[$this->prefixId.'_'.'payment']=='direct')	{
					foreach($this->directList AS $value)	{
						if (empty($recordArray[$this->prefixId.'_'.$value]))	{
							$invokingObj->data->failure.=','.$this->prefixId.'_'.$value;
							$invokingObj->data->missing[$this->prefixId.'_'.$value] = true;
							
						}
						$invokingObj->pibase->auth->pibase->conf['create.']['required'].=','.$this->prefixId.'_'.$value;
						array_push($invokingObj->controlData->requiredArray,$this->prefixId.'_'.$value);
					}
					foreach($this->creditList AS $value)	{
						$recordArray[$this->prefixId.'_'.$value] = '';
					}
				} elseif ($recordArray['tx_ocpayment_payment']=='credit')	{
					foreach($this->creditList AS $value)	{
						if (empty($recordArray[$this->prefixId.'_'.$value]))	{
							$invokingObj->data->failure.=','.$this->prefixId.'_'.$value;
							$invokingObj->data->missing[$this->prefixId.'_'.$value] = true;
						}
						array_push($invokingObj->controlData->requiredArray,$this->prefixId.'_'.$value);
						$invokingObj->pibase->auth->pibase->conf['create.']['required'].=','.$this->prefixId.'_'.$value;
					}
					foreach($this->directList AS $value)	{
						$recordArray[$this->prefixId.'_'.$value] = '';
					}
				}
			}
			
			if (substr($invokingObj->data->failure,0,1)==','){
				$invokingObj->data->failure = substr($invokingObj->data->failure,1);
			}
			
			//infiltrade local lang into sr_feuser_regsister lang
			$invokingObj->pibase->LOCAL_LANG = $this->lang_array_merge($invokingObj->pibase->LOCAL_LANG,$this->LOCAL_LANG);
			
			if($invokingObj->data->getFeUserData('submit')&& strlen($invokingObj->data->getFailure())==0)	{
				$this->payvalidate(&$recordArray, &$invokingObj);
			}
			
			if(!$invokingObj->data->getFeUserData('submit') || !$invokingObj->data->getFeUserData('doNotSave'))	{
			//infiltrade local template into sr_feuser_register template and replace ###TX_OCPAYMENT-TEMPLATE###
				$this->templateMain = $this->getTemplate($invokingObj);
				$this->templateMode = $invokingObj->cObj->getSubpart($this->templateMain, 'TEMPLATE_PAYMENT');
				$invokingObj->data->templateCode = str_replace('###TX_OCPAYMENT_TEMPLATE###',$this->templateMode,$invokingObj->data->templateCode);
			}
			$invokingObj->marker->markerArray['###OPTION_TX_OCPAYMENT_PAYMENT###'].='<option value="credit" '.(($recordArray['tx_ocpayment_payment']=='credit'||!isset($recordArray[$this->prefixId.'_'.'payment']))?'selected="selected"':'').'>'.$this->pi_getLL($this->prefixId.'_'.'payment.c').'</option>';
			$invokingObj->marker->markerArray['###OPTION_TX_OCPAYMENT_PAYMENT###'].='<option value="direct" '.($recordArray['tx_ocpayment_payment']=='direct'?'selected="selected"':'').'>'.$this->pi_getLL($this->prefixId.'_'.'payment.d').'</option>';
			
			//fill ctype
			$invokingObj->marker->markerArray['###OPTION_TX_OCPAYMENT_CTYPE###'].='<option value="ae" >'.$this->pi_getLL($this->prefixId.'_'.'ctype.I.ae').'</option>';
			$invokingObj->marker->markerArray['###OPTION_TX_OCPAYMENT_CTYPE###'].='<option value="mc" >'.$this->pi_getLL($this->prefixId.'_'.'ctype.I.mc').'</option>';
			$invokingObj->marker->markerArray['###OPTION_TX_OCPAYMENT_CTYPE###'].='<option value="visa" >'.$this->pi_getLL($this->prefixId.'_'.'ctype.I.visa').'</option>';
			
			//fill marker ###OPTION_TX_OCPAYMENT_CEXPM###
			for ($i = 1; $i<=12;$i++){
				$invokingObj->marker->markerArray['###OPTION_TX_OCPAYMENT_CEXPM###'].= sprintf('<option value="%02d" '.($recordArray[$this->prefixId.'_'.'cecpm']==sprintf('%02d',$i)?'selected="selected"':'').'>%02d</option>',$i,$i);
			}
			
			//fill marker ###OPTION_TX_OCPAYMENT_CEXPY### for the next 8 years
			$date_s = date('y');
			$date_e = $date_s + 8;
			for ($i= $date_s; $i<=$date_e;$i++){
				$invokingObj->marker->markerArray['###OPTION_TX_OCPAYMENT_CEXPY###'].= sprintf('<option value="%02d" '.($recordArray[$this->prefixId.'_'.'cecpy']==sprintf('%02d',$i)?'selected="selected"':'').'>20%02d</option>',$i,$i);
			}
			$invokingObj->marker->markerArray['###TOOLTIP_TX_OCPAYMENT_CEXPM###'] = $this->pi_getLL('tooltip_tx_ocpayment_cexpm');
			$invokingObj->marker->markerArray['###TOOLTIP_TX_OCPAYMENT_CEXPY###'] = $this->pi_getLL('tooltip_tx_ocpayment_cexpy');
			
			//jump to the editmode
			if (strlen($invokingObj->data->getFailure())>0 || $this->error['posherr']!=0 || $this->error['rc']!='000')	{
				$invokingObj->controlData->setMode(null);
				$invokingObj->data->feUserData['preview']= 0;
				$invokingObj->marker->previewLabel='';
				if ($invokingObj->data->failure==',default'){
					$invokingObj->data->failure = str_replace(',default','',$invokingObj->data->failure);
				}
			} elseif ($invokingObj->data->feUserData['preview']==1)	{
				$this->templateMain = $this->getTemplate($invokingObj);
				
				if ($recordArray[$this->prefixId.'_'.'payment']=='credit')	{
					$this->templateMode = $invokingObj->cObj->getSubpart($this->templateMain, 'TEMPLATE_PREVIEW_PAYMENT_CREDIT');
					
				} elseif($recordArray[$this->prefixId.'_'.'payment']=='direct'){
					$this->templateMode = $invokingObj->cObj->getSubpart($this->templateMain, 'TEMPLATE_PREVIEW_PAYMENT_DIRECT');
				}
				$recordArray['tx_ocpayment_ctypes'] = $this->pi_getLL($this->prefixId.'_'.'ctype.I.'.$recordArray[$this->prefixId.'_'.'ctype']);
				$invokingObj->data->templateCode = str_replace('###TX_OCPAYMENT_PREVIEWTEMPLATE###',$this->templateMode,$invokingObj->data->templateCode);
			}
			$invokingObj->marker->markerArray['###FIELD_tx_ocpayment_ctype###'] = $this->pi_getLL($this->prefixId.'_'.'ctype.I.'.$recordArray[$this->prefixId.'_'.'ctype']);
		}
		//print_r( 'registrationProcess_beforeConfirmCreate');
}
ameisenkiller ·

Hallo Nico,

erst einmal "frohes neues Jahr" noch nachträglich.
Nach dem ganzen Stress von Weihnachten und Silvester waren erst einmal ein paar Tage Urlaub fällig. Nun beginnt wieder der alltägliche *typowahnisnn*.

Ich bedanke mich erst mal für das Posting des Code-Schnipsels. Ich werde mich in den nächsten Tagen wieder mit diesem Thema beschäftigen.

Gruß Jens