PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Input-Typ ermitteln?


dfluess
21.04.2006, 10:02:32
Hallo,

ist es möglich den Input-Typ zu ermitteln?
Mit meinem derzeitigen Code lese ich alle Input-Felder aus und filtere bereits unerwünschte hidden-Felder hinaus.

Ich möchte aber, dass die Schleife erst garkeine Hidden-Felder berücksichtigt! ist das Möglich?
Mein Code sieht derzeit so aus:

function set_hidden ($content, $conf) {
$this->get_post = array_merge($_GET, $_POST);
if (is_array($this->get_post)) {
foreach($this->get_post as $k => $v) {
if ($k == "id") {
$var = '<input type="hidden" name="id" value="'.$v.'">';
$hidden .= substr_replace($var, '', 0);
}
else if ($k == "submitted" ) {
$var1 = '<input type="hidden" name="submitted" value="'.$v.'">';
$hidden .= substr_replace($var1, '', 0);
}
else if ($k == "L" ) {
$var1 = '<input type="hidden" name="L" value="'.$v.'">';
$hidden .= substr_replace($var1, '', 0);
} else {
$hidden .= '<input type="hidden" name="'.$k.'" value="'.$v.'" >';
}
}
return $hidden;
}
}

xabbuh
21.04.2006, 14:20:19
Das wird nicht funktionieren. Ein hidden-Field ist lediglich ein Darstellungselement von HTML, welches den Browser dazu anweist, dieses nicht anzuzeigen. Mit der Übertragung über das HTTP hat der Typ des Formularfeldes nichts zu tun.
Was hast du denn überhaupt vor?

dfluess
21.04.2006, 14:30:18
Das ist für mehrseitige Formulare.
Alle Eingaben werden über hidden-Felder durchgereicht. Dieses kleine script erzeugt automatisch die entsprechenden Felder.

Für Checkbuttons funktioniert da zwar auch aber der Zustand kann nach dem setzten nicht mehr gelöscht werden.

Ich möchte erreichen, dass ein hidden-Feld wieder gelöscht wird, wenn ein checked nicht gesetzt - also das Checkbutton nicht aktiviert wurde.

Denn der Zustand einer abgehakten Checkbox bleibt so lange, wie auch das hiddenfeld mit dem value vorhanden ist.

Oder hast du eine andere Idee?

Valentin
21.04.2006, 16:47:33
Hallo,

speichere die Daten der Formulare doch in eine Session.

MfG
V@lentin

dfluess
21.04.2006, 16:50:41
Hatte ich auch schon in Betracht gezogen. Aber ich bin noch zu sehr newby um zu verstehen, wie die Werte samt informationen (Optios- Checkbuttons) auf die nächste Seite und zurück iwieder n die Eingabefelder kommen..

Weist Du das?

D.

Valentin
21.04.2006, 16:57:40
Hallo,

warum möchtest du sie wieder in die Checkboxen? Du holst alle ab, wie du es jetzt auch hast, dann sind sie ja in einem Array. Das sehe ich doch richtig, oder? Dieses Array nimmst du und speicherst es in einer Session.


<?php
session_start(); // startet die session, muss vor jeder ausgabe sein. ....

// $this->get_post ist dein array

$_SESSION["checkboxen1"] = $this->get_post; // speichert es in einer Session

// ....
// auf der letzten seite das array abholen
$checkboxen = $_SESSION["checkboxen1"];
// jetzt existiert das array $checkboxen
?>


Am besten schaust du dir dies noch an:
http://php.codermeet.de/einf_session.php

MfG
V@lentin

dfluess
21.04.2006, 17:10:05
Also es geht darum:

Ein umfangreiches Formular soll nicht auf einer einzigen Seite ausgefüllt werden sondern über mehrere Seiten.

Sind alle Felder auf Seite1 eingefüllt, dann weiter zur nächsten (usw). Nun müssen zum Schluss alle Werte bis zur letzten Seite weitergereicht werden um das Formular schließlich komplett zu versenden.

Das ist aber noch nicht alles! Denn das wichtigste ist, dass alle Werte auch noch in den Feldern stehen, wenn jemand wieder zurück auf eine der ersteren Seiten klickt.

Ich hatte das mit Hiddenfelder gelöst. Nur funktioniert das nicht mit Checkbuttons, weil "checked" nicht über hiddens gespeichert werden können.

Es soll also so sein, dass - wenn auf der ersten Seite ein Checkbutton geklickt war - dieses nach einem Rücksprung auch wieder aktiv ist bzw ausgeschaltet werden kann.

Ideen?

Valentin
21.04.2006, 17:18:05
Hallo,

du musst eben jeden Feld einen eindeutigen Namen geben ... also bestellen wir jetzt z.B. mal eine Pizza über 3 Seiten ..... auf der ersten gibt es Käse ...

du machst folgende Checkboxen:


<input type="checkbox" name="emmentaler" value="ja"> Emmentaler
<input type="checkbox" name="mozarella" value="ja"> Mozarella
<input type="checkbox" name="schafskaese" value="ja"> Schafskäse


Jetzt klicke ich ok. Dann speicherst du alle Felder in einer Session:


