Zum Inhalt springen

Formular mit dynamischen Elementen

Erstellt am 29. Januar 2004 · 7 Antworten · letzte Antwort am 22. Juni 2004

Tags: Frage

Fant ·

grüezi

Ich möchte ein Formular generieren, dass eine Auswahlliste enthält.
Der Inhalt der Liste soll sich nun aus den Titeln der Pages an einer bestimmten stelle im Pagetree ergeben.
Wie kann man sowas realisieren?

also ich habe folgende seiten:

meeting A
meeting B
meeting C
meeting D

Auf der Anmeldeseite soll man nun auswählen können, zu welchem Meeting man sich anmelden will.
da diese ständig ändern, wäre es schön wenn sich diese Liste automatisch anpasst.

Eine alternative wäre den Titel der Seite über die URL weiterzugeben und im Formular einzufügen,
also ohne auswahl, aber zB als hidden Field, damit es im Mail sichtbar wird.

wäre froh um Hilfe
Danke

gruss
Fant

mexx ·

hallo
würde mich auch interessieren. gibt es da schon eine lösung. ich würde eben das ganze mit einer select box angehen, weiss allerdings nicht genau wie ich das bei installiertem css styled content realisieren soll??
gruss stefan

c4x ·

Hallo, bin gerade dabei soetwas ähnliches zu machen.

Bis jetzt habe ich ein PHP Script geschrieben das einfach die pages Table ausliest und Einträge mit einer bestimmten PID selektiert - d.h. in meinem Fall alle Einträge der "Produkte" Seite. Das ganze wird dann noch nach Unterseiten gruppiert...

Aus den Titeln werden dann Checkboxen-Gruppen generiert.

Wenn man nun einen Link auf das Anfragefomular von einer der Produktseiten setzt wird auch gleich die Checkbox ausgewählt von der man kommt.

Funktioniert soweit ganz gut... mein einziges Problem ist nun das versenden der Mail. Das T3-Intere Mailform zickt etwas rum wenn man es selbst gestaltet.

Werd jetzt vermutlich dann halt die Mail auch über ein eigenes PHP Script verschicken müssen.

Wenns fertig ist kann ich die Script Schnipsel bei Interesse gern posten... 🙂

Gruß,

Mathias

coolcactus ·

Ja, ich hätte durchaus Interesse daran. Versuche gerade - mit bescheidenem Erfolg - etwas ähnliches zu basteln. Könntest du das Ergebnis vielleicht hier posten oder mir zukommen lassen?

c4x ·

Hoi,

das Ganze ist soweit fertig und funktioniert bei mir sehr gut, ist halt alles noch relativ ungetestet und nicht gerade vorbildlich programmiert. Ich denke man könnte das alles schön in eine Erweitung packen. 🙂

Kurz zur Funktionsweise des Scripts:
Es werden alle Titel der Unterseiten zur angegebenen PID ausgelesen und als `Gruppentitel verwendet`.

Für jede `Gruppe` werden dann wieder jeweils die Titel der Unterseiten ausgelesen und als Checkbox im Formular ausgegeben.

Das Formular kann auch direkt per Link index.php?id=xxx&produktpid=56 aufegrufen werden, wobei die übergebene produktpid gleich vorselektiert wird.

Das Script ist derzeit auf www.j-m.de im Einsatz, klickt man im Bereich Produkte in einer der Unterseiten inder Anfragebox auf `anfordern` wird das Anfrageformular aufgerufen.

Zunächst muss ins Setupfeld des `obersten` / Haupttemplate folgender Code:

### Scripts für  Seiteninhalte [06/04 - mr <post@mrup.de>] ###
tt_content.script >
tt_content.script = CASE
tt_content.script {
    key.field = select_key

    anfrageformular = PHP_SCRIPT
    anfrageformular.file = fileadmin/templates/anfrageformular.php

    formproc = PHP_SCRIPT
    formproc.file = fileadmin/templates/formproc.php

}

Dann läd man die 2 PHP Dateien in die angegebenen Verzeichnisse hoch (bei mir fileadmin/templates/)
anfrageformular.php:

<?php
//[06/04 - mr <post@mrup.de>] 

