Dynamische Auswahlliste mit eigener Funktion

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:
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.
Hallo Sempervivum,
an dieser Idee hatte ich auch gearbeitet, nicht so schön wie deine.

Hier, wenn du möchtest könntest du dir meine Version mal angucken:

_____________________________
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<title>dynamische Auswahlliste generieren</title>
</head>
<body>
<?php
function dynAuswahl(string $id, string $name, array $options, $multiple=false)
{
if($multipe != false)
{
$multiple = "multiple";
}
if($multiple)
{
foreach($options as $z)
{
$format="<option value='$options'></options>";
}
$format="<select id='$id' name='$name' size='$z' multiple></select>\n";
}
}
if(!empty($_POST))
{
print_r($_POST);
}
else
{
?>
<form method="post">
<p>
<label for="dynamisch">Einkaufsliste:</label>
</p>
<p>
<select id="dynamisch1" name="auswahl1" size"" multiple>
<option value="Brot"> Brot </option>
<option value="Butter"> Butter </option>
<option value="Milch"> Milch </opton>
<option value="Eier"> Eier </option>
<option value="Käse"> Käse </option>
<option value="Wurst"> Wurst </option>
</select>
</p>
<p>
<select id="dynmisch2" name="auswahl2[]" size="0" multiple>
<option value="Schrauben"> Schrauben </option>
<option value="Nägel"> Nägel </option>
<option value="Haken"> Haken </option>
<option value="Nadeln"> Nadeln </option>
<option value="Dübel"> Dübel </option>
</select>
</p>
<p>
<input type="submit" value="Abschicken">
</p>
</form>
<?php
}
?>
</body>
</html>
______________________________________

Aber dann habe ich den Faden verloren und mein Lehrer hat mir nahe gelegt, dass ich neu Anfangen sollte.
 
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
Hallo basti1012,
da hast du vollkommen Recht, wir befinden uns ja in einer Funktion. Vermütlich wollte ich nur ein reaktion generieren. Danke für deinen Hinweis.
 
Nachdem Du in Posting #10 die Aufgabenstellung wieder gegeben hast, ist klar, dass meine Vermutungen genau richtig waren.

Damit Du die Dinge besser verstehst, habe ich mal in deinen Code Kommentare hinein geschrieben:
Code:
    function dynAuswahl(string $id, string $name, array $options, $multiple = false)
    {
        if ($multipe != false) { // Hier Schreibfehler bei $multiple
            // Hier besser ein Leerzeichen voran stellen, damit das Attribut
            // von dem davor getrennt ist:
            $multiple = "multiple";
            // Nach der Aufgabenstellung musst Du hier noch das size-Attribut
            // bereit stellen
        }
        if ($multiple) {
            // Diese Schleife ist schon der richtige Ansatz
            // aber der Name $z etwas unglücklich gewählt,
            // die Variable enthält die aktuelle Option:
            foreach ($options as $z) {
                // Hier muss der String für die Option dem vorhandenen
                // Text hinzu gefügt werden, achte auf den Punkt,
                // außerdem musst Du die aktuelle Option verwenden
                // und nicht das ganze Array:
                $format .= "<option value='$z'>$z</options>";
                // $format = "<option value='$options'></options>";
            }
            // Dies musst Du vor die Schleife stellen und die Variable $multiple
            // verwenden, die Du oben vorbereitet hast:
            $format = "<select id='$id' name='$name' size='$z' $multiple></select>\n";
            // $format = "<select id='$id' name='$name' size='$z' multiple></select>\n";
        }
    }
 
Du solltest allgemein auf deine Bezeichner besser achten, denn so Sachen wie dynmisch2 und multipe erschweren die Fehlersuche unnötig.
 
Und bitte hier im Forum den Code in Code-Tags setzen. So wie du ihn postest ist es unlesbar.
Also so:
[code=php]<?php //mein Cide ?>[/code]
Das sieht dann so aus
PHP:
<?php
    //mein Cide
?>
 
Nachdem Du in Posting #10 die Aufgabenstellung wieder gegeben hast, ist klar, dass meine Vermutungen genau richtig waren.

Damit Du die Dinge besser verstehst, habe ich mal in deinen Code Kommentare hinein geschrieben:
Code:
    function dynAuswahl(string $id, string $name, array $options, $multiple = false)
    {
        if ($multipe != false) { // Hier Schreibfehler bei $multiple
            // Hier besser ein Leerzeichen voran stellen, damit das Attribut
            // von dem davor getrennt ist:
            $multiple = "multiple";
            // Nach der Aufgabenstellung musst Du hier noch das size-Attribut
            // bereit stellen
        }
        if ($multiple) {
            // Diese Schleife ist schon der richtige Ansatz
            // aber der Name $z etwas unglücklich gewählt,
            // die Variable enthält die aktuelle Option:
            foreach ($options as $z) {
                // Hier muss der String für die Option dem vorhandenen
                // Text hinzu gefügt werden, achte auf den Punkt,
                // außerdem musst Du die aktuelle Option verwenden
                // und nicht das ganze Array:
                $format .= "<option value='$z'>$z</options>";
                // $format = "<option value='$options'></options>";
            }
            // Dies musst Du vor die Schleife stellen und die Variable $multiple
            // verwenden, die Du oben vorbereitet hast:
            $format = "<select id='$id' name='$name' size='$z' $multiple></select>\n";
            // $format = "<select id='$id' name='$name' size='$z' multiple></select>\n";
        }
    }
Ich versuche gerade aus #8 deine Anmerkungen um zu setzen, in den Stunden nicht viel passiert aber versaut habe ich es noch nicht, kommen keine Fehlermeldungen.
 
Du solltest allgemein auf deine Bezeichner besser achten, denn so Sachen wie dynmisch2 und multipe erschweren die Fehlersuche unnötig.
Hey m.scatello,
leider ist mir das erst bei deinen schnellen Bemühungen in den Sinn gekommen, dass hilfreich wäre.

Ich möchte mich bei dir und den anderen, hiermit, entschuldigen.

Es tut mir leid!
 
Zurück