ugrás a tartalomhoz

Js-el generált input és történtete

elek9914 · 2011. Szep. 4. (V), 20.21
Sziasztok!

Kérném a segítségetek a következőben:
Adott egy form, benne mindenféle és típusú mezővel. Van egy select, amivel kapcsolatban nem lehet előre tudni, hogy hány darabra lesz szükség az űrlap kitöltésekor, úgyhogy a felhasználó magának generál egy link+javascript segítségével annyit amennyire szüksége lesz.
A baj az, hogy sajnos ezek a generált beviteli mezők elküldés után nem kerülnek be a
$_POST
- ba, egyik sem. Csak az az egy amit nem js generált hanem alapból adott volt!

Az 1 darab adott select neve:
name="sor1"
az összes generált = sor2, sor3, sor4.....

Így a
$_POST['sor1']

okés lesz, de a
$_POST['sor2']
és társai már nem. Egyszerűen nincs ilyen index.

A kérdésem az, hogy így volt ez mindig? És keressek más megoldást erre? Vagy én rontok el valamit és mennie kellene?
Köszönöm,
Elek
 
1

Kód

Schmidi · 2011. Szep. 4. (V), 21.23
Mutass konkrét példát / kódot légy szíves.
2

Nem

Poetro · 2011. Szep. 4. (V), 22.02
Ha valódi HTML <form>-ot használsz, amit POST-tal küldesz el, és annak része a select elem (azaz a form elemen belül van), akkor a PHP POST tömbjében benne kell, hogy legyen. Ha ezek valamelyike nem teljesül, akkor lehetséges valami gubanc.
3

Ilyennel már én is

Totti 1986 · 2011. Szep. 4. (V), 22.09
Ilyennel már én is találkoztam.
Azt hiszem ha sima innerHTML-lel teszi be utólag a formba az új inputokat, akkor nem veszi figyelembe elküldéskor.
4

válasz

elek9914 · 2011. Szep. 4. (V), 23.14
Az első válaszra a válasz:
a js része:


...
        var divTag = document.createElement(\"div\");
	divTag.id = \"resz\";
	divTag.innerHTML = div_tartalom;
	document.getElementById(\"div_nev\").appendChild(divTag);

...
az escape-elés a php-ben történő születés miatt van.
a php része mindegy, mert próbaképp egy egyszerű

foreach($_POST as $k=>$v){
        echo "".$k." = ".$v."";
        }
tesztfüggvénnyel sem látom a POST-ban ezeket, csak a nem generált inputok neveit és értékeit.

Az második válaszra a válasz:

Átnéztem többször is a generált HTML-t és jó helyen vannak a nyitó/záró form tagok. Én is gondoltam rá, hogy figyelmetlenségből bezártam előtte a formot. De nem :(

Az harmadik válaszra a válasz:

Igen én is erre gyanakszom.

Kipróbáltam több böngészővel is, nem e böngésző függő. De Mozilla, Opera, Chrome... ugyanaz. Ami furcsaság, de félig meddig érthető, hogy ha megnézem az oldal forrását miután kinyitogatom ezeket az inputokat akkor azt látom hogy nincs a forrásban. De ha kijelölök egy területet az oldalon beleértve ezeket a generált inputokat és annak a kijelölt rész forrását nézem meg akkor pedig ott van. De elküldéskor figyelmen kívül marad.
6

Nem csak id-t, hanem name

Hidvégi Gábor · 2011. Szep. 5. (H), 06.10
Nem csak id-t, hanem name attribútumot is meg kell adni, mert az kerül bele a $_POST tömbbe.
5

megoldás?

elek9914 · 2011. Szep. 5. (H), 00.08
Keresgéltem, googleliztam és ezt találtam:

<script type="text/javascript">

function updateDOM(inputField) {  
  
	if (typeof inputField == "string") {  
	inputField = document.getElementById(inputField);    
	}        
	if (inputField.type == "select-one") { 
		for (var i=0; i<inputField.options.length; i++) {
			if (i == inputField.selectedIndex) {   
				inputField.options[inputField.selectedIndex].setAttribute("selected","selected"); 
			}        
		}
	} 
  
	else if (inputField.type == "select-multiple") {
        for (var i=0; i<inputField.options.length; i++) {
			if (inputField.options[i].selected) {
				inputField.options[i].setAttribute("selected","selected");
			}
			else{ 
			inputField.options[i].removeAttribute("selected"); 
			} 
		}
	} 
	else if (inputField.type == "text") {
		inputField.setAttribute("value",inputField.value);
	} 
	else if (inputField.type == "textarea") {
		inputField.setAttribute("value",inputField.value);
		inputField.innerHTML = inputField.value;
	}
	else if (inputField.type == "checkbox") {
		if (inputField.checked) {
		inputField.setAttribute("checked","checked");
		}
		else{ 
		inputField.removeAttribute("checked");
		}
	}
	else if (inputField.type == "radio") {
		var radioNames = document.getElementsByName(inputField.name);
		for(var i=0; i < radioNames.length; i++) {
			if (radioNames[i].checked) {
				radioNames[i].setAttribute("checked","checked");
			}
			else{
				radioNames[i].removeAttribute("checked");
				}
			}
		}
	}
</script>
aztán az inputokra:

onBlur="updateDOM(this)"
Talán ez segíthet :) holnap kipróbálom és jelzem, hogy sikerült-e.

Köszönöm az eddigi segítséget, ha valakinek van még ötlete szívesen várom!
Elek
7

Poetro-nak lesz igaza

elek9914 · 2011. Szep. 5. (H), 08.16
Nos a fenti js nem segít. Viszont találtam egy példát, ami egyszerűsítve ugyanígy működik mint nálam, és bizony elküldi azokat is. Csak valami nem oké nálam.

itt a példa:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
</head>

<body>
<script type="text/javascript">
//<![CDATA[
darab = 0;
function bovit(mit)
{
  darab++;
  var divem = document.createElement('div');
    ki = '\n<input type="text" size="40" name="szoveg'+darab+'" id="szoveg'+darab+'" value="">\n';
    ki+= '<select name="select'+darab+'" id="select'+darab+'">\n';
    ki+= '<option>&nbsp;<\/option>\n';
    ki+= '<option value="3">3.<\/option>\n';
    ki+= '<option value="4">4.<\/option>\n';
    ki+= '<option value="5">5.<\/option>\n';
    ki+= '<option value="6">6.<\/option>\n';
    ki+= '<option value="7">7.<\/option>\n';
    ki+= '<option value="8">8.<\/option>\n';
    ki+= '<\/select><br>\n';
  divem.innerHTML = ki;
  mit.appendChild(divem);
}
//]]>
</script>
<form method="post" name="urlap" id="urlap" action="">
<div id="elemek">
  <input name="szoveg0" type="text" id="szoveg0" size="40">
  <select name="select0" id="select0">

    <option>&nbsp;</option>
    <option value="3">3.</option>
    <option value="4">4.</option>
    <option value="5">5.</option>
    <option value="6">6.</option>
    <option value="7">7.</option>

    <option value="8">8.</option>
  </select>
</div>
<input type="button" value="Új elem" name="Uj" onclick="bovit(document.getElementById('elemek'))">
<input type="submit" value="Mehet" name="mehet">
</form>

<pre>Array
(
    [szoveg0] => 
    [select0] => 7
    [szoveg1] => 
    [select1] => 8
    [szoveg2] => 
    [select2] => 6
    [mehet] => Mehet
)
</pre></body>
</html>
Teszteltem és tökéletesen működik! Csak valamiért az én kódom nem. Még keresem a hibát!
8

Megoldva!

elek9914 · 2011. Szep. 5. (H), 10.19
Többszöri nekifutás után sikerült megtalálnom a hiba okát, ami részben az én figyelmetlenségem volt.

Az ominózus form inputjai akár 80-100 db ot is jelenthet ami itt ott van elhelyezve a sűrű div-ek és tablek-k rengetegében. Az inputok (meglévők és generáltak) a nyitó és záró <form> tagok között voltak ugyan, de maguk a form tagok nem ugyanazon a div-en belül voltak. Hanem egyel alrébb. Lebutított példa:

<div ...>
	<div ...>
		<form ...>
			<div ...>
			
			soksok elem
			
			</div>
	</div>
		</form>
</div>


Számomra tanulság, hogy nagyon figyelnem kell a rendezettségre. Sok óra felesleges plusz munkától kímél meg.

Köszönöm nektek a segítséget. Jövök még ha elakadok!
Elek