<?php
session_start();
$_SESSION["zutaten"]["emmentaler"] = $_POST["emmentaler"];
$_SESSION["zutaten"]["mozarella"] = $_POST["mozarella"];
$_SESSION["zutaten"]["schafskaese"] = $_POST["schafskaese"];
?>


Jetzt steht entweder nichts oder etwas drin .... nun klicke ich zurück ... dann soll es ausgefüllt sein, also machst das obere Formular so aussehen:


<?php
session_start(); // nicht vergessen!
<input type="checkbox" name="emmentaler" value="ja" <?php if(isset($_SESSION["zutaten"]["emmentaler"]) and $_SESSION["zutaten"]["emmentaler"] == "ja") echo 'checked="checked"'; ?>> Emmentaler
...


Und so weiter musst du jede Seite machen ....

MfG
V@lentin

dfluess
21.04.2006, 17:43:26
Vielen Dank für die Geduld aber wenns doch so einfach wäre..

ich habe vergessen zu erwähnen, dass die Formulare nicht fix sind.
Die Ausgaben also nicht direkt mit <? echo.. in die Felder geschrieben werden. Stattdessen müssen es Variablen sein.

Die Formulare müssen also quasi nach vorhandenen Input-Feldern geparst werden. (hatte bisher eine Schleife für Hiddenfelder gemacht) Denn wenn diese im Formular stehen, dann übernimmt das Formular ja selbständig wieder die Werte.

Mein Code:
function set_hidden ($content, $conf) {
$this->get_post = array_merge($_GET, $_POST);
if (is_array($this->get_post)) {
foreach($this->get_post as $k => $v) {
if ($k == "id") {
$var = '<input type="hidden" name="id" value="'.$v.'">';
$hidden .= substr_replace($var, '', 0);
}
else if ($k == "submitted" ) {
$var1 = '<input type="hidden" name="submitted" value="'.$v.'">';
$hidden .= substr_replace($var1, '', 0);
}
else if ($k == "L" ) {
$var1 = '<input type="hidden" name="L" value="'.$v.'">';
$hidden .= substr_replace($var1, '', 0);
} else {
$hidden .= '<input type="hidden" name="'.$k.'" value="'.$v.'" >';
}
}
return $hidden;
}
}

Wie Du siehst entferne ich schon ein paar weil diese bereits im Formular stehen und doppelt wären..

Ich suche ganz einfach eine Möglichkeit hiddens für Checkboxen wieder zu löschen, wenn diese nicht angehakt ist..

Das ganze müsste halt (wenns mit einer Session funktionieren würde) dafür portiert werden.. geht das?

Valentin
21.04.2006, 17:48:40
Hallo,

es ist doch schon einmal ein anfang .... allerdings weißt du ja auf der Seite, wo du gerade bist die namen, oder?


<?php
session_start();
function get_form ($content, $conf) {
$this->get_post = array_merge($_GET, $_POST);
if (is_array($this->get_post)) {
foreach($this->get_post as $k => $v) {
$_SESSION["formular"][$k] = $v;
}
}
}
?>


Dann wird es ja alles was es gibt gespeichert. Nachdem du ja keine Hidden mehr brauchst, musst du ja nichts aussortieren ... nun hast du ja das Array $_SESSION["formular"] ... bei dem Formular selber hast du ja auch den Namen, oder? ... da kannst du ja die Abfrage machen, wie ich es oben gezeigt hab. Und am Ende hast du die ganzen Daten im Array.

MfG
V@lentin

dfluess
21.04.2006, 18:48:00
es ist doch schon einmal ein anfang .... allerdings weißt du ja auf der Seite, wo du gerade bist die namen, oder?


Du meinst den Namen des Formulars oder.. ja der ist zwar auch dynamisch aber den kann ich abfangen.

Und die Werte werden auch seite vor-zurück wieder in die Felder gesetzt?? sorry ich bin noch zu "grün" in PHP ..

Leider muss ich jetzt wech, hätte das gern weiter probiert. Ich danke Dir schon einmal für Deine Hilfe, so wie's aussieht hilft mir das aber weiter..
D.

dfluess
21.04.2006, 21:40:31
Hallo nochmal - wieder .

Natürlich habe ich die Namen im Formular, die sind ja statisch eingetragen.

Trotzdem geht mir immer noch kein Licht auf.
Wie bekomme ich die Werte ins Formular zurück? Wie schon gesagt, im valuefeld selbst kann ich nicht mit PHP-Befehlen arbeiten. Im weiteren Scriptverlauf werden diese Daten über einen eigenen Marker eingetragen.

Diese Marker (kein php) sind leider unantastbar. Letztlich werden aber auch nur die Werte, aus der Variablen $v zurückgeliefert.

Wenn Du interessiert bist, dann sende ich mal die ganze Classe.

D.

Valentin
21.04.2006, 21:45:12
Hallo,

wie übergibst du dem "Marker" die Daten? Über ein Formular? Oder warum möchtest du die Daten wieder zurück ins Formular bekommen?

MfG
V@lentin

dfluess
21.04.2006, 22:19:58
Dem Marker werden Die daten über die PHP-Klasse übergeben. und brauchen tu ich das, damit ich Formulare über meherere Seiten ausfüllen kann. Dabei sollen die Felder nach einem Rücksprung wieder im Feld stehen. (s.u.)

Ich packe mal die klasse zam. Funktionen zum Checken der Felder und das Senden lass ich mal weg.. genau so wie den ganzen Kram der nix direkt mit meiner Frage zu tun hat..



class ux_tx_thmailformplus_pi1 extends tx_thmailformplus_pi1 {
var $extKey = "df_mailformplus_ext"; // The extension key.

function main($content, $conf) {
session_start();
$this->pi_loadLL();
global $TSFE; // new in release 2.2: automatic "no-cache" pagesetting
$TSFE->set_no_cache();
$this->conf = $conf;
$this->get_post = array_merge(t3lib_div::_GET(), t3lib_div::_POST());
$this->debug = $this->conf['saveDB.']['debug'];
switch((string)$conf["CMD"]) {
case "singleView":
print "singleView<br>";
list($t) = explode(":", $this->cObj->currentRecord);
$this->internal["currentTable"] = $t;
$this->internal["currentRow"] = $this->cObj->data;
return $this->pi_wrapInBaseClass($this->singleView($content, $conf));
break;
default:
$mailformplus_id = $this->cObj->data['pages'];
# default: display the form from the page where the plugin is inserted
if (!$mailformplus_id) $mailformplus_id = $this->cObj->data['pid'];
// Initializing the query parameters:
$query = "SELECT tx_thmailformplus_main.* FROM tx_thmailformplus_main WHERE pid IN (".$mailformplus_id.") LIMIT 0,1";
$res = $GLOBALS['TYPO3_DB']->sql(TYPO3_db, $query);
if (mysql_error()) debug(array(mysql_error(), $query));
$this->internal["currentTable"] = "tx_thmailformplus_main";
$this->internal["currentRow"] = mysql_fetch_array($res);

#############
# template
#############
t3lib_div::loadTCA('tx_thmailformplus_main');
$config = $GLOBALS['TCA']['tx_thmailformplus_main'];
# old version: copy of template file in upload folder
if ($config[columns][email_htmltemplate][config][uploadfolder]) $template_folder = $config[columns][email_htmltemplate][config][uploadfolder].'/';
else $template_folder = '';
$this->templateCode_orig = t3lib_div::getURL($template_folder.$this->getFieldContent("email_htmltemplate"));
# compatibility reasons: look for copy of template in uploads directory
if (!$this->templateCode_orig) {
$template_folder = "uploads/tx_thmailformplus/";
$this->templateCode_orig = t3lib_div::getURL($template_folder.$this->getFieldContent("email_htmltemplate"));
}

# Form was submitted
if (t3lib_div::GPvar("SUBMITTED") || t3lib_div::GPvar("submitted")) {
$this->loadMapping($conf);
$this->templateCode_error = $this->cObj->getSubpart($this->templateCode_orig, "###TEMPLATE_ERROR###");
$error = $this->check_form($content, $conf);
if ($error) {
# self defined error message start
$temp = $GLOBALS["TSFE"]->cObj->getSubpart($this->templateCode_error, "ERROR_START");
if ($temp) {
$error = $temp.$error;
} else {
$error = $this->pi_getLL('error_list').'<br />'.$error.'<br />';
}
# self defined error message end
$temp = $GLOBALS["TSFE"]->cObj->getSubpart($this->templateCode_error, "ERROR_END");
if ($temp) {
$error .= $temp;
}
$this->error = $error;
$this->templateCode = $this->cObj->getSubpart($this->templateCode_orig, "###TEMPLATE_FORM###");
return $this->pi_wrapInBaseClass($this->show_form($content, $conf));
}

else if ($this->getFieldContent("tx_dfmailformplusext_form_next") != "") {
$this->templateCode = $this->cObj->getSubpart($this->templateCode_orig, "###TEMPLATE_FORM###");
$message .= $this->pi_getLL('message_form_next');
return $this->pi_wrapInBaseClass($this->show_form($content, $conf)).$message;
} else {
$this->templateCode = $this->cObj->getSubpart($this->templateCode_orig, "###TEMPLATE_SUBMITTED_OK###");
$this->templateCode_useremail = $this->cObj->getSubpart($this->templateCode_orig, "###TEMPLATE_EMAIL_USER###");
$this->templateCode_receiver = $this->cObj->getSubpart($this->templateCode_orig, "###TEMPLATE_EMAIL_RECEIVER###");
$this->send_form($content, $conf);
return $this->pi_wrapInBaseClass($this->templateCode);
}
} else {
$this->templateCode = $this->cObj->getSubpart($this->templateCode_orig, "###TEMPLATE_FORM###");
# compatibility to old version (no placeholder specified)
if (!$this->templateCode) $this->templateCode = $this->templateCode_orig;
if ($this->getFieldContent("tx_dfmailformplusext_form_next") != "") {
return $this->pi_wrapInBaseClass($this->show_form($content, $conf));
}
return $this->pi_wrapInBaseClass($this->show_form($content, $conf));
}
break;
}
}


function show_form($content, $conf) {
$this->get_post = array_merge($_GET, $_POST);
$globalMarkerArray = array();
# merge error-array with globalMarkerArray
if (is_array($this->errors)) {
$globalMarkerArray = $this->errors;
}
#############################
# define markers
#############################
if (is_array($this->get_post)) {
foreach($this->get_post as $k => $v) {
if (!ereg('EMAIL_', $k)) {
$globalMarkerArray['###value_'.$k.'###'] = $v;
$globalMarkerArray['###checked_'.$k.'_'.$v.'###'] = 'checked';
$globalMarkerArray['###selected_'.$k.'_'.$v.'###'] = 'selected';
}
}
}
#############################
# if user is logged in - make user data accessible via "###FEUSER_[field]###"
#############################
if (is_array($GLOBALS["TSFE"]->fe_user->user)) {
foreach($GLOBALS["TSFE"]->fe_user->user as $k => $v) {
$globalMarkerArray['###FEUSER_'.strtoupper($k).'###'] = $v;
}
}
#############################
# markers defined via TypoScript
# example: plugin.tx_thmailformplus_pi1.markers.abteilungen < temp.jsmenu
#############################
if (is_array($conf['markers.'])) {
$lastKey = '';
foreach (array_keys($conf['markers.']) as $key) {
if (FALSE == strstr($lastKey, '.') && !is_array($conf['markers.'][$key])) {
$lastKey = $key;
} else {
$ts_marker = $this->cObj->cObjGetSingle($conf['markers.'][$lastKey], $conf['markers.'][$lastKey.'.']);
$globalMarkerArray['###'.$lastKey.'###'] = $this->cObj->substituteMarkerArray($ts_marker, $globalMarkerArray);
}
}
}
################################
# marker for captcha extension
################################
$error = $this->check_form($content, $conf);
if (t3lib_extMgm::isLoaded('captcha')) {
$globalMarkerArray["###CAPTCHA###"] = '<img src="'.t3lib_extMgm::siteRelPath('captcha').'captcha/captcha.php" alt="" />';
}
$globalMarkerArray["###EMAIL_SUBJ###"] = $this->getFieldContent("email_subject");
$globalMarkerArray["###EMAIL_REDIRECT###"] = $this->getFieldContent("email_redirect");
$globalMarkerArray["###EMAIL_SENDER###"] = $this->getFieldContent("email_sender");
$globalMarkerArray["###EMAIL_TO###"] = $this->getFieldContent("email_to");
$globalMarkerArray["###EMAIL_REQUIREDFIELDS###"] = $this->getFieldContent("email_requiredfields");
$globalMarkerArray['###ERROR###'] = $this->error;
$globalMarkerArray['###FORM_EXAMINE###'] = $this->select_gateway($content, $conf);
$globalMarkerArray['###FORM_EXAMINE_AD###'] = $this->address_pruef($content, $conf);
$globalMarkerArray['###FORM_EXAMINE_KT###'] = $this->kto_pruef($content, $conf);
$globalMarkerArray['###FORM_EXAMINE_CC###'] = $this->cc_pruef($content, $conf);
$globalMarkerArray['###SUBMIT_BACK###'] = $this->set_form_submit_back($content, $conf);
$globalMarkerArray['###SUBMIT_NEXT###'] = $this->set_form_submit_next($content, $conf);
$globalMarkerArray['###HIDDENFIELDS###'] = $this->set_hidden($content, $conf);
$globalMarkerArray['###PID###'] = $GLOBALS["TSFE"]->id;
if ($this->getFieldContent("tx_dfmailformplusext_form_next") != "" && $error == "") {
$globalMarkerArray['###PID###'] = $this->getFieldContent("tx_dfmailformplusext_form_next");
}
$this->templateCode = $this->cObj->substituteMarkerArray($this->templateCode, $globalMarkerArray);
$this->templateCode = ereg_replace('###[A-Za-z_1234567890]+###', '', $this->templateCode);
return $this->templateCode;
return $this->getFieldContent("email_to");
}


function set_hidden ($content, $conf) {
$this->get_post = array_merge($_GET, $_POST);
if (is_array($this->get_post)) {
foreach($this->get_post as $k => $v) {
if ($k == "id") {
$var = '<input type="hidden" name="id" value="'.$v.'">';
$hidden .= substr_replace($var, '', 0);
}
else if ($k == "submitted" ) {
$var1 = '<input type="hidden" name="submitted" value="'.$v.'">';
$hidden .= substr_replace($var1, '', 0);
}
else if ($k == "L" ) {
$var1 = '<input type="hidden" name="L" value="'.$v.'">';
$hidden .= substr_replace($var1, '', 0);
} else {
$hidden .= '<input type="hidden" name="'.$k.'" value="'.$v.'" >';
}
}
return $hidden;
}
}

Valentin
21.04.2006, 22:40:16
Hallo,

dann brauchst du das ganze garnicht mit den Hiddens machen. Du kannst alles in die Session speichern. Und dies am schluss, oder wenn jemand zurück klickt auslesen...

Versuch es einfach mal so einzubauen wie ich vorher in ein paar Posts beschrieben habe ;)

MfG
V@lentin

Heinrich
21.04.2006, 22:53:11
Hi, im Zitat unten hat Valentin doch beschrieben, wie es geht:

Hallo,

du musst eben jeden Feld einen eindeutigen Namen geben ... also bestellen wir jetzt z.B. mal eine Pizza über 3 Seiten ..... auf der ersten gibt es Käse ...

du machst folgende Checkboxen:


<input type="checkbox" name="emmentaler" value="ja"> Emmentaler
<input type="checkbox" name="mozarella" value="ja"> Mozarella
<input type="checkbox" name="schafskaese" value="ja"> Schafskäse


Jetzt klicke ich ok. Dann speicherst du alle Felder in einer Session:


<?php
session_start();
$_SESSION["zutaten"]["emmentaler"] = $_POST["emmentaler"];
$_SESSION["zutaten"]["mozarella"] = $_POST["mozarella"];
$_SESSION["zutaten"]["schafskaese"] = $_POST["schafskaese"];
?>


Jetzt steht entweder nichts oder etwas drin .... nun klicke ich zurück ... dann soll es ausgefüllt sein, also machst das obere Formular so aussehen:


<?php
session_start(); // nicht vergessen!
<input type="checkbox" name="emmentaler" value="ja" <?php if(isset($_SESSION["zutaten"]["emmentaler"]) and $_SESSION["zutaten"]["emmentaler"] == "ja") echo 'checked="checked"'; ?>> Emmentaler
...


Und so weiter musst du jede Seite machen ....

MfG
V@lentin
Vergiss deine hiddens und auch deine class, wenn du damit nicht zurecht kommst.

Schau die mal www.ferienwohnung-salzkammergut.de an und geh den Buchungsvorgang durch (halt nur bis vor Abschicken, sonst musst du in meiner Hütte in Österreich übernachten *ggg*). Das ist eine einfache Session über mehrere Seiten, bei der die Eingaben auch bei "zurück auf die vorige Seite" erhalten bleiben. Nix class, nix hidden.
Wenn du meinst, so sollte es sein, poste ich dir die Code-Teile - auch für Checkboxen usw.

Gruß
heinrich

dfluess
23.04.2006, 11:54:55
Danke, aber was mache ich nur falsch?

ich habe die Funktion nun so eingebaut:

function get_form ($content, $conf) {
session_start();
$this->get_post = array_merge($_GET, $_POST);
if (is_array($this->get_post)) {
foreach($this->get_post as $k => $v) {
$_SESSION["formular"][$k] = $v;
}
}
}

Werte werden noch immer nicht behalten, bzw. bei Rücksprung wieder eingesetzt.

Muss session_start() nicht auch in der Funktion stehen (function show_form), von wo die Seite ausgegeben wird? Ich habe es versucht aber auch da bringts auch nichts..
Ich stelle mich wirklich zu blöd an ich weis, aber kannst Du es nicht ein bisschen mehr für einen Anfänger erklären? Wo muss was wie hinein?

Ist ja nicht so, dann ich mir keine Mühe gebe, aber mir geht nun seit über einer Woche immer noch kein Licht auf.

D.

dfluess
23.04.2006, 12:04:03
@heinrich
Danke für Deine Anregung. Aber ich Muss das eben in dieser Class machen. Denn diese ist Bestandteil einer Extension für das CMS TYPO3. Ich möchte aus der bestehenden Extension eine XCLASS aufsetzen die Mehrfachformulare unterstützt. Deshalb kann ich auch nicht einfach den Kern verändern denn die Extension soll natürlich nicht nur für mich sein.

Wie ich schon sagte, die Namen sein niemals fest und auch die Werte nicht. Deshalb kann ich kein Formular Hard-Codieren. Ein Formular ist nichts weiter als ein Template ohne php-Bestandteile. Der Benutzer kennt nur das Prinzip über die Platzhalter (siehe Code)

Daraus muss ich das beste machen. Danke für Dein Angebot aber das wird mir in diesem Fall nicht viel helfen. Denn die Classe ist Bestandteil eines größeren.

Viele Grüße

Valentin
23.04.2006, 12:10:54
Hallo,

eine session_start(); muss auf jedes Dokumment wo du eine SESSION benützt, nicht in die Funktion, im Dokument reicht. Überprüfe am Besten, ob überhaupt etwas in die Session geschrieben wird, bzw etwas deiner Funktion übergeben wird.

Am einfachsten Funktioniert das, wenn du das Session-Array mit print_r (http://www.php.net/print_r) ausgibst ...:


function get_form ($content, $conf) {
$this->get_post = array_merge($_GET, $_POST);
if (is_array($this->get_post)) {
foreach($this->get_post as $k => $v) {
$_SESSION["formular"][$k] = $v;
}
}
print_r($_SESSION["formular"]);
}


Dann machst du auf einer anderen Seite mal das gleiche print_r(). Beachte das die Session entweder die Session ID über einen Cookie übertragen werden sollte, oder über die URL (http://tut.php-q.net/sessions.html#u4).

MfG
V@lentin

dfluess
23.04.2006, 12:21:09
Vielleicht nocheinmal zur Verdeutlichung.

Dies ist aus der Funktion, wo die Marker ersetzt werden:
if (is_array($this->get_post)) {
foreach($this->get_post as $k => $v) {
if (!ereg('EMAIL_', $k)) {
$globalMarkerArray['###value_'.$k.'###'] = $v;
$globalMarkerArray['###checked_'.$k.'_'.$v.'###'] = 'checked';
$globalMarkerArray['###selected_'.$k.'_'.$v.'###'] = 'selected';
}
}
}

Der Benutzer gibt also das Formular so an:
Textfeld:
<input type="text" name="hallo" value="###value_hallo###">

Für Checkbuttons:
<input type="checkbox" name="ok" value="###value_ok###" ###checked_ok_Ja###>

Jetzt müssen die Werte von Seite zu Seite transportiert und jeweils wieder in die Felder...habe wie im Vorschlag von @heinrich die Schleife für Sessions geändert.

function set_hidden ($content, $conf) {
session_start();
$this->get_post = array_merge($_GET, $_POST);
if (is_array($this->get_post)) {
foreach($this->get_post as $k => $v) {
$_SESSION["formular"][$k] = $v;
}
}
}


Was ich nicht weis: Wie bekomme ich die Werte zurück in die Felder, ohne php-Code in das Formular zusetzen.. Denn das ganze muss immer über die Platzhalter geschehen.

Viele Grüße,

Valentin
23.04.2006, 12:31:03
Hallo,

das war zwar mein Vorschlag auf der Vorseite .... aber egal ....

Du kannst doch bestimmt dem Templatesystem Variablen übergeben, oder? Also übergibst du der Seite wenn möglich ein Array, ansonsten musst du jede einzeln übergeben.

Danach tust du dort abfragen, ob die box checked war, also selektiert, bzw was in einem Input feld stand. Nachdem du die Namen der Felder hast, kennst du auch den jeweiligen Namen im Array.

MfG
V@lentin

dfluess
23.04.2006, 12:40:31
Hallo Valentin,

Deinen Bemühungen aller Ehre aber für mich ist das reine Theorie und theoretisch ist mir schon länger klar, wie das funktionieren muss. Ich hab nur leider zu wenig Wissen um das umzusetzen.
Wenn ich mehr Zeit hätte, dann würde ich mir erst mal ein paar Bücher kaufen und ein paar Wochen lernen. Diese zeit hab ich leider nicht :-(

Danach tust du dort abfragen, ob die box checked war
Schon allein das bereitet mir Probleme. Wenn ich das wüsste, dann hätte ich theoretisch ja auch das hidden-Feld wieder löschen lassen können...

Ich fürchte, hier muss mir jemand ausnahmsweise mit einem fast fertigen Code unter die Arme greifen.. Sorry :-/

Diese Extension wird kostenlos in eine TYPO3 Responstiy geladen, bin gern bereit, meinen Dank an den Helfer im Quellcode zu verewigen ;-)

Viele Grüße,

dfluess
23.04.2006, 12:51:06
print_r($_SESSION["formular"]);

also das klappt schon mal!
Zwar wird mir dann das ganze Array zusammen mit einem Fehler ausgegeben, aber das liegt daran, dass keine echo/print-Befehle in der Classe richtig funktionieren.



Am einfachsten Funktioniert das, wenn du das Session-Array mit print_r (http://www.php.net/print_r) ausgibst ...:


function get_form ($content, $conf) {
$this->get_post = array_merge($_GET, $_POST);
if (is_array($this->get_post)) {
foreach($this->get_post as $k => $v) {
$_SESSION["formular"][$k] = $v;
}
}
print_r($_SESSION["formular"]);
}


Dann machst du auf einer anderen Seite mal das gleiche print_r(). Beachte das die Session entweder die Session ID über einen Cookie übertragen werden sollte, oder über die URL (http://tut.php-q.net/sessions.html#u4).


Hier verstehe ich aber schon wieder was nicht. Ich denke die Session ist im Array gespeichert und muss nur noch wieder aufgerufen werden? ..
Jetzt kommt ein Cookie oder ein URL-Parameter hinzu..

Wenn das nicht in der Classe gemacht werden müsste .. kein Problem.. Aber nun muss ich ja schon wieder im Teplate um Formularaufruf was ändern?!..

Valentin
23.04.2006, 13:25:07
Hallo,

vielleicht musst du das garnicht machen, da Typo3 bestimmt schon eine Session hat, zumindest kann man davon ausgehen.

Du solltest dir anschauen wie du Variablen den Templates übergibst. Vielleicht findest du ja auf einer Typo3 Seite ein Manual ;)

MfG
V@lentin

dfluess
23.04.2006, 13:57:11
Also eine Benutzersession gibts schon aber ich glaube nur nach einer Benutzer Anmeldung. Eine einfache Session in dem Sinn wird so viel ich weiß nicht gestartet.

Und das ganze über Cookies zu lösen ist sicher auch nicht immer sinnvoll denn die haben viele abgeschaltet. Gibts denn keine elegantere Lösung, die auch ohne viel Drumherum und Aufwand funktioniert? Wie gesagt, das mit den Hiddenfeldern funktioniert ja schon prima. Das einzige Problem sind eben die Checkbuttons.
Wenn man abfragen könnte ob "checked" oder nicht, dann würde ich bloß diese hidden-Zeile in der Schleife lösche lassen und schon wäre das Problem gelöst.
Du sagtest doch man könne das feststellen. Wie denn? Ich habe mir bei Google schon die Finger wund getippt und bin dann schließlich hier im Forum gelandet ;-)

Was ich noch gerade festgestellt hab, mit print_r($_SESSION["formular"]); werden auch leere variablen angezeigt, also auch Inputfelder ohne einträge und außerdem kann kein "checked" übergeben werden. Dann frage ich mich, wo der Vorteil gegenüber eines Hiddenfields ist... (für mich) gleichwohl komplizierter.

Ich habe einen Codeschnipsel aus einem commerz. Programm für Mehrfachformulare gefunden, wo die Übergabe auch über Hidden-Felder Passiert (scheint ja die gängige Methode zu sein?!)

Kann ich das nicht irgendwie für meine Zwecke verwenden?

###################################################################### ##########################
// Appending POST variables as hidden fields
for ($i = 0; $i < count($lines); $i++) {
if (preg_match("/(<\/form>)/i", $lines[$i])) {
$hfields = "";
foreach ($FORM as $k => $v) {
if (preg_match("/^page_no/", $k)) {
$v++;
}
$hfields .= '<input type="hidden" name="'.$k.'" value="'.stripslashes($v).'">'."\n";
}
if (!$FORM[page_no]) {
$hfields .= '<input type="hidden" name="page_no" value="1">'."\n";
}
$lines[$i] = preg_replace("/(<\/form>)/i", "$hfields\\1", $lines[$i]);
}
}
BrowserOut($lines);
} else {
if (preg_match("/^_redirect/", $key) and $browser_out < 2) {
$browser_out++;
Header("Location: ".$FORM[$key]);
}
}
}

