ja, also ich bin da soweit.
Um nochmal zu sagen, was ich eigentlich wollte: es sollen alle bisherigen Funktionalitäten beibehalten werden und ich möchte zusätzlich, daß ich aus einer anderen Datenbank in ein select-Feld Daten einlese, z.B. sollen aus einer Datenbank xy Ländernamen eingelesen werden, die dann in der select-Box im Frontend zur Auswahl stehen, ohne daß ich sie explizit alle einzeln als option im Formularentwurf eintragen muß.
Dazu hab ich jetzt folgendes gemacht:
1. am Anfang des Output eine neue Klasse definiert für meine externe DB (kann man sich sparen, wenn die Tabellen mit in der Contenido-DB liegen):
Code: Alles auswählen
class DB_mydb extends DB_Sql {
var $classname = "DB_mydb";
var $Host ;
var $Database ;
var $User ;
var $Password ;
function DB_mydb(){
$this->Host = $GLOBALS['My_Host'];
$this->Database = $GLOBALS['My_Database'];
$this->User = $GLOBALS['My_User'];
$this->Password = $GLOBALS['My_Password'];
}
}
Die Zugangsdaten für diese DB (also die Variablen My_Host ... usw.) habe ich mit genau diesen Bezeichnungen mit in der config.php untergebracht. Vielleicht geht dieser Part auch einfacher ... keine Ahnung.
Eine Instanz der Klasse erzeuge ich dann im Output im Konstruktor, der vorher leer war und jetzt so aussieht:
Die Variable q für die neue Instanz muß ich noch mit in der class w3form unterbringen:
Code: Alles auswählen
class w3form {
var $email, $aufgedroeselt, $form, $formularFeld, $q;
Nun kann ich mir für jede select-Box, die ich mit Daten füllen aus dieser DB ein neues Konstrukt in der Funktion
function formularFeld($attribute,$sent) als zusätzlichen case anlegen (z.B. direkt über
case 'checkbox':
Code: Alles auswählen
case 'CountrySelect':
$query = "select CountryId, CountryName from country ";
$this->q->query($query);
echo "<select $parameter $style>";
echo '<option value="0">Bitte auswählen</option>';
while($this->q->next_record()) {
if($this->q->f("CountryId") == (int) $_POST["{$attribute['name']}"]) $sel=" selected "; else $sel="";
echo "<option $sel value='".$this->q->f("CountryId")."'>".$this->q->f("CountryName")."</option>\n";
}
echo "</select>";
break;
wobei der Name hinter dem case völlig frei ist, nur kann ich (oder besser der Redakteur) diesen dann im Formularentwurf genauso als Typ nutzen, wie alle anderen bereits vorhandenen Typen, z.B. so:
Code: Alles auswählen
###name:Land; type:CountrySelect; valid:integer; size:1; minvalue:1; ###
somit bleiben alle bisherigen Funktionalitäten erhalten, es funktioniert auch die Validierung (hier habe ich ein
'Bitte auswählen' mit dem value=0 als erstes eingefügt und geprüft wird auf integer mit größer 0).
Allerdings habe ich festgestellt (vielleicht habe ich auch eine veraltete Version?), daß die Prüfung auf integer nicht funzt, wenn ich einen Wert 0 verwende, wie im Beispiel. Das liegt an folgender Stelle im Output:
Code: Alles auswählen
function formularFeldKorrekt(&$feld) {
// prüfung, ob pflichtfeld vorhanden
if (!empty($feld['mandatory']) && $feld['mandatory'] == 'true' && empty($_POST["{$feld['name']}"])) return false;
// wenn das formularfeld kein pflichtfeld und nicht vorhanden ist, true zurück geben
if (empty($_POST["{$feld['name']}"])) return true;
empty ist nicht nur bei leerer Zeichenkette true sondern auch bei 0, Null oder nicht vorhandener Variable. Deshalb fliegt man vorzeitig aus der Prüfroutine raus und auch die Geschichte mit mandatory funzt nicht in jedem Falle. Besser wäre:
Code: Alles auswählen
function formularFeldKorrekt(&$feld) {
// prüfung, ob pflichtfeld vorhanden
if (!empty($feld['mandatory']) && $feld['mandatory'] == 'true' && $_POST["{$feld['name']}"]=="") return false;
// wenn das formularfeld kein pflichtfeld und nicht vorhanden ist, true zurück geben
if (!isset($_POST["{$feld['name']}"])) return true;
So funktionieren jetzt jedenfalls alle Prüfungen bei mir.
FranzK.
PS.: ich wiil keine Mail verschicken mit dem Formular sondern die Werte in einer DB speichern, aber darüber wurde ja früher schon mal gesprochen.