Dynamische Auswahlliste mit eigener Funktion

Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

Kenney

Mitglied
Das ist mein Anfang zum dynamischer Auswahlliste.

Die $id Variable gebe ich mit dynAuswahl vor.
Die $name Variable ebenfalls aber mit dynamisch1 bzw. dynamisch2.
Ich versuche die Listen (Brot, Butter, Milch, Eier, Käse, Wurst) und (Schrauben, Nägel, Haken, Nadeln, Dübel) in die Variable $options zu stecken.
Jetzt benötige ich nur noch eine Abfrage ob die $multiple vorhanden ist und damit ich mir bei $options As $key geben lassen kann, der dann im size="eine aktuelle Ziffer der Listengröße bzw. Array-Einträge" einsetzt. Es ist viel gezaubert, mit meinen gefährlichen Halbwissen. Die Idee kann ich nicht umsetzen, weil mir gewaltiges Wissen fehlt. Ich hoffe, Ihr könnt mir helfen, ich weiss echt nicht mehr weiter.

PHP:
<!doctype html>
<html lang="de">
<head>
  <meta charset="utf-8">
  <title>1. Aufgabe dynamische Auswahlliste generieren</title>
</head>
<body>
  <?php
  function dynAuswahl($id, $name, $options, $multiple)
            {
               $ausgabe = "<option value='$options'";
                              if(isset($_POST["dynamisch1"]))
                                {
                                  if($_POST[$id] == $name)
                                  {
                                    $ausgabe .= " selected";
                                  }
                                }
                                if(empty($options))
                                  {
                                  }
                                  $ausgabe .= ">$options</option>\n";
                                  echo $ausgabe;
            }
  ?>
  <form method="post">
    <p>
      <h1>Einkaufsliste:</h1>
    </p>
    <p>
      <select id="dynAuswahl" name="dynamisch1" size="">
        <?php dynAuswahl("dynamisch1", "auswahl1", "Brot", "");?>
        <?php dynAuswahl("dynamisch1", "auswahl1", "Butter", "");?>
        <?php dynAuswahl("dynamisch1", "auswahl1", "Milch", "");?>
        <?php dynAuswahl("dynamisch1", "auswahl1", "Eier", "");?>
        <?php dynAuswahl("dynamisch1", "auswahl1", "Käse", "");?>
        <?php dynAuswahl("dynamisch1", "auswahl1", "Wurst", "");?>
      </select>
    </p>
    <p>
      <select id="dynAuswahl" name="dynmisch2" size="" multiple="">
        <?php dynAuswahl("dynmisch2", "auswahl2", "Schrauben", "");?>
        <?php dynAuswahl("dynmisch2", "auswahl2", "Nägel", "");?>
        <?php dynAuswahl("dynmisch2", "auswahl2", "Haken", "");?>
        <?php dynAuswahl("dynmisch2", "auswahl2", "Nadeln", "");?>
        <?php dynAuswahl("dynmisch2", "auswahl2", "Dübel", "");?>
      </select>
    </p>
    <p>
    <input type="submit" value="Abschicken">
   </p>
  </form>
</body>
</html>
 
Zuletzt bearbeitet von einem Moderator:
Nochmal! Was spricht gegen diese Version:

PHP:
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<title>dynamische Auswahlliste generieren</title>
</head>
<body>
<?php
  function dynAuswahl($name, $data)
  {
    $result = "";
 
    foreach ($data as $value)
    {
       $selected = "";
   
       if (isset($_POST[$name]))
       {
          if (is_array($_POST[$name]))
              $selected = in_array($value, $_POST[$name]) ? "selected" : "";
          else if ($_POST[$name] == $value)
              $selected = "selected";      
       }
   
       $result .= "<option value='$value' $selected>$value</option>\n";
    }
 
    return $result;
  }
?>
<h1>Einkaufsliste:</h1>
<form method="post">
 <p>
  <select id="dynAuswahl" name="dynamisch1" size="">
    <?php
       $data = array("Brot", "Butter", "Milch", "Eier", "Käse", "Wurst");
   
       echo dynAuswahl("dynamisch1", $data);
    ?>
  </select>
  </p>
  <p>
  <select id="dynAuswahl1" name="dynamisch2[]" size="" multiple="">
    <?php
       $data = array("Schrauben", "Nägel", "Haken", "Nadeln", "Dübel");
   
       echo dynAuswahl("dynamisch2", $data);
    ?>
  </select>
  </p>
  <input type="submit" value="Abschicken">
</form>
</body>
</html>
Das ist doch genau das, was du willst und das auf eine bessere Art und Weise.

Und wozu habe ich in dem anderen Thread wohl geschrieben:
erklärst dann, was an meinem Script nicht stimmt. Fakt ist, dein Script wird sich spätestens beim multiple-Select verabschieden, und nicht nur, weil du beim Namen des Selects einen Schreibfehler hast.
 
Ich habe deine Frage nicht wirklich verstanden.
Aber wenn ich mir den Code anschaue, komme ich schon auf eine unklarheit, ev. ein Problem.
Du hast $_POST[$id] == $name) um herauszufinden, ob die Ausawahl gewählt ist. Aber $name ist immer "auswahl1". Du vergleichst immer $_POST['dynamisch1']=='auswahl1'
Der Text 'auswahl1' kommt im Formular aber nirgends vor. Somit ist der Vergleich immer falsch. Würde er vorkommen, wäre der Vergleich immer richtig und jede AUswahl würde als selected markiert.

Der Inhlat von $_POST['dynamisch1'] müsste eigentlich 'Brot', 'Butter' etc sein. Du kannst also den Funktionsparameter $name streichen und den Vergleich mit $options machen
PHP:
<?php
function dynAuswahl($id, $options, $multiple){
    ....
    if($_POST[$id] == $options) $ausgabe .= " selected";
    ...
} ?>

      <select id="dynAuswahl" name="dynamisch1" size="">
        <?php dynAuswahl("dynamisch1", "Brot", "");?>
        ...
 
Nochmal! Was spricht gegen diese Version:

PHP:
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<title>dynamische Auswahlliste generieren</title>
</head>
<body>
<?php
  function dynAuswahl($name, $data)
  {
    $result = "";
 
    foreach ($data as $value)
    {
       $selected = "";
  
       if (isset($_POST[$name]))
       {
          if (is_array($_POST[$name]))
              $selected = in_array($value, $_POST[$name]) ? "selected" : "";
          else if ($_POST[$name] == $value)
              $selected = "selected";     
       }
  
       $result .= "<option value='$value' $selected>$value</option>\n";
    }
 
    return $result;
  }
?>
<h1>Einkaufsliste:</h1>
<form method="post">
 <p>
  <select id="dynAuswahl" name="dynamisch1" size="">
    <?php
       $data = array("Brot", "Butter", "Milch", "Eier", "Käse", "Wurst");
  
       echo dynAuswahl("dynamisch1", $data);
    ?>
  </select>
  </p>
  <p>
  <select id="dynAuswahl1" name="dynamisch2[]" size="" multiple="">
    <?php
       $data = array("Schrauben", "Nägel", "Haken", "Nadeln", "Dübel");
  
       echo dynAuswahl("dynamisch2", $data);
    ?>
  </select>
  </p>
  <input type="submit" value="Abschicken">
</form>
</body>
</html>
Das ist doch genau das, was du willst und das auf eine bessere Art und Weise.

Und wozu habe ich in dem anderen Thread wohl geschrieben:
Hallo m.scatello,
es ist bestimmt nicht falsche an deinen Script, die eigene Funktion muss aus vier Variablen bestehen. Wenn das in der Aufgabe nicht drin stehen würde, hätte ich deine Version mit Kusshand angenommen.
 
Ich habe deine Frage nicht wirklich verstanden.
Aber wenn ich mir den Code anschaue, komme ich schon auf eine unklarheit, ev. ein Problem.
Du hast $_POST[$id] == $name) um herauszufinden, ob die Ausawahl gewählt ist. Aber $name ist immer "auswahl1". Du vergleichst immer $_POST['dynamisch1']=='auswahl1'
Der Text 'auswahl1' kommt im Formular aber nirgends vor. Somit ist der Vergleich immer falsch. Würde er vorkommen, wäre der Vergleich immer richtig und jede AUswahl würde als selected markiert.

Der Inhlat von $_POST['dynamisch1'] müsste eigentlich 'Brot', 'Butter' etc sein. Du kannst also den Funktionsparameter $name streichen und den Vergleich mit $options machen
PHP:
<?php
function dynAuswahl($id, $options, $multiple){
    ....
    if($_POST[$id] == $options) $ausgabe .= " selected";
    ...
} ?>

      <select id="dynAuswahl" name="dynamisch1" size="">
        <?php dynAuswahl("dynamisch1", "Brot", "");?>
        ...
