Ergebnis 1 bis 10 von 10

Thema: Einem versteckten Formularfeld einen Wert aus einer DB-Tabelle als "Value" übergeben

  1. #1
    Contao-Nutzer
    Registriert seit
    31.07.2016.
    Beiträge
    6

    Standard Einem versteckten Formularfeld einen Wert aus einer DB-Tabelle als "Value" übergeben

    Hallo zusammen,

    ich entwickle gerade eine Seminaranmeldung als Extension für Contao. Zu einer bestimmten Kategorie wie z.B. "Prüfungsvorbereitung" werden dann alle Seminare auf der jeweiligen Seite aufgelistet, die angeboten werden.
    Hier soll es dem Nutzer nun ermöglicht werden, sich über ein Formular für das jeweilige Seminar das er ausgewählt hat, anzumelden. Folgende Grafik soll die Funktion darstellen:

    sem.jpg

    Zur Erzeugung dieses Ansicht nutze ich folgendes Template:

    HTML-Code:
    <?php foreach ($this->seminare as $seminar):  ?>
    	<div class="seminarDiv">
    	        <div class="seminarDivHeader">
    		    <p><?php echo $seminar['Titel']; ?></p><br>
    		    <p><?php 
    		        $dateValues = date("d.m.Y", $seminar['Beginn']) . " - " . date("d.m.Y", $seminar['Ende']);
    			echo $dateValues; 
    		    ?></p>
    		    <p><?php echo $seminar['Standort']; ?></p>
    		</div>
    		    <div class="seminarDivBody">
    		        {{insert_form::1}}
    		    </div>
    		</div>
    <?php endforeach; ?>
    Um die Zuordnung zwischen Nutzer und Seminar realisieren zu können, habe ich mir gedacht, dass ich einfach die jeweilige ID des Seminares in das jeweilige Formular, als verstecktes Feld einfüge. Hier treten meine Probleme auf: Erstelle ich ein Formular mit dem Formulargenerator von Contao, habe ich bis jetzt keine Möglichkeit gefunden, die ID des jeweiligen Seminares an das Formular zu "übergeben". Nutze ich nicht den Formulargenerator, sondern erstelle ein eigenes Formular, dessen Template wie folgt aussieht, habe ich keine Ahnung, wie ich es hinbekomme, die Werte mit Hilfe von Contao in der entsprechenden Datenbanktabelle ablegen zu können.

    HTML-Code:
    <?php foreach ($this->seminare as $seminar):  ?>
    	<div class="seminarDiv">
    	        <div class="seminarDivHeader">
    		    <p><?php echo $seminar['Titel']; ?></p><br>
    		    <p><?php 
    		        $dateValues = date("d.m.Y", $seminar['Beginn']) . " - " . date("d.m.Y", $seminar['Ende']);
    			echo $dateValues; 
    		    ?></p>
    		    <p><?php echo $seminar['Standort']; ?></p>
    		</div>
    		    <div class="seminarDivBody">
    		        <form method="post" action="">
    				<input type="hidden" value="<?php echo $seminar['id']; ?>"/>
    				<label for="vorname">Vorname</label> <input id="vorname" type="text" value="" /></li>
    				<label for="nachname">Nachname</label> <input id="nachname" type="text" value="" /></li>
    				<label for="email">Email</label> <input id="email" type="text" value="" /></li>
    				<input id="senden" class="wmfg_btn" name="senden" type="submit" value="Senden" /></li>
    			</form>
    		    </div>
    		</div>
    <?php endforeach; ?>
    Meine Frage ist nun, ist dass so überhaupt möglicht ? Falls nicht, gibt es einen anderen Weg dieses Problem zu lösen ?

    Schon im Voraus, vielen Dank für eure Mühe

  2. #2
    Contao-Nutzer Avatar von benzin
    Registriert seit
    06.02.2016.
    Ort
    Essen/Düsseldorf, NRW
    Beiträge
    84
    Partner-ID
    11060

    Standard

    Für den Umgang mit Formularen empfehle ich mal wieder die Extension Contao Haste. Das vereinfacht den Umgang mit Formularen in eigenen Modulen extrem

  3. #3
    AG Pressearbeit
    Community-Moderator
    Buchautor 'Contao für Webdesigner'
    Avatar von planepix
    Registriert seit
    05.06.2009.
    Ort
    Stuttgart
    Beiträge
    6.468
    Partner-ID
    107
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Hallo je.an,

    willkommen im Contao Forum.

    Das hilft dir ggf. weiter mit dem Formulargenerator:
    https://community.contao.org/de/show...zug-zur-Seite-!
    ---------------------------------
    Beste Grüße planepix
    Contao für Webdesigner (Website), Twitter: @contaowebdesign
    weitzeldesign
    Contao-Sprechstunde
    Contao Schulungen: https://www.weitzeldesign.com/cms-co...chulungen.html
    Contao Jahrbuch: www.contao-jahrbuch.de
    Contao Agenturtag: www.contao-agenturtag.de
    Contao Stammtisch Stuttgart: www.contao-stammtisch-stuttgart.de
    Contao 4 Erfahrungen als Gitbook: https://app.gitbook.com/@planepix/s/...-mit-contao-4/
    Contao 4 & Manager Hosterhinweise: https://github.com/contao/contao-manager/wiki

    Schon wieder ein Update?
    Glücklich sind die, die den Wert erkennen – und wertschätzen.
    „Muss man machen wie beim Zahnarzt. Der bestraft einen auch mit hohen Rechnungen wenn man die Pflege vernachlässigt.”

  4. #4
    Contao-Nutzer Avatar von benzin
    Registriert seit
    06.02.2016.
    Ort
    Essen/Düsseldorf, NRW
    Beiträge
    84
    Partner-ID
    11060

    Standard

    Eine andere Variante wäre, mit dem Formulargenerator ein verstecktes Feld einzufügen, und dieses mit den FormField-Hooks (compileFormFields, validateFormFields) zu verarbeiten.

  5. #5
    Contao-Nutzer
    Registriert seit
    31.07.2016.
    Beiträge
    6

    Standard

    Zitat Zitat von planepix Beitrag anzeigen
    Hallo je.an,

    willkommen im Contao Forum.

    Das hilft dir ggf. weiter mit dem Formulargenerator:
    https://community.contao.org/de/show...zug-zur-Seite-!
    Hallo planepix,

    nein, leider komm ich durch diesen Typ nicht so richtig weiter, ich werde aber versuchen das ganze über einen eigenen Inserttag zu lösen.

    Zitat Zitat von benzin Beitrag anzeigen
    Eine andere Variante wäre, mit dem Formulargenerator ein verstecktes Feld einzufügen, und dieses mit den FormField-Hooks (compileFormFields, validateFormFields) zu verarbeiten.
    Diese Idee hatte ich auch schon, ich bin mir hier nur nicht im Klaren, wie ich die jeweilige Id des Seminares innerhalb des Hooks aus der Datenbank in das Feld bekomme.

    Die momentane Funktion habe ich durch einen schmutzigen Hack erreicht, der mir aber so ganz und gar nicht gefällt:

    Ich habe das Formular mit dem Formulargenerator erstellt, habe daraufhin das HTML-Markup des Formulars aus meiner Chrome-Debbuging-Konsole kopiert und in mein Template eingefügt. Innerhalb dieses Markups habe ich dann einfach das notwendige verstecktes Feld eingefügt. Das Absenden dieses Formulares funktioniert aber nur, wenn ich das gleiche Formular mit einem Inserttag nochmal auf der Seite einbinden. Damit dieses zweite eingefügte Formular aber nicht angezeigt wird, habe ich ein div-Element herum gekapselt und verstecke es. Folgendes Listing zeigt Mein momentanes Template:

    HTML-Code:
    <?php foreach ($this->seminare as $seminar):  ?>
    <div class="seminarDiv">
    	<div class="seminarDivHeader">
    		<p>
    			<?php echo $seminar['Titel']; ?>
    		</p>
    		<br>
    		<p>
    			<?php
    			$dateValues = date("d.m.Y", $seminar['Beginn']) . " - " . date("d.m.Y", $seminar['Ende']);
    			echo $dateValues;
    			?>
    		</p>
    		<p>
    			<?php echo $seminar['Standort']; ?>
    		</p>
    	</div>
    	<div class="seminarDivBody">
    		<div class="ce_form tableform block">
    
    			<form id="f1" method="post" enctype="application/x-www-form-urlencoded">
    				<div class="formbody">
    					<input type="hidden" name="FORM_SUBMIT" value="auto_form_1">
    					<input type="hidden" name="REQUEST_TOKEN" value="{{request_token}}">
    
                                           <-- Eingefügtes verstecktes Feld, welches die notwendige Seminar-Id zugewiesen bekomm -->
    					<input type="hidden" name="Seminar" value="<?php echo $seminar['id']; ?>">
    					<table>
    
    						<tbody>
    							<tr class="row_0 row_first even">
    								<td class="col_0 col_first"><label for="ctrl_4" class="mandatory"> <span class="invisible">Pflichtfeld </span>Mail:<span class="mandatory">*</span> </label></td>
    								<td class="col_1 col_last">
    								<input type="email" name="Mail" id="ctrl_4" class="text mandatory" value="" required="" placeholder="Mail-Adresse für Rückfragen">
    								</td>
    							</tr>
    
    							<tr class="row_1 odd">
    								<td class="col_0 col_first"><label for="ctrl_3" class="mandatory"> <span class="invisible">Pflichtfeld </span>Nachname:<span class="mandatory">*</span> </label></td>
    								<td class="col_1 col_last">
    								<input type="text" name="Nachname" id="ctrl_3" class="text mandatory" value="" required="" placeholder="Nachname der anzumeldenden Person">
    								</td>
    							</tr>
    
    							<tr class="row_2 even">
    								<td class="col_0 col_first"><label for="ctrl_1" class="mandatory"> <span class="invisible">Pflichtfeld </span>Vorname:<span class="mandatory">*</span> </label></td>
    								<td class="col_1 col_last">
    								<input type="text" name="Vorname" id="ctrl_1" class="text mandatory" value="" required="" placeholder="Vorname der anzumeldenden Person">
    								</td>
    							</tr>
    
    							<tr class="row_3 row_last odd">
    								<td class="col_0 col_first">&nbsp;</td>
    								<td class="col_1 col_last">
    								<div class="submit_container">
    									<input type="submit" id="ctrl_5" class="submit" value="Anmelden">
    								</div></td>
    							</tr>
    						</tbody>
    					</table>
    				</div>
    			</form>
    		</div>
                    
                    <!-- Gleiches Formular über Insertag --> 
    		<div hidden>
    			{{insert_form::1}}
    		</div>
    	</div>
    </div>
    <?php endforeach; ?>
    Vielen Dank für eure Mühe, vielleicht hat jemand noch einen anderen Vorschlag, oder eine Idee zur Realisierung

  6. #6
    Contao-Nutzer Avatar von benzin
    Registriert seit
    06.02.2016.
    Ort
    Essen/Düsseldorf, NRW
    Beiträge
    84
    Partner-ID
    11060

    Standard

    Zitat Zitat von je.an Beitrag anzeigen
    Diese Idee hatte ich auch schon, ich bin mir hier nur nicht im Klaren, wie ich die jeweilige Id des Seminares innerhalb des Hooks aus der Datenbank in das Feld bekomme.
    Wo befindest du dich bei dem von dir geposteten Template? Ist es einem eigenen Frontend-Modul zugeordnet oder ist es ein Event-Template? Ich würde mittels Haste ein Formular in einem eigenen Frontend-Modul erstellen (das geht auch auf Basis eines Formulars aus dem Formulargenerator). Dann kannst du dein verstecktes Formularfeld dynamisch mit der nötigen ID befüllen.

  7. #7
    Contao-Nutzer
    Registriert seit
    31.07.2016.
    Beiträge
    6

    Standard

    Zitat Zitat von benzin Beitrag anzeigen
    Wo befindest du dich bei dem von dir geposteten Template? Ist es einem eigenen Frontend-Modul zugeordnet oder ist es ein Event-Template? Ich würde mittels Haste ein Formular in einem eigenen Frontend-Modul erstellen (das geht auch auf Basis eines Formulars aus dem Formulargenerator). Dann kannst du dein verstecktes Formularfeld dynamisch mit der nötigen ID befüllen.
    Hallo benzin,

    Dieses Template ist folgendem Frontend-Modul zugewiesen. Hier hole ich mir alle notwendigen Datensätze für die jeweiligen Seminare in der betreffenden Kategorie und speichere sie in "$seminare". Ich hoffe ich habe dich richtig verstanden, dass ich nun in der compile-Funktion dieser Klasse das Formular mit Hilfe von Haste mit der jeweiligen Id des Seminars befüllen kann ?! Kannst du mir vllt ein kurzes Beispiel geben wie die Generierung des Formulars mit Haste und die Befüllung mit der Id innerhalb der compile-Funktion aussehen würde ? Schonmal vielen Dank für deine Hilfe

    PHP-Code:

    class workshopSeminar extends Module {
        
    /**
         * Template
         * @var string
         */
        
    protected $strTemplate 'mod_seminar_list';

        
    /**
         * Compile the current element
         */
        
    protected function compile() {
            
    /** @var \Contao\Database\Result $rs */
            
    $currentDate strtotime(date("d.m.Y"));
            
    $rs Database::getInstance() -> query('SELECT * FROM tl_seminar WHERE Kategorie = "Workshops" AND Beginn > '$currentDate);
            
    $this -> Template -> seminare $rs -> fetchAllAssoc();
        }


  8. #8
    Contao-Nutzer Avatar von benzin
    Registriert seit
    06.02.2016.
    Ort
    Essen/Düsseldorf, NRW
    Beiträge
    84
    Partner-ID
    11060

    Standard

    Ja, das steht in der oben bereits verlinkten Dokumentation von Haste:

    Code:
    Add the form fields from a form generator form ID
    
    <?php
        // you can exclude or modify certain fields by passing a callable as second
        // parameter
        $objForm->addFieldsFromFormGenerator(42, function(&$strField, &$arrDca) {
            // add anything you like
            if ($strField == 'myField') {
                $arrDca['eval']['mandatory'] = true;
            }
    
            // you must return true otherwise the field will be skipped
            return true;
        });

  9. #9
    Contao-Nutzer
    Registriert seit
    31.07.2016.
    Beiträge
    6

    Standard

    Zitat Zitat von benzin Beitrag anzeigen
    Ja, das steht in der oben bereits verlinkten Dokumentation von Haste:

    Code:
    Add the form fields from a form generator form ID
    
    <?php
        // you can exclude or modify certain fields by passing a callable as second
        // parameter
        $objForm->addFieldsFromFormGenerator(42, function(&$strField, &$arrDca) {
            // add anything you like
            if ($strField == 'myField') {
                $arrDca['eval']['mandatory'] = true;
            }
    
            // you must return true otherwise the field will be skipped
            return true;
        });
    hm ok, ich versuche es mal damit, vielen Dank. Ich sehe aber schon als nächstes Problem, wie ich die Daten in die entsprechende Tabelle bekomme ?! Durch den zuvor beschriebenen Hack, erledigt Contao das für mich und bis jetzt habe ich noch keinen Weg gefunden, die Daten nach einer Formulareingabe mithilfe von Contao in die passende Tabelle zu kippen. Kannst du mir vielleicht sagen wie das möglich ist ? Wenn es denn möglich ist

  10. #10
    Contao-Nutzer
    Registriert seit
    31.07.2016.
    Beiträge
    6

    Standard

    Leider konnte ich durch keinen der beschriebenen Wege meine gewünschte Funktionalität realisieren. Ich möchte hier nun meinen Lösungsweg beschreiben, falls andere Entwickler einmal vor dem selben Problem stehen.

    In meinem Template iteriere ich durch alle aus der Datenbank erhaltenen Seminare und schreibe die jeweiligen IDs in das value-Attribute eines input-Elements, welches ich versteckt im DOM-Baum platziere.

    HTML-Code:
    <?php foreach ($this->seminare as $seminar):  ?>
        <input type="text" name="SeminarId" hidden value="<?php echo $seminar['id']; ?>" />
    <?php endforeach; ?>
    Daraufhin erzeuge ich das notwendige HTML, welches jeweils ein Seminar repräsentiert.

    HTML-Code:
    <?php foreach ($this->seminare as $seminar):  ?>
        <div class="seminarDiv">
    	<div class="seminarDivHeader">
    	    <p>
    		<?php echo $seminar['Titel']; ?>
    	    </p>
    	    <br>
                <p>
    		<?php
    		    $dateValues = date("d.m.Y", $seminar['Beginn']) . " - "
                                                   . date("d.m.Y", $seminar['Ende']);
    		    echo $dateValues;
    		?>
    	    </p>
    	    <p>
    		<?php echo $seminar['Standort']; ?>
                </p>
    	</div>
    	<div class="seminarDivBody">
    		{{insert_form::1}}
    	</div>
        </div>
    <?php endforeach; ?>
    Innerhalb des Seminars wird über einen Inserttag das notwendige Formular zur Anmeldung eingefügt.

    HTML-Code:
    <div class="ce_form tableless block">
      <form id="f3" method="post" enctype="application/x-www-form-urlencoded" class="fullWidth">
        <div class="formbody">
            <input type="hidden" name="FORM_SUBMIT" value="auto_form_3">
            <input type="hidden" name="REQUEST_TOKEN" value="aab232ddb42ba8a4fa991fff672ae994">          
            <input type="hidden" name="Seminar" value="0">
               
            <div class="widget widget-text fullWidth marginTop mandatory">
                <input type="text" name="Vorname" id="ctrl_11" class="text fullWidth marginTop mandatory" value="" required="" placeholder="Bitte geben Sie den Vornamen der anzumeldenden Person ein" maxlength="50">
            </div>
            <div class="widget widget-text fullWidth marginTop mandatory">
                <input type="text" name="Nachname" id="ctrl_12" class="text fullWidth marginTop mandatory" value="" required="" placeholder="Bitte geben Sie den Nachnamen der anzumeldenden Person ein" maxlength="50" tabindex="1">
            </div>
            <div class="widget widget-text fullWidth marginTop mandatory">
                <input type="email" name="Mail" id="ctrl_13" class="text fullWidth marginTop mandatory" value="" required="" placeholder="Bitte geben Sie eine Mail-Adresse für Rückfragen an" maxlength="100">
            </div>
            <div class="submit_container marginTop marginBottom">
                <input type="submit" id="ctrl_15" class="submit marginTop marginBottom" value="Anmelden">
            </div>
         </div>
      </form>
    </div>
    Nun extrahiert folgendes Skript die IDs aus den zuvor angelegten versteckten input-Elementen und schreibt diese Werte jeweils in das value-Attribute des versteckte Feldes des Formulars, welches die Id des jeweiligen Seminars enthalten soll.

    HTML-Code:
    <script>
        var seminarIds = document.getElementsByName("SeminarId");
        var seminarInputFields = document.getElementsByName("Seminar");
    
        for (var i = 0; i < seminarInputFields.length; i++) {
            seminarInputFields[i].value = seminarIds[i].value;
        }
    </script>
    Mit diesem Lösungsweg kann ich jedem erzeugten Formular seine Id zuweisen, wodurch meine Problemstellung gelöst ist. Ich hoffe ich kann durch diese Anleitung jemand anderst viel Zeit und Nerven ersparen
    Geändert von je.an (05.08.2016 um 21:48 Uhr)

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •