Option.felder erstellen

Alice

Erfahrenes Mitglied
Optionsfelder erstellen

Hallo. :)

Wie kann ich mit PHP Optionsfelder erstellen?

Mein Problem ist, dass ich die Optionsfelder in einer Variable benötige inkl. "Selected". Ich kann also nicht mit "echos" arbeiten.

Jemand eine Idee oder einen guten Ansatz?
 
Zuletzt bearbeitet:
Kannst du vllt deinen bisherigen Code zeigen (oder das Problem noch mehr erörtern)? So wie ich's verstehe musst du dein select erst zusammenbauen bevor es rausposaunt wird.

Um eine Variable nach und nach zu erweitern bräuchtest du eine Schleife und den Punkt als Vereinigungs-/Concatenation-Operator.

Angenommen du hast ein Array mit den Options-Werten (ich nehm hier als billigen Testfall mal den $index als Bezeichnung und (bool)$value als Selected-Status):

PHP:
$select = '<select name="irgendeinname">';
while(list($index, $value) = each($options)){
  if($value) $select .= '<option value="'.$index.'" selected="selected">'.$index.'</option>';
  else $select .= '<option value="'.$index.'">'.$index.'</option>';
}
$select .= '</select>';

echo $select;

Ein options-Array dafür könnte meinetwegen so aussehen:
PHP:
$options = array(
  "name1" => false,
  "name2" => true,
  "name3" => false
);
Ist aber ziemliche Platzverschwendung.

Je nachdem wie deine Options nachher aussehen sollen muss das Array natürlich anders aufgebaut sein.
 
Hallo. :)

Das Problem ist das ich die Optionen in einem Template ausgeben möchte. Sprich: PHP funktioniert nicht.

Ich kann aber Variablen nutzen wie z.B.
PHP:
$options = '<option value="01">Cola</option>';

Ich kann dann "$options" im Template verwenden.

Das Template ist mit einer PHP-Datei verknüft. Da jedoch das Template ganz zum schluss ausgegeben wird, kann ich keine "echos" verwenden, weil die dann über dem Header (ganz oben) ausgegeben werden.

Im Template steht nun:
HTML:
<form method="post" action="./skript.php">
   <select name="option1" onChange="this.form.submit()" size="1" class="style">
      $options1
   </select>
   <select name="option2" onChange="this.form.submit()" size="1" class="style">
      $options2
   </select>
</form>

Tja nun fehlt mir der richtige PHP-Teil.

Eine "Lösung" wäre:
PHP:
$options = '
<option value="01">Cola</option>
<option value="02">Fanta</option>
<option value="03">Sprite</option>
';

Ich halte das für puren Schwachsinn.

Ich benötige also eine Möglichkeit alle Optionsfelder zu generieren.

PHP:
$optionen_feld1 = array
(
   'Cola',
   'Fanta',
   'Sprite',
);

// Hier werden die Optionen "Ausgabefähig" generiert.
 
Also musst du $options1 & $options2 dynamisch befüllen. Das kannst du eigentlich genauso machen wie ich's vorhin gebeispielt hab (aber dein Beispielarray hat keine Angaben zu selected):

PHP:
//dein Array
$optionen_feld1 = array
(
   'Cola',
   'Fanta',
   'Sprite',
); 


$options1 = ''; //damit wir in der Schleife auch was zum Verbinden haben
while(list($index, $value) = each($optionen_feld1)){
  $options1 .= '<option value="'.$index.'">'.$value.'</option>';
} 

...

<select name="option1" onChange="this.form.submit()" size="1" class="style">
  $options1 //jetzt befüllt
 </select>

Da du in deinem Array keine Indizes gesetzt, wird automatisch von 0 an hochgezählt. Du hättest dann also bei den Optionsfelder keine Values wie "01, 02...", sondern "0,1...". Entweder ist das egal oder du setzt entsprechende Indizes oder fummelst da in der Schleife noch 'n bisschen rum; sag Bescheid ;)
 
Danke, der Code funktioniert schon einmal super. :)

Ich benötige die values in diesem Format: 01, 02, 03... 10, 11, 12... (Also von 01 bis 99)

Ich mag es ja nicht zu "schnorren", aber ich benötige noch ein "selected".

Danke!
 
Ich benötige die values in diesem Format: 01, 02, 03... 10, 11, 12... (Also von 01 bis 99)

sprintf() dürfte da helfen:

PHP:
$options1 = ''; //damit wir in der Schleife auch was zum Verbinden haben
while(list($index, $value) = each($optionen_feld1)){
  $selected = '';
  if( $irgendeine_Bedingung )
    $selected = ' selected="selected"';
  $options1 .= '<option value="'.sprintf("%02d", $index).'"'.$selected.'>'.$value.'</option>';
}
 
