Zusätzliche Validierung für Benutzerdaten

Hi,

ich versuche gerade mein erstes Modul zu erstellen.
Ich muss diverse Eingaben der Benutzerdaten zusätzlich gegen ein System validieren.

Meine Schritte bisher:

  1. Modul angelegt
  2. oxinputvalidator erweitert, zusätzliche Validierungsfunktion hinzugefügt

Nun folgende Fragen:

  1. Wo muss ich die Validierungs triggern, damit in allen Views wo der Kunde seine Daten eingibt (Registrieren, Benutzer bearbeiten, Checkout ohne Account, …?) die zusätzliche Validierung beim Speichern ausgeführt wird
  2. Wo kann ich die clientseitige Validierung erweitern, sodass ich dem Nutzer direkt Feedback geben kann vor dem Absenden?

Ich wäre für Hilfe sehr dankbar, habe leider keine passende Anleitung gefunden.

Ich arbeite mit CE 4.10.5, Flow Theme, falls das wichtig ist.

Danke!

Grüße
Rasioc

1 Like
  1. in den Funktionen, mit den die jeweiligen Daten validiert werden.
    Schau Dir mal die Funktion an, an die die Daten aus dem jeweiligen Formular übermittelt werden. Da drin werden dann die Einzelnen Felder je nach Sinn und Zweck validiert, z.b. Passwort vom der Funktion zum Validieren der Passwörter, etc.
    Hier ist z.B. die Funktion zum Registrieren:
    http://docu.oxid-esales.com/CE/sourcecodedocumentation/4.10.5/oxcmp__user_8php_source.html#l00402

  2. per javascript, aber ich weiß nicht wie gut die Möglichkeiten bei dem verwendeten Script sind.
    jqBootstrapValidation heißt die verwendete Bibliothek

Danke das hat schon mal teilweise geholfen :slight_smile:

Für Server:

  • Überschreiben von oxinputvalidator und neuen Validator hinzufügen
  • Überschreiben von oxuser.checkValues()

class moduleid_oxuser extends moduleId_oxuser_parent {
public function checkValues($sLogin, $sPassword, $sPassword2, $aInvAddress, $aDelAddress) {
parent::checkValues($sLogin, $sPassword, $sPassword2, $aInvAddress, $aDelAddress);

    /** @var oxInputValidator $oInputValidator */
    $oInputValidator = oxRegistry::get('oxInputValidator');
    $oInputValidator->customValidator(this, $aInvAddress);
	

    // throwing first validation error
    if ($oError = $oInputValidator->getFirstValidationError()) {
        throw $oError;
    }

}
}

Problem:
Sende ich das Formular z.b. auf der Seite ab wo man seine Rechnungsdaten ändern kann unter Mein Konto, kann man das Formular abschicken, und es geht aus dem Edit modus über in den Vorschau modus. Dort ist kein Fehler zu sehen. wechselt man aber nun in edit mode sieht man meine Fehlermeldung.
Schätze dazu brauche ich also noch die JS Validierung. Und da hänge ich noch ein wenig :confused: Hat das schon mal jemand erweitert?

Ok ich glaube ich komme der Clientgeschichte näher. Ich müsste nur wissen wie ich Custom JS in die user_billing.tpl reinbekomme von einem Modul aus? Ich werd leider aus der Module erstellen Doku nicht ganz schlau.

Nachdem ich den Quellcode von jqBootstrapValidation studiert habe, denke ich, dass man über $.jqBootstrapValidation(“override”,{validatorTypes:{custom:…}}) eigene Validatoren einfügen können müsste.

edit: ok gefunden wie ich das JS einbinde. Ich versuch mal eine Lösung zum laufen zu bekomme und poste sie dann hier.

Ok ich hab nun eine Lösung fr die clientseitige JS Validierung gefunden, ich poste sie mal falls sie jemand braucht:
Teil von metadata.php


'extend'        => array(
      'oxinputvalidator' => 'xx/xx_oxinputvalidator',
      'oxuser' => 'xx/xx_oxuser'
    ),  
    'blocks' => array(
        array( 
		'template' => 'layout/base.tpl', 
		'block' => 'base_js', 
		'file' => 'base_js' 
		)
    )

xx/out/blocks/base_js.tpl: JS und übersetzung einbinden, man muss sicherstellen dass sie vor dem jqBootstrapValidation Init call im DOM auftaucht, was so bei mir der Fall war.


[{$smarty.block.parent}]
<script>
    var xx= xx|| [];
    xx.i18n =
        {
            XX_VALIDATION_ERROR:     '[{oxmultilang ident="XX_VALIDATION_ERROR"}]'
        };
</script>
[{oxscript include=$oViewConf->getModuleUrl('xx','out/js/xx.js') priority=10}]


(function($) {	
	$.jqBootstrapValidation("override", {
		validatorTypes: {
		  xx: {
			name: "xx",
			init:function($this, name) {
				return {
					some:'data'
				};
			},
			validate: function($this, value, validator) {
				//do magic
                                var invalid = true;
                                return invalid;
			}
		  }
		}
	});
	
	$('[name*="oxuser__oxbirthdate]"').data('validationXxXx', 'someData'); // example for birthday field (make sure to double the validator Name in the data attribute Name with camelcase)
	$('[name*="oxuser__oxbirthdate]"').data('validationXxMessage', xx.i18n.XX_VALIDATION_ERROR);
})(jQuery);

Auch wenn es so aussieht werden damit die original-Validatoren nicht überschrieben, sondern ergänzt.

1 Like