###################################################################### ##########################

Heinrich
23.04.2006, 15:23:00
Hi,

ich bin bei dem ganzen Thread und hiddens-dingens schon ganz dusselig. Aber vielleicht ist es das, was du suchst:
printf('<label><input name="kindb" type="checkbox" value="ja" %s></label>
<b>ein Kinderbett</b>',

(isset($_SESSION['kindb']) AND $_SESSION['kindb']=='ja')
? 'checked = "checked"'
: '');
Damit geht's bei mir. D.h., wenn jemand auf diese Seite zurück geht, sind die Checkboxen so, wie er sie angeklickt hatte.

Gruß
Heinrich

dfluess
23.04.2006, 15:28:43
Hmm interessanter Ansatz! Mal sehen ob ich das für meine Zwecke umgemodelt bekomme. Denn Du machst das ja auch mit Sessions und das ist mir noch zu sehr suspekt (zu wenig Sachverständnis). Wenn das mit dem hidden ( ;-) ) auch funktioniert, dann ist das wohl die Lösung.

Danke!

dfluess
23.04.2006, 16:33:53
Schluss für heute, ich werd sonst noch verrückt! Ich bekomms einfach nicht auf die Reihe.. Geht natürlich so nicht. Ich lasse für heute Sonntag Sonntag sein.

Ich bin dankbar für jede Lösung, wenn diese denn im Zusammenhang mit meiner Class (s.o.) funktioniert. Entweder Sessions oder via hidden.. oder was sonst noch funktioniert. Danke an alle Die mir helfen/geholfen haben.

D.

Heinrich
23.04.2006, 21:54:06
Hi,

hoffe, du hattest einen entspannten Restsonntag. Also - keep cool mit den Sessions.

Du setzt auf jeder Seite ein
<?php
session_start();
?>
Dann hast du auf Seite 1 dein Input-Feld (die Checkbox - so, wie ich es beschrieben habe). Den Wert holst du dir auf der nächsten Seite mit
$var = $_POST['var'];
danach definierst du die auf der gleichen Seite als Session-Variable:
$_SESSION['var'] = $var;
So müsste es auch bei restriktiven Einstellungen (register_globals auf off) funktionieren. Also dann mach mal dran - morgen.

Gruß
Heinrich

dfluess
23.04.2006, 22:13:54
Naja.. kann schlecht abschalten und schaue gerade noch mal rein.

Danke.. ich werde mit meinem noch mageren php-Wissen versuchen das umzusetzen. Erschwerend kommt hinzu, dass das ganze immer in dieser Class funktionieren muss und im Formular selbst kein php-Code vorhanden sein darf.

Viele Grüße

Heinrich
23.04.2006, 23:18:06
Hi letzte Meldung vor *iieehhh* Montag.

wie gesagt, ich habe mir das ganze Ding nicht angeschaut. Aber wenn du eine class einbindest, muss auch PHP-Code möglich sein. Du kannst den beliebig beginnen und wieder abschließen und wieder beginnen.....

Wie ich es mit
<?php
session_start()
?>
gemacht habe.

Hab' ne ruhige Nacht!

Heinrich

dfluess
24.04.2006, 07:54:54
Guten Morgen..