Um dann noch $irgendeine_Bedingung zu spezifizieren müsstest du nochmal aus dem Nähkästchen plaudern. Willst du das vorselektierte Feld wirklich im Template festlegen, heißt, das wird sich niemals ändern? Oder hängt es vielleicht von einer Datenbank oder den Formulareingaben des Benutzers ab?
 
Ab "01" geht nicht?

Edit:

Beim Seitenaufruf wird geprüft, ob etwas ausgewählt wurde. Wenn nicht (logisch), werden die Felder Automatisch ausgewählt.

Im weiteren Verlauf, soll das selectiert werden, was der User auswählt.

Nur ein Beispiel:
Code:
Pizzen -> Margherita -> zum liefern

EDIT:
PHP:
   $user_option = '02'; // vom User ausgewählt
   $options1 = '';

   while(list($index, $value) = each($optionen_feld1))
   {

      if($user_option ==  $index)
      {
         $selected = ' selected="selected"';
      }
         else
      {
         $selected = '';
      }

      $options1 .= '<option value="'.sprintf("%02d", $index).'"'.$selected.'>'.$value.'</option>';
   }
 
Zuletzt bearbeitet:
Zwecks den Zahlen: der Index müsste in der Schleife jeweils um 1 erhöht werden.

Tausch die Zeile
PHP:
 $options1 .= '<option value="'.sprintf("%02d", $index).'"'.$selected.'>'.$value.'</option>';
mit der aus
PHP:
$options1 .= '<option value="'.sprintf("%02d", $index+1).'"'.$selected.'>'.$value.'</option>';

Da du an deinem Array aber eh noch was ändern musst, um die automatische Auswahl zu realisieren, würd ich die entsprechenden Indizes so als Strings setzen, wie du sie nachher haben willst.

PHP:
$optionen_feld1 = array
(
  '01' => array('name' => 'Cola'),
  '02' => array('name' => 'Fanta'),
  '03' => array('name' => 'Sprite')
);

if(!isset($_POST['options1']))
	$optionen_feld1['02']['selected'] = true;
else
	$optionen_feld1[$_POST['options1']]['selected'] = true;

Damit wir den Selekt-Status abfragen können erweitern wir das Array um eine Dimension. Wir legen die Indizes fest und sparen uns dadurch den mehrfachen Funktionsaufruf in der Schleife. Dann schauen wir, ob es eine Benutzeringabe gab oder nicht. Wenn nicht, legen wir die Standardauswahl fest, wenn ja, selektieren wir das Feld des Benutzers. Hierfür müssen dann eben die Indizes stimmen, weil du sonst gezwungen wärst, die sprintf-Logik wieder umzukehren, um zu wissen, welche Eingabe der Nutzer gemacht hat.

Die Ausgabe müsste dann folgendermaßen verändert werden:

PHP:
$options1 = ''; //damit wir in der Schleife auch was zum Verbinden haben
while(list($index, $value) = each($optionen_feld1)){
  $selected = '';
  if(isset($value['selected']))
    $selected = ' selected="selected"';
  $options1 .= '<option value="'.$index.'"'.$selected.'>'.$value['name'].'</option>';
}
 
Zuletzt bearbeitet:
Das mit dem "Selected" funktioniert bei mir irgendwie nicht.

So geht es:
PHP:
   while(list($index, $value) = each($optionen_feld1))
   {

      if ($User_Eingabe == $index)
      {
          $selected = ' selected="selected"';
      }
          else
      {
          $selected = '';
      }

      $options1 .= '<option value="'.$index.'"'.$selected.'>'.$value['name'].'</option>';

   }

Ich hätte da noch zwei kleine Fragen.

Ich möchte noch gerne Zeilenumbrüche einbauen. Also so:
PHP:
$options1 .= '<option value="'.$index.'"'.$selected.'>'.$value['name'].'</option>'."\n";

Wie kann ich es verhindern das bei der letzen "Option" ein Zeilenumbruch gesetzt wird?

Und wie kann ich es anstellen das ab der 2. Option Leerzeichen mit eingefügt werden?

PHP:
$options1 .= '         <option value="'.$index.'"'.$selected.'>'.$value['name'].'</option>'."\n";

Es ist Schwachsinn, aber ich versuche den Quelltext 100% nach meinen Möglichkeiten zu gestalten. Ich bin ein Einrücken-Fetischist.

Kann mir vielleicht noch jemand helfen wenn es um ein Multidimensionales Array geht?
 
Zurück