Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] dynamische Formulare und Datenweitergabe

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] dynamische Formulare und Datenweitergabe

    Hallo,

    ich habe eine Site mit einem Formular in Tabellenform. Hier gibt es 4 Spalten, eine davon beinhaltet eine einfach-Selectauswahl. Die beiden anderen sind Input-Text-Felder.
    Wenn ich das in ein Formular schreibe, kann ich die Daten via get oder Post wunderbar übergeben. Jetzt kommt das Problem:
    Ich will einen Button, damit der User das Formular immer um eine weitere Zeile ergänzen kann. Den Teil habe ich mit Java realisiert. Problem ist jetzt aber, dass bei Buttonbetätigung die Daten nicht nach $_POST geschrieben werden. Es wird also eine Zeile hinzugefügt, aber die anderen Zeilen sind leer. Und wenn der User jedes mal nach der Erweiterung um eine Zeile die Tabelle komplett neu ausfüllen soll, dann wird der bei mehr als 2 Zeilen sicher nicht so angetan davon sein. Die Datenweitergabe an die nächste Seite sollte wollte ich über get lösen, denn da wird der gesamte Formularinhalt übergeben. Hier mal das, was ich probiert habe...
    PHP-Code:
    <?php
    $_SESSION
    ['anzahl'.$_SESSION['zeilenzahl']]=$_POST['anzahl'];
    $_SESSION['bez'.$_SESSION['zeilenzahl']]=$_POST['bez'];
    $_SESSION['preis'.$_SESSION['zeilenzahl']]=$_POST['preis'];
    $_SESSION['waer'.$_SESSION['zeilenzahl']]=$_POST['waer'];
    if (isset (
    $_GET['aktion']))
    {
        if(
    $_GET['aktion']=='zeile')
        {
            if (isset(
    $_SESSION['zeilenzahl']))
            {
                if(
    $_POST['submit']=='submit');
                {
                    
    $_SESSION['anzahl'.$_SESSION['zeilenzahl']]=$_POST['anzahl'];
                    
    $_SESSION['bez'.$_SESSION['zeilenzahl']]=$_POST['bez'];
                    
    $_SESSION['preis'.$_SESSION['zeilenzahl']]=$_POST['preis'];
                    
    $_SESSION['waer'.$_SESSION['zeilenzahl']]=$_POST['waer'];
                    
    $_SESSION['zeilenzahl']++;
                }
            }
        }
    }
    else
    {
        
    $_SESSION['zeilenzahl']=1;
    }    
    ?>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html>
    <head>
    <title>Protokoll</title>
    </head>
    <body>
        <h1>Material liste</h1>
    <form method="get" action="add_sur_pruef.php3">
        <div class="tabelle">
        <table border="0em" cellpadding="0" cellspacing="0" width="20" >
            <tr>
                <th>Anzahl</th>
                <th>Bezeichnung</th>
                <th>Preis/St&uuml;ck</th>
                <th>W&auml;hrung</th>
            </tr>
            <?PHP
            
    function DropDown_waer ($waehrung)
            {
                
    $selected=$waehrung=="USD"?" selected=\"selected\"":"";
                echo 
    '<select name="waer" size="1">';
                echo 
    "\n\t<option>EUR</option>";
                echo 
    "\n\t<option".$selected.">USD</option>\n</select>\n";
            }
            for(
    $i=1;$i<=$_SESSION['zeilenzahl'];$i++)
            {
                echo
    '<tr>
                        <td>
                            <input type="text" name="anzahl'
    .$i.'" id="anzahl'.$i.'" 
                            value="'
    .$_SESSION['anzahl'.$i].'"/>
                        </td>'
    ;
                echo
    '    <td>
                            <input type="text" name="bez'
    .$i.'" id="bez'.$i.'" 
                            value="'
    .$_SESSION['bez'.$i].'"/>
                        </td>'
    ;
                echo
    '    <td>
                            <input type="text" name="preis'
    .$i.'" id="preis'.$i.'" 
                            value="'
    .$_SESSION['preis'.$i].'"/></td>';
                echo
    '    <td>';
                            
    $waehrung=$_SESSION['waer'.$i];DropDown_waer ($waehrung);
                        
    '</td>
                    </tr>'
    ;
            }
              
    ?>
        </table>
            <input type="button" value="Zeile hinzuf&uuml;gen"  id="Eintragen_in_Protokoll"
            onClick="javascript:location.href = 'add_parts.php3?aktion=zeile'"/>
            <input type="submit" name="submit" value="weiter" id="button" />
            <input type="button" value="Abbrechen" onClick="javascript:location.href = 'index.php3'"/>
    </form>
    </body>
    </html>
    Das ist natürlich nur ein Auszug
    Wenn ich die Daten mit POST weitergeben will, steht in Post(natürlich) immer nur die letzte Zeile, wenn ich die Daten über die Session und einen Button mit Javascript übergebe, dann fehlt die letzte Zeile, da das ja nicht mehr nach Post geschrieben wird.
    Hat vielleicht einer eine gute Idee ???

  • #2
    Benutze das Feld name als Array(Container), dann kannst du beim empfangen der Daten über das Array iterieren und musst nicht den Namen neu deklarieren. Eine weitere Möglichkeit bietet sich an (mit Javascript Kenntnisse) ohne Reload das Formular dynamisch durch das DOM zu erweitern.

    PHP-Code:
    <input type="text" name="anzahl[]" />
    <
    input type="text" name="anzahl[]" />
    <
    input type="text" name="anzahl[]" />

    if(isset(
    $_POST['anzahl']))
    {
        foreach(
    $_POST['anzahl'] as $index => $value)
        {
            echo(
    'Feld '.$index.' hat den Wert '.$value);
        }

    Kommentar


    • #3
      Hier nochmal ein Beispiel basierend auf Deinen Code.

      PHP-Code:
      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
      <html>
      <head>
      <title>Protokoll</title>
      <script type="text/javascript">

          function addMaterial()
          {
              var table = document.getElementById('materialTable');
              if(table)
              {
                  var inputFields = new Array('anzahl', 'bez', 'preis');
                  var selectFields = new Array();
                  selectFields['waer'] = new Array('EUR', 'USD');

                  var row = document.createElement('TR');

                  for(var index in inputFields)
                  {
                      var field = document.createElement('TD');
                      var input = document.createElement('INPUT');
                      input.name = inputFields[index] + '[]';
                      field.appendChild(input);
                      row.appendChild(field);
                  }

                  for(var index in selectFields)
                  {
                      var field = document.createElement('TD');
                      var select = document.createElement('SELECT');
                      select.name = index + '[]';

                      for(var currency in selectFields[index])
                      {
                          var option = document.createElement('OPTION');
                          option.value = selectFields[index][currency];
                          var textNode = document.createTextNode(selectFields[index][currency]);
                          option.appendChild(textNode);
                          select.appendChild(option);
                      }
                      field.appendChild(select);
                      row.appendChild(field);
                  }

                  table.appendChild(row);
              }
          }

      </script>
      </head>
      <body>
          <h1>Material liste</h1>
      <form method="post" action="<?php echo($_SERVER['PHP_SELF']); ?>">

          <table border="0em" cellpadding="0" cellspacing="0" width="20" id="materialTable" >
              <tr>
                  <th>Anzahl</th>
                  <th>Bezeichnung</th>
                  <th>Preis/St&uuml;ck</th>
                  <th>W&auml;hrung</th>
              </tr>
             <tr>
                 <td>
                      <input type="text" name="anzahl[]"  value="" />
                 </td>
                 <td>
                         <input type="text" name="bez[]" value="" />
                 </td>
                  <td>
                      <input type="text" name="preis[]" value=""/>
                  </td>
                  <td>
                      <select name="waer[]" size="1">
                          <option>EUR</option>
                          <option>USD</option>
                      </select>
                  </td>
              </tr>
          </table>
          
              <input type="button" value="Zeile hinzuf&uuml;gen"  id="Eintragen_in_Protokoll"
              onClick="javascript:addMaterial()"/>
              <input type="submit" name="submit" value="weiter" id="button" />
              <input type="button" value="Abbrechen" onClick="javascript:location.href = 'index.php3'"/>
      </form>

      <?php
      if(! empty($_POST))
      {
          
      $amount count($_POST['anzahl']);

          echo (
      '<div>Bestellung:</div>');
          for(
      $index 0$index $amount$index++)
          {
              echo (
      '<div>Material '.$index.':</div>');
              echo (
      '<ul>');
              echo (
      '<li>Anzahl: '.$_POST['anzahl'][$index].'</li>');
              echo (
      '<li>Bezeichnung: '.$_POST['bez'][$index].'</li>');
              echo (
      '<li>Preis: '.$_POST['preis'][$index].'</li>');
              echo (
      '<li>W&auml;hrung: '.$_POST['waer'][$index].'</li>');
              echo (
      '</ul>');
          }

      ?>



      </body>
      </html>

      Ich hoffe die Dateiendung "php3" ist ein Scherz von Dir gewesen. Wenn nicht, empfehle ich dringends ein Update.

      Kommentar


      • #4
        Also erstmal danke für die Tipps...werde das gleich mal testen.
        Bei Problemen nerve ich weiter
        Was das php3 betrifft - Nein, php3 war kein Scherz - das ist die Endung, die mein Editor normalerweise für php-Seiten vergibt
        Verwende eine aktuelle XAMPP-Version. Trotzdem danke für den Hinweis.

        Kommentar


        • #5

          Hallo nochmal...
          also vielen Dank für die schnelle Hilfe...
          funktioniert ganz prima - muß mir zwar (aufgrund meiner mangelhaften Javascriptkenntnisse) noch klarmachen was da eigentlich passiert, aber klappen das es geht ist erstmal die Hauptsache.

          Vielen Dank !!!!

          Kommentar


          • #6
            So....
            nun doch noch mal eine Nachfrage...habe Deinen Code an meine Bedingungen angepasst, und alles wunderbar..doch dann kam mein Problem in Form vom Internet Explorer. Da funktioniert das hinzufügen der Zeilen nicht. Ich hab es unter dem 6er und dem 8er getestet...leider ohne Erfolg...
            Hast Du dazu vielleicht auch noch so eine gute Idee???

            Kommentar


            • #7
              Hier noch mal die "gepatchte" Version. Habs unter FF, IE7, Safari, Chrome und Opera gestetet.

              PHP-Code:
              <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
              "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
              <html>
              <head>
              <title>Protokoll</title>
              <script type="text/javascript">

                  function addMaterial()
                  {
                      var table = document.getElementById('materialTable');
                      if(table)
                      {
                          var inputFields = new Array('anzahl', 'bez', 'preis');
                          var selectFields = new Array();
                          selectFields['waer'] = new Array('EUR', 'USD');

                          var row = table.insertRow(-1);

                          for(var index in inputFields)
                          {
                              var field = document.createElement('TD');
                              var input = document.createElement('INPUT');
                              input.name = inputFields[index] + '[]';
                              field.appendChild(input);
                              row.appendChild(field);
                          }

                          for(var index in selectFields)
                          {
                              var field = document.createElement('TD');
                              var select = document.createElement('SELECT');
                              select.name = index + '[]';

                              for(var currency in selectFields[index])
                              {
                                  var option = document.createElement('OPTION');
                                  option.value = selectFields[index][currency];
                                  var textNode = document.createTextNode(selectFields[index][currency]);
                                  option.appendChild(textNode);
                                  select.appendChild(option);
                              }
                              field.appendChild(select);
                              row.appendChild(field);
                          }
                      }
                  }

              </script>
              </head>
              <body>
                  <h1>Material liste</h1>
              <form method="post" action="<?php echo($_SERVER['PHP_SELF']); ?>">

                      <table border="0em" cellpadding="0" cellspacing="0" width="20" id="materialTable">
                          <tr>
                              <th>Anzahl</th>
                              <th>Bezeichnung</th>
                              <th>Preis/St&uuml;ck</th>
                              <th>W&auml;hrung</th>
                          </tr>
                         <tr>
                             <td>
                                  <input type="text" name="anzahl[]"  value="" />
                             </td>
                             <td>
                                     <input type="text" name="bez[]" value="" />
                             </td>
                              <td>
                                  <input type="text" name="preis[]" value=""/>
                              </td>
                              <td>
                                  <select name="waer[]" size="1">
                                      <option>EUR</option>
                                      <option>USD</option>
                                  </select>
                              </td>
                          </tr>
                      </table>
                  
                      <input type="button" value="Zeile hinzuf&uuml;gen"  id="Eintragen_in_Protokoll"
                      onClick="javascript:addMaterial()"/>
                      <input type="submit" name="submit" value="weiter" id="button" />
                      <input type="button" value="Abbrechen" onClick="javascript:location.href = 'index.php3'"/>
              </form>

              <?php
              if(! empty($_POST))
              {
                  
              $amount count($_POST['anzahl']);

                  echo (
              '<div>Bestellung:</div>');
                  for(
              $index 0$index $amount$index++)
                  {
                      echo (
              '<div>Material '.$index.':</div>');
                      echo (
              '<ul>');
                      echo (
              '<li>Anzahl: '.$_POST['anzahl'][$index].'</li>');
                      echo (
              '<li>Bezeichnung: '.$_POST['bez'][$index].'</li>');
                      echo (
              '<li>Preis: '.$_POST['preis'][$index].'</li>');
                      echo (
              '<li>W&auml;hrung: '.$_POST['waer'][$index].'</li>');
                      echo (
              '</ul>');
                  }

              ?>

              Kommentar

              Lädt...
              X