Aber wenn du eine class einbindest, muss auch PHP-Code möglich sein. Du kannst den beliebig beginnen und wieder abschließen und wieder beginnen.....

Schon klar :-) Natürlich könnte ich auch in der Formularseite php einsetzen, will ich aber nicht oder besser gesagt, "darf" ich nicht!

Das Formular ist dynamisch (s.u.), die Felder werden über Platzhalter gehandelt (s.u.). Der Anwender soll überhaupt keinen php Code zu sehen bekommen wenn er Sein Formulartemplate erstellt und das muss auch so sein. Das heißt aber nicht, dass für das Formular gar kein php verwendet wird im Gegenteil.

Wie gesagt, wenn's interessiert, dann poste ich gern mal die ganze Class...

Mal sehen ob ich heute einen Weg finde..

dfluess
24.04.2006, 09:28:45
Hallo wieder

ich habe noch immer das Problem, die Sessionvariablen wieder auszulesen.
Das Array wird geschrieben und ist auch in jeder Seite vorhanden. Das kann ich über den Test mit "print_r($_SESSION["formular"]);" sehen.

Im Code wird das ersetzten der Platzhalter so gemacht:
#############################
# define markers
#############################
if (is_array($this->get_post)) {
foreach($this->get_post as $k => $v) {
if (!ereg('EMAIL_', $k)) {
$globalMarkerArray['###value_'.$k.'###'] = $v;
$globalMarkerArray['###checked_'.$k.'_'.$v.'###'] = 'checked';
$globalMarkerArray['###selected_'.$k.'_'.$v.'###'] = 'selected';
}
}
}


Mus nicht in die Zeileforeach($this->get_post as $k => $v) { Die Session auch reingeschrieben werden?
Ich meine, woher soll der Wert dann kommen?
Aber wie mache ich das:
Das hier hat NICHT funktioniert:
foreach($this->get_post as $_SESSION["formular"][$k] => $v) {

Wie muss das richtig heißen?

Valentin
24.04.2006, 13:24:20
Ich glaub du möchtest das:

foreach($_SESSION["formular"] as $k => $v) {

MfG
V@lentin

dfluess
24.04.2006, 13:59:44
Danke, so funktioniert’s endlich ...aber mit der Session ist es nun auch nicht anders.

Checkbuttons - einmal gesetzt - bleiben es. Ich dachte wenn man den Haken entfernt, und dann die Seite erneut vor und zurück klickt ist er auch raus.. aber leider nicht.

Kann man da was machen?

dfluess
24.04.2006, 18:04:12
Ich muss Eure Nerven noch mal strapazieren.

Von Rechtswegen müsste dies doch jetzt funktionieren oder?

function show_form($content, $conf) {
$this->get_post = array_merge($_GET, $_POST);

session_start();
$globalMarkerArray = array();

#############################
# define markers
#############################
if (is_array($this->get_post)) {
$_SESSION["formular"][$this->get_post['id']] = array();
$_SESSION["formular"][$this->get_post['id']] = $this->get_post;

foreach($this->get_post as $k => $v) {
if (!ereg('EMAIL_', $k)) {
$globalMarkerArray['###value_'.$k.'###'] = $v;
$globalMarkerArray['###checked_'.$k.'_'.$v.'###'] = 'checked';
$globalMarkerArray['###selected_'.$k.'_'.$v.'###'] = 'selected';
}
}
}
Sinn ist, dass für die jeweilige Seite die Session für sich gespeichert wird und nun Änderungen des Checkbuttons daher überschrieben werden können, da das array nach erneutem Senden neu geschrieben wird.

Nur ist plötzlich bei klick auf die vorherige Seite die Session leer?..
$this->get_post['id'] gibt die jeweilige Page-ID zurück ist also für jede Seite individuell vergeben..

hab ich noch was vergessen?

Das Button für den Rücksprung wird so eingefügt:

$content .= '<form name="formular" action="index.php?id=back" method="post" enctype="multipart/form-data">';
$content .= '</form>';
return $content;Wobei "id?=back" die vorherige Formularseite ist.

Was hab ich vergessen?

dfluess
25.04.2006, 12:56:18
komme einfach nicht weiter.

plötzlich funktioniert unten gezeigte Code nicht mehr.
Fehler: Warning: Invalid argument supplied for foreach() in ...

Der selbe Code hat gerade noch funktioniert! Kann auch nichts ungewöhnliches sehen..


function show_form($content, $conf) {
$this->get_post = array_merge($_GET, $_POST);
$globalMarkerArray = array();

# merge error-array with globalMarkerArray
if (is_array($this->errors)) {
$globalMarkerArray = $this->errors;
}

#############################
# define markers
#############################
session_start();
if (is_array($this->get_post)) {
// foreach($this->get_post as $k => $v) {
foreach($_SESSION["formular"] as $k => $v) {
if (!ereg('EMAIL_', $k)) {
$globalMarkerArray['###value_'.$k.'###'] = $v;
$globalMarkerArray['###checked_'.$k.'_'.$v.'###'] = 'checked';
$globalMarkerArray['###selected_'.$k.'_'.$v.'###'] = 'selected';
}
}
}
[...]