Problembeschreibung / Zielsetzung

Eigentlich recht flexibel ist die Möglichkeit benutzerdefinierte Felder für die Benutzerregistrierung in VirtueMart 1.x einzurichten. Unter anderem können auch Felder als sogenannte Mutlicheckbox-Gruppen angelegt werden, d.h. Eine Gruppe von Checkboxen, die intern als Information in einem gemeinsamen DB-Tabellenfeld geschrieben und verwaltet werden. Eine kleine Sache, die hierbei allerdings von den Entwicklern nicht vorgesehen wurde, ist die Möglichkeit ggf. einzelne Felder davon schon beim Aufruf des Registrierungsformulars als gesetzt vorauszufüllen.

Mit nachfolgendem Workaround soll dieses umgesetzt werden, wobei hier keine dynamisch/flexible Lösung geboten wird, sondern nur ein schnell intergrierte Lösung an einem ganz konkreten Fall - also hart kodiert.

 



 

Umsetzung im Detail

Verantwortlich für die Ausgabe der Felder für die Benutzerregistrierung ist das Class-Script classes/ps_userfield.php. Hier werden alle Felder nach Typ und Spezialfelder nach Name durchlaufen um so das Formular aufzubauen. Dabei gibt es im switch-Block auch ein Weiche für den Typ mutlichekbox. Hier greifen wir in das Script ein.

Die Ausgabe der Checkbox-Gruppe erfolgt durch die Methode checkboxListTable() der Klasse vmCommonHTML. Hier wird u.a. als 6. Parameter ein Array erwartet, welches festlegt welche der Checkboxen in der Gruppe als selectiert anzuzeigen sind. Hierfür verwendet das Script die Variable $k. Im Fall der Neuregistrierung (page=checkout.index) ist das Array $k leer. Bei einer späteren Änderung seiner Benutzerdaten durch den Kunden (page=account.billing) kann dieses Array natürlich gefüllt sein.

Im Prinzip wollen wir nun erreichen dass bei einer Neuregisteriung (checkout.index) das Array $k gefüllt ist, mit den Werten für die in der Checkboxgruppe einzelne Checkboxen selektiert sein sollen. Es kann also auch nur eine Auswahl sein.

Am konkreten Beispiel: In der Registerierung soll auch gleich die Abfrage erfolgen, wie oft und in welcher Form ein Kunde mit Newslettern/Produktinfos versorgt werden möchte. Er hat die Möglichkeit sich zu entscheiden für den jählichen Katalog entweder in gedruckter Form oder als PDF und drittens für den regelmäßigen Mail-Newsletter. Der gedruckte Katalog und der Mail-Newsletter sollen vorausgewählt aufgerufen werden.

Wir suchen uns im o.g. Script ps_userfield.php den Switch-Fall "multicheckbox" und fügen dort folgendes ein:

 

// Begin of a fallthrough
case 'multicheckbox':
case 'select':
case 'multiselect':
case 'radio':
  $k = $db->f($field->name);
...
    if($field->type=='multicheckbox') {
      // vorselektierte Checkboxfelder
      if ($field->name == 'vm_produktinfos' && $page == 'checkout.index') { 
        $k[0]->fieldvalue = 'katalog_per_post';
        $k[1]->fieldvalue = 'produktinfos_email';
#	echo $page."<pre>".print_r($k,true)."</pre>";
      }
      // Ende der Einfügung
      $rowFieldValues['lst_'.$field->name] = vmCommonHTML::checkboxListTable( $Values, $field->name."[]", 
        'class="inputbox" size="'.$field->size.'" '.$multi,
        'fieldvalue', 'fieldtitle', $k, $field->cols, $field->rows, $field->size, $field->required);
    } else {
      $rowFieldValues['lst_'.$field->name] = vmCommonHTML::selectList( $Values, $field->name."[]", 
        'class="inputbox" size="'.$field->size.'" '.$multi, 
        'fieldvalue', 'fieldtitle', $k);
    }
  }
}
...

 

 

Kurz kommentiert: Über die IF-Abfrage stellen wie zum einen sicher, dass nur für diese eine Checkboxgruppe vm_produktinfos die Vorbelegung stattfinden soll und zum anderen nur für den Fall der Registrierung beim Checkout. Das zweite ist wichtig, weil nämlich das gleiche Script auch verwendet wird beim Ändern der Benutzerdaten und hier schon Checkboxen vorausgewählt sein könnten, die wir mit unserer Einfügung nicht überschreiben wollen!
Dann bauen wie unser Array $k auf. Dabei werden einfach nur hintereinander weg die Checkbox-Values übergeben, die ausgewählt sein sollen, namentlich so, wie diese beim Anlegen der Checkboxen in der VM-Nutzerfelderverwaltung angelegt wurden.

Das wars dann auch schon.
Wer weitere Checkbox-Gruppen vorbelegen will, könnte das IF durch ein Switch-Case-Konstrukt nach $field->name ersetzen.