if (is_object($this))   {

    //Aufrufparameter
    $produktpid = $GLOBALS["HTTP_GET_VARS"]["produktpid"];
    
    //Einstellungen des Scripts
    $parameter = $this->processParams($this->data["bodytext"]);
    $pid      = !isset($parameter['pid']) ? 0 : $parameter['pid']; //PID der 'Oberkategorie'
    $ziel     = !isset($parameter['ziel']) ? 'index.php?danke' : $parameter['ziel']; //Link zum Formproc/Danke Seite
    $lang_uid = !isset($parameter['sprache_uid']) ? 0 : $parameter['sprache_uid']; //Sprach ID


    //Interne Vars  
    $options = array();
    $ftl = array();
    $sql_lang = "";
    $sql_join = "";
    $sql_titletable = 'pages';


    //Wenn eine andere Sprache ausgewählt wurde - pages-Tabelle mit overlay-Tabelle verbinden und jeweilige Übersetzung selektieren
    if(!empty($lang_uid)){
        $sql_join = ", `pages_language_overlay`";
        $sql_titletable = 'pages_language_overlay';
        $sql_lang = "AND `pages`.`uid`=`pages_language_overlay`.`pid` AND `pages_language_overlay`.`sys_language_uid`=" . $lang_uid;
    }


    //Übersetzung
    switch($lang_uid){
        case 0: 
                    $ftl['interesse'] = 'Ich Interessiere mich f&uuml;r:';
                    $ftl['sonstiges'] = 'Sonstiges:';
                    $ftl['name'] = 'Name:';
                    $ftl['strasse'] = 'Stra&szlig;e / Nr.:';
                    $ftl['ort'] = 'PLZ / Ort:';
                    $ftl['email'] = 'eMail:';
                    $ftl['tel'] = 'Tel.:';
                    $ftl['fax'] = 'Fax:';
                    $ftl['kommentar'] = 'Kommentar:';
                    $ftl['senden'] = '<input type="image" src="fileadmin/templates/images/senden_de.gif" width="45" height="10" border="0" alt="senden">';
                    $ftl['req'] = 'Bitte füllen Sie alle Fett markierten Felder aus.';
                    break;

        case 3:
                    $ftl['interesse'] = 'I'm interested in:';
                    $ftl['sonstiges'] = 'Other:';
                    $ftl['name'] = 'Name:';
                    $ftl['strasse'] = 'Street / No:';
                    $ftl['ort'] = 'ZIP / Town:';
                    $ftl['email'] = 'eMail:';
                    $ftl['tel'] = 'Phone:';
                    $ftl['fax'] = 'Fax:';                    
                    $ftl['kommentar'] = 'Comment:';
                    $ftl['senden'] = '<input type="image" src="fileadmin/templates/images/senden_en.gif" width="45" height="10" border="0" alt="senden">';
                    $ftl['req'] = 'Please fill in all required fields.';
                    break;
        
    }


    //Fomular Kopf
    $content .= '    <form action="'.$ziel.'" enctype="multipart/form-data" method="POST" name="anfrage" onSubmit="if(document.forms['anfrage'].f_name.value != '' && document.forms['anfrage'].f_email.value != '') {return true;} else {alert(''.$ftl['req'].''); return false;}"><p>'.$ftl['interesse'].'</p><br>'."
";  

    
    //Titel auslesen
    $query = mysql_query("SELECT `pages`.`uid`, `$sql_titletable`.`title` FROM `pages` $sql_join WHERE `pages`.`pid`=$pid AND `pages`.`hidden`<>1 AND `pages`.`deleted`<>1 $sql_lang ORDER by `pages`.`sorting`");
    if($query && mysql_num_rows($query)){
        while($data = mysql_fetch_array($query)){
            $uid = $data['uid'];
            $title = $data['title'];            
            $options[$uid]['title'] = $title;
            
            //Untertitel
            $options_query = mysql_query("SELECT `pages`.`uid`, `$sql_titletable`.`title` FROM `pages` $sql_join WHERE `pages`.`pid`=$uid AND `pages`.`hidden`<>1 AND `pages`.`deleted`<>1 $sql_lang ORDER by `pages`.`sorting`");          
            if($options_query && mysql_num_rows($options_query)){
                while($options_data = mysql_fetch_array($options_query)){
                    $options_uid = $options_data['uid'];
                    $options[$uid]['options'][$options_uid] = $options_data['title'];
                }
            }else{
                echo mysql_error();
            }
        }       
    }else{
        echo mysql_error();
    }


    //Wurden überhaupt Punkte gefunden?
    if(count($options) > 0){

        //Array für 2 Spalten aufteilen    
        $options = array_chunk($options, round(count($options)/2), TRUE);
    
    
        //Content mit den Optionsfeldern füllen
        $content .= '      <table width="100%" border="0" cellspacing="0" cellpadding="0">'."
";
    
    
        $content .= '        <tr valign="top">'."
";
        $content .= '          <td width="50%"><p>'."
";
        
        //Spalte Links    
        if(is_array($options[0]) && count($options[0]) > 0)
        foreach($options[0] as $key => $val){
            $content .= '            <span class="headlinebox">'.$val['title'].'</span><br>'."
";
            if(is_array($val['options']) && count($val['options']) > 0)
            foreach($val['options'] as $options_key => $options_val){
                $checked = $options_key == $produktpid ? ' checked' : '';
                $content .= '            &nbsp;&nbsp;<input type="checkbox" name="f_interesse[]" value="'.htmlentities($options_val).'"'.$checked.'>&nbsp;'.$options_val.'<br>'."
";        
            }
            $content .= '              <br>'."
";
        }
            
        $content .= '            </p>'."
";
        $content .= '          </td>'."
";
        $content .= '          <td width="50%"><p>'."
";
    
        //Spalte Rechts
        if(is_array($options[1]) && count($options[1]) > 0)
        foreach($options[1] as $key => $val){
            $content .= '            <span class="headlinebox">'.$val['title'].'</span><br>'."
";
            if(is_array($val['options']) && count($val['options']) > 0)
            foreach($val['options'] as $options_key => $options_val){
                $checked = $options_key == $produktpid ? ' checked' : '';
                $content .= '            &nbsp;&nbsp;<input type="checkbox" name="f_interesse[]" value="'.$options_val.'"'.$checked.'>&nbsp;'.$options_val.'<br>'."
";        
            }
            $content .= '              <br>'."
";
        }
    
        //Eingabefeld Sonstiges
        $content .= '            </p>'."
";
        $content .= '              <span class="headlinebox">'.$ftl['sonstiges'].'</span><br>'."
";
        $content .= '              <input type="text" name="f_sonstiges" size="20" value="">'."
";        
        $content .= '          </td>'."
";
        $content .= '        </tr>'."
";
        
            
        $content .= '      </table>'."
";
        $content .= '      <br>'."
";
        
    }
    
    //Formularcode aus T3
    $content .= '      <table border=0 cellspacing=0 cellpadding=2>'."
";
    $content .= '        <tr>'."
";
    $content .= '          <td align=right><span class=mailformrequired>'.$ftl['name'].'</span></td>'."
";
    $content .= '          <td><img src="clear.gif" width=5></td>'."
";
    $content .= '          <td><input type="text" name="f_name" size="40" value=""></td>'."
";
    $content .= '        </tr>'."
";
    $content .= '        <tr>'."
";
    $content .= '          <td align=right><span class=mailform>'.$ftl['strasse'].'</span></td>'."
";
    $content .= '          <td><img src="clear.gif" width=5></td>'."
";
    $content .= '          <td><input type="text" name="f_strasse" size="40" value=""></td>'."
";
    $content .= '        </tr>'."
";
    $content .= '        <tr>'."
";
    $content .= '          <td align=right><span class=mailform>'.$ftl['ort'].'</span></td>'."
";
    $content .= '          <td><img src="clear.gif" width=5></td>'."
";
    $content .= '          <td><input type="text" name="f_ort" size="40" value=""></td>'."
";
    $content .= '        </tr>'."
";
    $content .= '        <tr>'."
";
    $content .= '          <td colspan=3><span class=mailformcomment>&nbsp;&nbsp;</span></td>'."
";
    $content .= '        </tr>'."
";
    $content .= '        <tr>'."
";
    $content .= '          <td align=right><span class=mailform>'.$ftl['tel'].'</span></td>'."
";
    $content .= '          <td><img src="clear.gif" width=5></td>'."
";
    $content .= '          <td><input type="text" name="f_tel" size="40" value=""></td>'."
";
    $content .= '        </tr>'."
";
    $content .= '        <tr>'."
";
    $content .= '          <td align=right><span class=mailform>'.$ftl['fax'].'</span></td>'."
";
    $content .= '          <td><img src="clear.gif" width=5></td>'."
";
    $content .= '          <td><input type="text" name="f_fax" size="40" value=""></td>'."
";
    $content .= '        </tr>'."
";    
    $content .= '        <tr>'."
";
    $content .= '          <td align=right><span class=mailformrequired>'.$ftl['email'].'</span></td>'."
";
    $content .= '          <td><img src="clear.gif" width=5></td>'."
";
    $content .= '          <td><input type="text" name="f_email" size="40" value=""></td>'."
";
    $content .= '        </tr>'."
";
    $content .= '        <tr>'."
";
    $content .= '          <td colspan=3><span class=mailformcomment>&nbsp;&nbsp;</span></td>'."
";
    $content .= '        </tr>'."
";
    $content .= '        <tr>'."
";
    $content .= '          <td align=right valign="top"><span class=mailform>'.$ftl['kommentar'].'</span></td>'."
";
    $content .= '          <td><img src="clear.gif" width=5></td><td><textarea name="f_kommentar" cols="40" rows="6" wrap="VIRTUAL"></textarea></td>'."
";
    $content .= '        </tr>'."
";
    $content .= '        <tr>'."
";
    $content .= '          <td colspan=3><span class=mailformcomment>&nbsp;&nbsp;</span></td>'."
";
    $content .= '        </tr>'."
";
    $content .= '        <tr>'."
";
    $content .= '          <td colspan=3><span class=mailformcomment><p align="right">'.$ftl['senden'].'</p></span></td>'."
";
    $content .= '        </tr>'."
";
    $content .= '      </table>'."
";
    $content .= '    </form><br>'."
";

} else {
    die ("This script must be included by TypoScript");
}