Hallo Yaslaw,
danke für deinen Hinweis, nachdem m.scatello mir angedeutet hat, dass was mit meinen gezauberten Script nicht stimmt. Ich probiere gleich mal deine Anmerkungen aus. OOO, die Vorgaben sind mit 4 Variablen in der Funktion zu arbeiten. Die auswahl1 muss Brot, Butter usw. ausgeben.
 
Schön sich darüber mal zu unterhalten, damit ich meine Fehler auch erkennen kann.

Ich habe etwas geändert.

dynamisch.gif

Im Browser sieht es auch fast so aus, wie es gewollt ist
BrowserQuelltext.gif

Also wenn Ihr jetzt meint, es könnte funktionieren. Dann wäre ich für weiter Vorschläge offen um das size="" bei auswahl2 über die $options zu bewerkstelligen.
 
Wer stellt denn so dämliche Aufgaben? Man kann sich auch unnötig einen Knoten programmieren. Die 4 Übergabeparameter sind völlig unnötig. Aber wenn es sein muss :confused:
PHP:
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<title>dynamische Auswahlliste generieren</title>
</head>
<body>
<?php
  function dynAuswahl($id, $name, $option, $multiple)
  {   
    $selected = "";
    
    if (isset($_POST[$id]))
    {
        if ($multiple)
        {
            if (in_array($option, $_POST[$id]))
                $selected = "selected";           
        }
        else if ($_POST[$name] == $option)
              $selected = "selected";
    }   
      
    echo "<option value='$option' $selected>$name</option>\n";
  }
?>
<h1>Einkaufsliste:</h1>
<form method="post">
  <p>
  <select id="dynAuswahl" name="dynamisch1" size="">
      <?php dynAuswahl("dynamisch1", "Brot", "Brot", false);?>
      <?php dynAuswahl("dynamisch1", "Butter", "Butter", false);?>
      <?php dynAuswahl("dynamisch1", "Milch", "Milch", false);?>
      <?php dynAuswahl("dynamisch1", "Eier", "Eier", false);?>
      <?php dynAuswahl("dynamisch1", "Käse", "Käse", false);?>
      <?php dynAuswahl("dynamisch1", "Wurst", "Wurst", false);?>
  </select>
  </p>
  <p>
  <select id="dynAuswahl1" name="dynamisch2[]" size="" multiple>
     <?php dynAuswahl("dynamisch2", "Schrauben", "Schrauben", true);?>
     <?php dynAuswahl("dynamisch2", "Nägel", "Nägel", true);?>
     <?php dynAuswahl("dynamisch2", "Haken", "Haken", true);?>
     <?php dynAuswahl("dynamisch2", "Nadeln", "Nadeln", true);?>
     <?php dynAuswahl("dynamisch2", "Dübel", "Dübel", true);?>
  </select>
  </p>
  <input type="submit" value="Abschicken">
</form>
</body>
</html>

Poste keine Screenshots, damit kann man nicht wirklich was anfangen!
 
