Anfängerproblem mit selektierten Wert bei Reload

klaus

Grünschnabel
Hallo an euch alle hier im Forum.

Ich habe ein, vermutlich triviales, Anfängerproblem, bei dem ich einfach nicht weiter komme. Geholfen wäre mir sicherlich auch schon, wenn ihr mir nach Schildderung meines Problems helfen könntet, indem ihr mir sagt, nach welchen Stichworten ich suchen kann.

Die Ausgangsstellung ist folgende:

Eine Seite (html) lädt einen Platzhalter. In diese wird das Layout geladen. PHP ist komplett ausgelagert.

zur Verdeutlichung einige Auszüge:

html-Seite:
PHP:
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de-DE" lang="de-DE">
  <head>
...
  </head>
  <body>
    <div id="wrapper">
    [%content%]
    </div>
  </body>
</html>

das Layout:
PHP:
<form action="" method="post">
<fieldset>
...
<table class="form">
<tr>
<td>Empfänger:</td>
<td>*</td>
<td>
<select name="receiver" id="receiver" size="1"> 

</select>
</td>
</tr>
 ...
</table>
<p><input type="submit" name="kontakt" class="send [%case%]" value="[%kontakt%]" /></p>
<p>[%receiver%]</p>
</fieldset>
</form>

php:
PHP:
<?PHP
#######################################################################
#  um-Formmailer Skript V1.00                                         #
#  zur freien Verwendung, d. h. keinerlei Lizenzen oder Copyright     #
#  ein backlink wäre aber nett!                                       #
#  Auf jeden Fall aber bitte diesen Tag im XHTML Template einbinden:  #
#  <meta name="Generator" content="script by http://um-fritz.de" />   #
#  Danke und viel Spaß!                                               #
#  http://um-fritz.de                                                 #
#######################################################################
#
# Dieses Skript liest eine XHTML-Template Datei ein und generiert den Inhalt aus 
# dem Formulartemplate. Je nach Benutzereingaben werden verschiedenen Fälle unter-
# schieden, denen dann entsprechende Ausgaben zugeordnet werden. Bis alle Angaben
# gemacht wurden, und wenigstens eine Vorschau erfolgte, wird das Formulat erneut
# ausgegeben. Bei korrekten Angaben und erfolgter Vorschau erfolgt der Versand der
# e-mail und die Dankesseite wird ausgegeben.

#  Skriptteil, ändern auf eigene Gefahr!                                         #
$pfad = str_replace($_SERVER['DOCUMENT_ROOT'], "", dirname($_SERVER['SCRIPT_FILENAME']));
require_once ($_SERVER['DOCUMENT_ROOT'].$pfad."/global_vars.php");
$page = get_html_template ();
if (!empty($_POST['falle'])) {
  $content = "<h1>Spamfalle wurde ausgefüllt</h1>\n
  <p>Bitte die Seite erneut aufrufen</p>";
  $page = page_replace_var($page, "content", $content);
  show_page();
  exit;
}

#  Konfiguration der Selectbox!                                    #
$array = array(1 => "Äpfel", "Birnen", "Bananen", "Orangen");
for ($a = 1; $a <= 4; $a++) {
 echo " <option value=\"$array[$a]\"";
 if ($_POST["receiver"] == $array[$a]) {
  echo " selected";
 }
 else {
  if ($_POST["receiver"] == "" && $a == 3) {
   echo " selected";
  }
 }
 echo ">$array[$a]</option>\n";
}
 if (empty($_POST['receiver'])) {
  $error_msg[] = $kontakt_vars["error_no_firstname"];
  $case_name = "error";
}  else {
  $case_name = "standard";
}
#  Ende Konfiguration der Selectbox!                               #

if (empty($_POST['confirm'])) {
  create_form("standard", "standard", "standard", "standard", "undone");
}
if (!preg_match("#^[a-zA-Z\s\-]{2,40}$#", $_POST['first_name'])) {
  $error_msg[] = $kontakt_vars["error_no_firstname"];
  $case_name = "error";
}  else {
  $case_name = "standard";
}
if (!preg_match("#^[a-zA-Z0-9\.\-_\+]{1,40}@[a-zA-Z0-9\.\-_]{1,40}\.[a-zA-Z0-9\.\-_]{1,6}$#", $_POST['mail_from'])) {
  $error_msg[] = $kontakt_vars["error_no_mail_from"];
  $case_mail = "error";
}  else {
  $case_mail = "standard";
}
if (strlen($_POST['message']) < 10) {
  $error_msg[] = $kontakt_vars["error_no_message"];
  $case_message = "error";
} else {
  $case_message = "standard";
}
if (isset($error_msg)) {
  foreach ($error_msg as $f) {
    $kontakt_vars["error_legend_text"] .= "\n\t $f <br />";
  }
  create_form("error", $case_name, $case_mail, $case_message, "error");
}
  
if ( $_POST['confirm'] != "done") {
  create_form("confirm", "confirm", "confirm", "confirm", "done");
}  
#Ab hier sind keine Fehler mehr in den Benutzereingaben -> Mail senden + Dankeseite ausgeben
  mail_and_thanks();

/*##########################################################################
#                      Funktionen                                          #
##########################################################################*/

function get_html_template () {         #  Ausgabe des HTML Templates              #
  global $html_template_file;
  if(!file_exists($html_template_file)){
    echo "  <h1>Installationshinweis</h1>
    <p>Bevor Sie das Formular einsetzen, legen Sie bitte die HTML Template-Datei 
    <strong>$html_template_file</strong> an.</p>";
    exit;
  } else {
    $page = file_get_contents($html_template_file);
  }
  return ($page);
}

function create_form($case_form, $case_name, $case_mail, $case_message, $kontakt_confirm) { #  Formularseite erstellen                 #
  global $page, $form_file, $kontakt_vars;
  if (isset($_POST)) {
    encode_postdata();
  }
  if(!file_exists($form_file)){
    $content = "  <h1>Installationshinweis</h1>
    <p>Bevor Sie das Formular einsetzen, legen Sie bitte die Form Template-Datei 
    <strong>$form_file</strong> an.</p>";
  } else {
    $content = file_get_contents($form_file);
    $content = page_replace_var($content, "title", $kontakt_vars[$case_form."_headline"]);
    $content = page_replace_var($content, "headline", $kontakt_vars[$case_form."_headline"]);
    $content = page_replace_var($content, "case", $case_form);
    $content = page_replace_var($content, "self", $_SERVER['PHP_SELF']);
    $content = page_replace_var($content, "legend", $kontakt_vars[$case_form."_legend"]);
    $content = page_replace_var($content, "confirm", $kontakt_confirm);
    $content = page_replace_var($content, "legend_text", $kontakt_vars[$case_form."_legend_text"]);
    $content = page_replace_var($content, "first_name", $_POST['first_name']);
    $content = page_replace_var($content, "name", $_POST['name']);
	$content = page_replace_var($content, "phone", $_POST['phone']);
    $content = page_replace_var($content, "mail_from", $_POST['mail_from']);
    $content = page_replace_var($content, "message", $_POST['message']);
	$content = page_replace_var($content, "receiver", $_POST['receiver']);
    $content = page_replace_var($content, "kontakt", $kontakt_vars[$kontakt_confirm."_submit"]);
	$content = page_replace_var($content, "case_name", $case_name);
    $content = page_replace_var($content, "case_mail", $case_mail);
    $content = page_replace_var($content, "case_message", $case_message);
  }
  $page = page_replace_var($page, "content", $content);
  show_page();
  exit;
}

function mail_and_thanks(){         #  Mail Senden und Dankesseite ausgeben    #
  global $page, $kontakt_vars, $danke_file;
  decode_postdata();
#                                                                    mail senden
  $headers = "From: {$_POST['first_name']} {$_POST['name']} ";
  $headers .= "<{$_POST['mail_from']}>\r\n";
  $headers .= "Content-Type: text/plain; charset=iso-8859-1 \r\n";
  $headers .= "Content-Transfer-Encoding: 8bit";
  mail($kontakt_vars["mailto"], $kontakt_vars["subject"], "Vorname:\t".($_POST['first_name'])."\r\n"."Nachname:\t".($_POST['name'])."\r\n"."Telefon:\t".($_POST['phone'])."\r\n".($_POST['message']), $headers);
#                                                           Danke Seite Ausgeben
  $content = file_get_contents($danke_file);
  $page = page_replace_var($page, "title", "Danke");
  encode_postdata();
  set_br();
  $content = page_replace_var($content, "adress", $kontakt_vars['mailto']);
  $content = page_replace_var($content, "mail_from", $_POST['mail_from']);
  $content = page_replace_var($content, "message", $_POST['message']);
  $content = page_replace_var($content, "first_name", $_POST['first_name']);
  $content = page_replace_var($content, "name", $_POST['name']);
  $page = page_replace_var($page, "content", $content);
  show_page();
  exit;
}

function encode_postdata() {            #  Codieren von Code in Benutzereingabe    #
  foreach ($_POST as $key => $wert) {
    if(get_magic_quotes_gpc()) {  // wenn magic_quotes an, dann strip slashes
      $_POST[$key] = stripslashes($_POST[$key]);
    }
    if ($key != "message") {
      $_POST[$key] = trim(strip_tags($_POST[$key]));
      $_POST[$key] = str_replace("\n", "", $_POST[$key]);
      $_POST[$key] = str_replace("\r", "", $_POST[$key]);
      $_POST[$key] = str_replace("\"", "``", $_POST[$key]);
      $_POST[$key] = str_replace("'", "`",  $_POST[$key]);
    }
    $_POST[$key] = trim(preg_replace("@content-type:|bcc:|cc:|to:|from:@im", " # verbotener Inhalt # ", $_POST[$key]));
    $_POST[$key] = htmlspecialchars($_POST[$key]);
  }
}

function decode_postdata() {            #  Decodieren von Code in Benutzereingabe  #
  foreach ($_POST as $key => $wert) {
    $_POST[$key] = (stripslashes(html_entity_decode($_POST[$key])));
  }
}

function set_br() {                     #  Breaklines setzen bei Dankeformular     #
   foreach ($_POST as $key => $wert) {
    $_POST[$key] = str_replace("\n", "\t<br />\n\t", $_POST[$key]);
  }
}

function page_replace_var($template_content, $name, $value) { #  [%name%] ersetzen #
  $pattern = "[%$name%]";
  return(str_replace($pattern, $value, $template_content));
}

function show_page() {                  #  Seite ausgeben                          #
  global $page;
  echo $page;
  exit;
}

?>

So, ich hoffe, dass ich alle wichtigen Infos gegeben habe.

Nun zu meinem Problem:

Wie stelle ich es an, dass

PHP:
$array = array(1 => "Wert1", "Wert2", "Wert3", "Wert4");
for ($a = 1; $a <= 4; $a++) {
 echo " <option value=\"$array[$a]\"";
 if ($_POST["receiver"] == $array[$a]) {
  echo " selected";
 }
 else {
  if ($_POST["receiver"] == "" && $a == 3) {
   echo " selected";
  }
 }
 echo ">$array[$a]</option>\n";
}

sich auf die im Layout erstellte Selectbox bezieht und bei einem Reload der Seite der selektierte Wert erhalten bleibt?

Danke
Klaus
 
Das geht meiner unbedeutenden Meinung nach nur, wenn Du den selektierten Wert bei Auswahl über Javascript oder Ajax (als Auslöser eines PHP Befehls) in einem Keks oder einer Sitzung sofort bei Auswahl abspeichern lässt.
 
Ok, dann werde ich mir, was den reload angeht, etwas anderes überlegen.

Wie spreche ich denn im Layout das Auswahlmenue "receiver" an, so dass ich die Werte per array eintragen kann?
 
@ kuddeldaddeldu:

d.h., ich greife mit gleicher Methode innerhalb eines PHP-Scriptes auf Elemente zu wie unter Javascript?

Könntest Du es mir, zum besseren Verständnis, einmal posten? Was muss ich schreiben, damit innerhalb der php auf die selectbox zugegriffen wird, speziell der array hineingeschreiben wird?
Oder habe ich gerade ein generelles Verständnisproblem?
 
Ich sehe weder, das du ein FORM erzeugt noch ein <select>-Element in dem Sourcecode. In PHP kannst du nur auf Inhalte von HTML-Elementen zugreifen, wenn es sich dabei um FORM-Element handelt. Sprich, du benötigst mindest das hier:

HTML:
<form action="sowieso.php" method="post">
<!--- hier die Form-Elemente wie input, select, etc. -->
</form>

Was anderes ist es, wenn du eine GET-Übertragung machst (was laut deinem Sourcecode offensichtlich nicht der Fall ist.

Da wir nicht wissen, wie deine Select-Box heißt, kann ich dir nur ein Beispiel geben:

HTML:
<select name="zahlen">
<option value="1">Zahl 1</option>
<option value="2">Zahl 2</option>
<option value="3">Zahl 3</option>
</select>

Nehmen wir an, die Select-Box ist ein Element eines Form, welches an ein PHP-Script sowieso.php gesendet wird (siehe oben). Dann kannst du in sowieso.php so auf die Select-Box zugreifen:

PHP:
<?php
echo $_POST['zahlen'];
?>

Je nach dem was du nun ausgewählt hast, wirst du 1, 2 oder 3 erhalten.
 
@ saftmeister:

Das select-Element ist im Layout zu finden, welches auch das Form erzeugt.
Das select- Element enthält keine option's, weil ich diese gerne per array dort eintragen lassen möchte.
Mein Problem ist eigentlich "nur", dass ich es nicht hinbekomme, den array in das select- Element mit dem Namen "receiver" eintragen zu lassen.

Ist die select- Box mit Optionen versehen (im HTML), dann wird der selectierte Wert angezeigt über "[%receiver%]" im Layout. Das Übertragen der Daten funktioniert also.
Wenn nun eine fehlerhafte Eintragung gemacht wurde im Formular werden Fehlermeldungen ausgegeben, der selektierte Wert springt zurück auf den default- Wert. Wie verhindere ich das Zurückspringen auf den default- Wert?

An deinem Beispiel sieht das dann so aus: ich selektiere "Wert 3" und schicke das Formular ab. Irgendein Pflichfelt wurde vergessen und die Fehlermeldung erscheint. In meinem "Prüffeld" [%receiver%] ist die "3", was ja soweit richtig ist. Die select-Box zeigt aber wieder den ersten Eintrag und nicht, wie gewollt, den dritten.

Beim Googeln habe ich dann das

PHP:
$array=array('artikel1','artikel2','artikel3'); 
ECHO '<select name"receiver">'; 
FOR ($i=0; $i<count($array); $i++) { 
ECHO '<option name="$array[$i]" value="$array[$i]" '; IF ($_POST[receiver]==$array[$i]) { ECHO 'selected'; } ECHO ' >'.$array[$i].'</option>'; 
} 
ECHO '</select>';

gefunden. Das führt mich aber wieder zu dem Problem, dass es zwar angezeigt wird, aber nicht innerhalb des Formulars bzw. der select- box, die ich erstellt habe.
 
Zurück