und formproc.php

<?php
//[06/04 - mr <post@mrup.de>] 


if (is_object($this))	{
 
    //Übergebene Parameter durch das Script Inhaltselement
	$parameter = $this->processParams($this->data["bodytext"]);    
    
    $empfaenger         = $parameter['empfaenger'];
    $betreff            = $parameter['betreff'];
    $tmpl_email         = $parameter['tmpl_email'];
    $tmpl_danke         = $parameter['tmpl_danke'];
    
    $formcontent        = array();
    
    //Verschiedene Tests
    if(empty($empfaenger)){
        echo "Empfänger nicht angegeben.";
        exit;
    }

    if(empty($betreff)){
        echo "Betreff nicht angegeben.";
        exit;
    }    
    
    //Templates öffnen
    if(is_file($tmpl_email)){
        $file_email = implode('', file($tmpl_email));
    }else{
        echo "eMail Template nicht gefunden.";
        exit;
    }

    if(is_file($tmpl_danke)){
        $file_danke = implode('', file($tmpl_danke));
    }else{
        echo "Danke Template nicht gefunden.";
        exit;
    }
    
    //Forminhalte auslesen    
    foreach($GLOBALS['HTTP_POST_VARS'] as $key => $val){
        if(substr($key, 0, 2) == 'f_'){
            if(is_array($val)){
                $val = implode(', ', $val);                
            }
            
            $formcontent[$key] = $val;
            
            //Inhalte einfügen
            $file_email = str_replace("{".$key."}", $val, $file_email);
            $file_danke = str_replace("{".$key."}", $val, $file_danke);            
        }
    }
    //Restliche Platzhalter entfernen
    $file_email = preg_replace('/{[^}]+}/i','',$file_email);
    $file_danke = preg_replace('/{[^}]+}/i','',$file_danke);
    
    //eMail versenden
    mail($empfaenger, $betreff, $file_email, "From: ". (!empty($formcontent['f_email']) ? $formcontent['f_email'] : 'formprocessor@bluebox-productions.com') ."
");
    
    //Danke Seite ausgeben
    $content .= $file_danke;

    
    
    
} else {
	die ("This script must be included by TypoScript");
}

Nun erstellt man eine beliebige Seite, nennen wir sie mal "Kontakt", erstellen ein Inhaltselement des Typs `Script`, vergeben einen Titel, und schreiben `anfrageformular` in das Feld `CODE`.

Als Parameter können wir nun folgendes eingeben:

pid = 3
ziel = index.php?danke
sprache_uid = 0

PID 3 ist bei mir die Seite `Produkte`, deren Unterseiten Titel dann ausgelesen und als Gruppen für deren Unterseiten die dann als Checkboxen aufgelistet werden.

Als Ziel kann man natürlich auch index.php?id=xxx für die `Danke` Seite definieren.

Diese Seite definiert man am Besten als Unterseite der Anfrage Seite und wählt als Seitentyp `Nicht im Menü`. Auch diese muss nun ein Scriptelement enthalten mit dem Wert `formproc` im CODE Feld.

Folgendes noch ins Parameterfeld:

empfaenger = info@example.com
betreff = Anfrage aus www.example.com
tmpl_email = fileadmin/templates/formulare/anfrage_email.txt
tmpl_danke = fileadmin/templates/formulare/anfrage_danke_de.html

Und nun noch folgende 2 Templates einfach als Datei anlegen und in die entsprechenden Verzeichnisse (bei mir fileadmin/templates/formulare/ hochladen:

anfrage_email.txt

Folgende Nachricht wurde Ihnen aus Ihrer Website www.example.com übermittelt:


Ich interessiere mich für
{f_interesse}
{f_sonstiges}


Name.......................: {f_name}
Strasse....................: {f_strasse}
PLZ / Ort..................: {f_ort}

eMail Adresse..............: {f_email}
Telefon....................: {f_tel}
Fax........................: {f_fax}

Kommentar..................: {f_kommentar}

und anfrage_danke_de.html

<br><br>
<p>Ich Interessiere mich f&uuml;r<br>
{f_interesse}
{f_sonstiges}
</p>
<br><br>
<table border=0 cellspacing=0 cellpadding=2>
  <tr>
    <td align=right><span class=mailformrequired>Vor-/Nachname:</span></td>
    <td><img src="clear.gif" width=5></td>
    <td><p>{f_name}</p></td>
  </tr>
  <tr>
    <td align=right><span class=mailform>Straße:</span></td>
    <td><img src="clear.gif" width=5></td>
    <td><p>{f_strasse}</p></td>
  </tr>
  <tr>
    <td align=right><span class=mailform>PLZ / Ort:</span></td>
    <td><img src="clear.gif" width=5></td>
    <td><p>{f_ort}</p></td>
  </tr>
  <tr>
    <td colspan=3><span class=mailformcomment>&nbsp;&nbsp;</span></td>
  </tr>
  <tr>
    <td align=right><span class=mailform>Tel.:</span></td>
    <td><img src="clear.gif" width=5></td>
    <td><p>{f_tel}</p></td>
  </tr>
  <tr>
    <td align=right><span class=mailform>Fax:</span></td>
    <td><img src="clear.gif" width=5></td>
    <td><p>{f_fax}</p></td>
  </tr>  
  <tr>
    <td align=right><span class=mailformrequired>eMail:</span></td>
    <td><img src="clear.gif" width=5></td>
    <td><p>{f_email}</p></td>
  </tr>
  <tr>
    <td colspan=3><span class=mailformcomment>&nbsp;&nbsp;</span></td>
  </tr>
  <tr> 
    <td align=right valign="top"><span class=mailform>Kommentar:</span></td>
    <td><img src="clear.gif" width=5></td>
    <td><p>{f_kommentar}</p></td>
  </tr>
</table>

Das Script ist auf zwei Sprachen ausgelegt, kann aber einfach erweitert werden.

Ich hoffe geholfen zu haben 😃

coolcactus ·

Also, Skript und Step-by-step-Anleitung klingen sehr vielversprechend, vielen Dank erstmal! Hatte zwar gehofft, es über das interne Mailformular oder mailformplus lösen zu können, aber das scheint wohl nicht zu gehen. Habe mich also an die Umsetzung gemacht, bin aber leider auf erste Probleme gestossen:

Ich benutze "CSS Styled Content" und habe deshalb anscheinend das Content Element "Script" nicht zur Verfügung. Also habe ich die Extension "Page PHP Content" installiert, die es ebenfalls erlaubt, PHP Code einzubinden. Bin ansonsten wie beschrieben vorgegangen und habe den kompletten PHP Code eben in das beim Inhaltstyp "PHP Skript" zur Verfügung stehende Feld "PHP Code (direkt, Beispiel: <?php phpinfo(); ?>)" geschrieben. (Als letzte Zeile habe ich bei beiden PHPs noch "?>" hinzugefügt, da das wohl fehlte...?!)

Jetzt bekomme ich als Fehlermeldung leider

Fatal error: Call to undefined function: processparams() in /homepages/XX/XXXX/htdocs/XXXXX/typo3_src-3.6.0/typo3/ext/page_php_content/pi1/class.tx_pagephpcontent_pi1.php(55) : eval()'d code on line 10"

Irgendeine Idee, woran das liegen könnte?

c4x ·

Hmm, nein, keine Ahnung, ich denke net das sich das so einfach portieren lässt da evtl andere Variabeln zu Verfügung stehen?

Kannst nur versuchen das Ganze anzupassen. Hab im Moment leider keine Zeit dazu, aber falls du interesse hast kann ich das vll mal in Angriff nehmen, oder ne Extension draus machen.

Ich benutze bis jetzt nur content und cSet stylesheet.

Das abschließende PHP Tag ?> fehlt übrigens nicht sondern gehört da einfach net hin wenn keine Ausgabe mehr kommt 🙂

Gruß, Mathias