Nachdem ich da weiter drüber reflektiert habe, scheint mir jetzt klar zu sein, wo das Ganze hin gehen soll:
Die vorgegebenen Parameter der Funktion geben einfach die Attribute und Optionen des zu generierenden Select an:
Code:
function dynAuswahl(
    $id, // Die ID des Select
    $name, // Der Name des Select
    $options, // Die Optionen des Select
    $multiple // Gibt an, ob mehrere Optionen auswählbar sind (boolean)
    ) {
Dann müsste man das select-Tag in die Funktion hinein nehmen:
Code:
    function dynAuswahl(
        $id, // Die ID des Select
        $name, // Der Name des Select
        $options, // Die Optionen des Select (array)
        $multiple // Gibt an, ob mehrere Optionen auswählbar sind (boolean)
    ) {
        if ($multiple) {
            $multAttribute = " multiple";
            $nameAttribute = $name . '[]';
        } else {
            $multAttribute = '';
            $nameAttribute = $name;
        }

        $html = '<select id="' . $id . '" name="' . $nameAttribute . '"' . $multAttribute . '>';
        foreach ($options as $opt) {
            // An dieser Stelle kannst Du zusätzlich prüfen, ob die Option
            // ausgewählt ist und entspr. das Attr. "selected" setzen
            $html .= '<option value="' . $opt . '">' . $opt . '</option>';
        }
        $html .= '</select>';
        return $html;
    }
(ungetestet)
Das könntest Du noch verfeinern indem Du das Array mit den Optionen zweidimensional anlegst um value und Text getrennt zu definieren.
 
Zuletzt bearbeitet:
@Kenney Noch nee Anmerkung.
Meines Wissens sollte man in Funktionen auch kein Echo ausgeben.
PHP:
  function dynAuswahl($id, $name, $options, $multiple){
  ........
                                  echo $ausgabe;
            }
Da könntest du dir mal Return anschauen.
Man darf mich gerne verbessern, wenn ich falsch liege
 
Wer stellt denn so dämliche Aufgaben? Man kann sich auch unnötig einen Knoten programmieren. Die 4 Übergabeparameter sind völlig unnötig. Aber wenn es sein muss :confused:
PHP:
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<title>dynamische Auswahlliste generieren</title>
</head>
<body>
<?php
  function dynAuswahl($id, $name, $option, $multiple)
  {  
    $selected = "";
   
    if (isset($_POST[$id]))
    {
        if ($multiple)
        {
            if (in_array($option, $_POST[$id]))
                $selected = "selected";          
        }
        else if ($_POST[$name] == $option)
              $selected = "selected";
    }  
     
    echo "<option value='$option' $selected>$name</option>\n";
  }
?>
<h1>Einkaufsliste:</h1>
<form method="post">
  <p>
  <select id="dynAuswahl" name="dynamisch1" size="">
      <?php dynAuswahl("dynamisch1", "Brot", "Brot", false);?>
      <?php dynAuswahl("dynamisch1", "Butter", "Butter", false);?>
      <?php dynAuswahl("dynamisch1", "Milch", "Milch", false);?>
      <?php dynAuswahl("dynamisch1", "Eier", "Eier", false);?>
      <?php dynAuswahl("dynamisch1", "Käse", "Käse", false);?>
      <?php dynAuswahl("dynamisch1", "Wurst", "Wurst", false);?>
  </select>
  </p>
  <p>
  <select id="dynAuswahl1" name="dynamisch2[]" size="" multiple>
     <?php dynAuswahl("dynamisch2", "Schrauben", "Schrauben", true);?>
     <?php dynAuswahl("dynamisch2", "Nägel", "Nägel", true);?>
     <?php dynAuswahl("dynamisch2", "Haken", "Haken", true);?>
     <?php dynAuswahl("dynamisch2", "Nadeln", "Nadeln", true);?>
     <?php dynAuswahl("dynamisch2", "Dübel", "Dübel", true);?>
  </select>
  </p>
  <input type="submit" value="Abschicken">
</form>
</body>
</html>

Poste keine Screenshots, damit kann man nicht wirklich was anfangen!
Hallo m.scatello,
ich bin mir unsicher ob solche Aufgabe überhaupt am Anfang sinnvoll ist. Vielen Dank für deine Mühe, wie schnell du sowas hinbekommst.


Ich bekomme es nicht so schnell hin zu deuten und damit wir nicht unnötig Energie verpulvern, schreibe ich mal die Aufgabestellung auf;

______________________
Programmieren Sie in einer PHP-Datei dynamisch.php eine Funktion dynAuswahl(), die dynamisch eine Auswahlliste generiert.

Die Funktion hat vier Parameter: string $id, string $name, array $options und bool $multiple.

$id und $name nehmen Zeichenketten für die entsprechenden Attributwerte in der Auswahlliste entgegen. An das Array $options werden die option-Elemente übergeben. Wir gehen dabei davon aus, dass der Wert des value-Attributs dem Text entspricht, der zwischen <option> und </option> angezeigt wird. $multiple ist vom Type bool und legt fest, ob eine Mehrfachauswahl erlaubt ist. Wenn das so ist, hat das Auswirkungen auf den Wert des name-Attributs und ein zusätzliches size-Attribut, denn die Höhe des Feldes soll dann der Anzahl der Elemente entsprechen. Der Rückgabewert ist vom Type string. Die Funktion soll also das select-Element inklusive der option-Elemente als Zeichenkette zurückliefern.
__________________________


Nach mein Verständnis habe ich dann meine Quelltext zu hingebastelt.

Dank euch, sind Fehler sichtbar geworden, wofür ich aber Zeit brauche die zu verstehen und ab zu ändern.

Ihr habt mir wieder Hoffnung gegeben und nicht alles hin zu werfen. DANKE!
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…
Zurück