Verarbeiten von zusätzlichen Form-Feldern in der Registrierung

Hallo an alle :),

nach langem hin und her habe ich mich dann mal entschieden mich hier im Forum anzumelden, da ich ohne Hilfe von ein paar erfahrenen Nutzern wohl nicht in annehmbarem Tempo hier weiterkomme. Ich bin recht neu in der Shopware Entwicklung und bin im Moment noch etwas erschlagen :slight_smile: Die Basis-Tutorials (Slogan of the day, etc.) Habe ich mittlerweile implementiert bekommen. Ich kenne mich zwar ein wenig aus in Webprogrammierung (HTML, PHP, JavaScript, jQuery etc.), aber die ganzen speziellen Frameworks sind für den Quereinsteiger anfangs kein Zuckerschlecken. Nun finde ich mich auch in der Doku noch nicht so gut zurecht und weiss gerade nicht, wie ich im allgemeinen für mein Anliegen vorgehen muss. Aber keine Panik … ich bin beruflich schon Entwickler, nur in einem anderen Bereich. Also keine Angst vor DAU-Fragen, auch wenn ich für euch sicher noch einer bin :stuck_out_tongue: Die Lernkurve ist (hoffe ich) steil.

Ich möchte ein Frontend-Plugin schreiben, dass eine Registrierung am Shop nur dann ermöglicht, wenn in zusätzlichen Feld der Registrier-Form ein entsprechendes Kennwort angegeben wurde. Sollte dieses Kennwort falsch sein, soll der Benutzer nach dem Drücken des Submit-Buttons eine Fehlermeldung hierfür erhalten und wieder auf der Form landen. Die Prüfung des Kennworts soll natürlich PHP seitig erfolgen. Hierzu  habe ich bereits das Register Template mit einem zusätzlichen Feld angereichert:

Das Input-Feld habe ich aus der vorhanden Form kopiert und lediglich ein paar ids angepasst. Mir ist allerdings noch nicht ganz klar, was diese {s name=…} Annotation bewirkt, bzw. wo der Gegenpart dazu liegt. Kann mir jemand hierzu sagen wonach ich suchen muss in der Doku ?

Ergebnis wäre dann schonmal dies hier:

 

Danach habe ich mir den Register Controller einmal angeschaut und die folgende Funktion entdeckt, welche aufgerufen wird nachdem man den Submit Button betätigt.

Meine Vermutung ist, dass ich mich irgendwie vor diese Funktion hängen muss, um meine hinzugefügten Form-Daten zu überprüfen. Aber wie mache ich das ? Und wie erzeuge ich eine Fehlermeldung, die dann angezeigt werden kann?

 

Ich wäre für Tips äußerst dankbar :slight_smile:

 

Viele Grüße,

Andreas

 

PS: Was mich auch interessieren würde, wäre wie ich eigene AJAX-Abfragen zur Vorverifizierung der eingegebenen Daten implementieren kann. =)

Kann mir denn keiner einen Tip geben wie ich das sauber und ordentlich gelöst bekomme? Natürlich könnte ich irgendetwa direkt im Code ändern, aber ich bevorzuge eine saubere durch Plugin getrennte Lösung. Vor allem würde ich gerne vom try and error mal wegkommen, aber dafür bräuchte ich ein paar Fingerzeige in die richtige Richtung von euch. Wäre prima wenn sich jemand angesprochen fühlt und mir netterweise die Richtung zeigen kann. :) 

Hi,

ich stehe vor einem ähnlichen Problem, hast du hier eine Lösung gefunden ? Mir würde auch eine AJAX Verifizierung vor dem Drücken des Submitbuttons reichen

Gruß

Georg

Du könntest dich in deiner Subscriber Klasse an die Funktion saveRegister dranhängen.

/** * Auf events registrieren * 
* @access public 
* @return array 
*/ 
public static function getSubscribedEvents ()
{ 
  return [ 'Enlight_Controller_Action_Frontend_Register_saveRegister' => 'onSaveRegister', // bei saveRegister aufrufen 
];
}

In der onSaveRegister() könntest du folgendes tun:

/** 
* Callback methode 
* 
* @access public 
* @param \Enlight_Event_EventArgs $args 
* @return bool 
*/ 
public function onSaveRegister (\Enlight_Event_EventArgs $args) 
{ 
/** @var \Enlight_Controller_Action $controller */
 $controller = $args -> getSubject(); 
/** @var \Enlight_Controller_Request_Request $request */

 $request = $controller -> Request();
 if ($request -> getActionName() === 'saveRegister') { 
     $data = $request -> getParams(); // Formulardaten 

  // Daten prüfen 
  $error = $this -> check ($data['register']['personal']['registrierpasswort']);
     
     if ($error) { // im Fehlerfall 
       $errors['occurred'] = true; 
       $errors['shipping'] = array( 
        Shopware() -> Snippets() -> getNamespace('frontend/forms/whatever') -> get('FehlermeldungTextbautein'), );

    if ($errors['occurred']) { 
      unset($data['register']['personal']['password']); 
      unset($data['register']['personal']['passwordConfirmation']); 
      unset($data['register']['personal']['emailConfirmation']); 

$controller -> View() -> assign('errors', $errors); 
$controller -> View() -> assign($data); 
$controller -> forward('index', 'register', 'frontend', $controller -> Request() -> getParams()); return true; } } } }

Das müsste fürs erste reichen um eine Fehlermeldung auszugeben. Die check Funktion müsste dann noch implementiert werden