Autor Zpráva
RiZe
Profil
Programuji si anketu a potřebuji nastavitelný počet odpovědí v admin. rozhraní. Mám tedy řádek tabulky, který potřebuji tlačítkem zkopírovat a přenastavit mu iterátory, podle kterých můžu k hodnotám v PHP přistupovat. Javascriptu moc nerozumím, a kód který jsem zkoušel napsat pro vlastní potřeby podle předlohy nefunguje. V HTML kódu u prvku input se jménem answer[1] potřebuji s každým při daným řádkem navyšovat iterátor na answer[2] až "n". Má někdo nějaké řešení, funkční kód nebo alespoň link? Na Googlu se mi nedařilo nic najít, třeba jen z jiných anket.

<tr style="background:#e8e8e8">
	<td style="text-align:right">Text odpovědi</td>
	<td><input type="text" name="answer[1]" size="45" value="<? echo $surveyAnswer[1]; ?>" /></td>
	<td>
		<input type="submit" value="Přidat řádek" onclick="return !pridatRadek(this);" /> 
		<input type="submit" value="Odebrat" onclick="return !ubratRadek(this);" />
	</td>
</tr>
Petroff
Profil
Já zas neznám php, a rád bych si byl jisty že jsem to správně pochopil:
odebírá (nebo duplikuje) se řádek, ve kterém stisknu input-submit (tlačítko žádný formulář doufám neodesílá), při duplikaci se změní (příklad): name="answer[12]" na name="answer[13]" a jinak nic? >Text odpovědi< se taky zkopíruje ?
Ještě něco: jedná se o manipulaci s posledním řádkem tabulky?
RiZe
Profil
No, viděl bych to tak, že budu mít iterátor počtu řádků tabulky (odpovědí), podle kterých mohu přistupovat k jejich datům z PHP. Každopádně, pokud kliknu na tlačítko Přidat, zkopíruje se textové pole pro další odpověď (text ne) a navýší se iterátor, takže textové pole nového řádku už nebude mít atribut name="answer[1]" ale answer[2], další přidaný řádek bude mít answer[3]
los
Profil *
Nebolo by jednoduchšie, keby si ako name použil iba answer[]?

Potom by ti stačilo tie riadky kopírovať bez toho, že by si musel meniť name (netestované):
function pridatRadek(el) {
	for (var row = el; row; row = row.parentNode)
		if (row.tagName == "TR") {
			row.parentNode.appendChild(row.cloneNode(true));
			break;
		}
}


Ak tam chceš mať naozaj aj to číslo, tak potom budeš musieť v tom vyklonovanom riadku nájsť input, ktorého meno začína na "answer[" a upraviť mu name. Otázka by potom bola, ako sa to má chovať po vymazaní nejakého riadka uprostred (či sa má pokračovať v číslovaní, alebo sa to má celé prečíslovať).
RiZe
Profil
Ano zkoušel jsem to tak, ale nedá se to potom odchytit PHP, jelikož v té proměnné je jen hodnota posledního řádku
Leo
Profil
Pokud pouzijete jako name answer[] pak budete mit v $_POST['answer'] (pripadne analogicky pro GET metodu) POLE. Leo
RiZe
Profil
Pokud použiji pro každý ten prvek answer[], mám v poli $_POST jen toto (vypsáno fci print_f): [answer] => Array ( [0] => 333 ), tedy hodnotu inputu posledního řádku.
Petroff
Profil
RiZe
Dotaz:
1. co obsahuje (asi proměnná) $surveyAnswer[1] ?
2. ta jednička není doufám stejný index jako ta v name="answer[1]" ?
RiZe
Profil
$surveyAnswer[1] je jen doplňování hodnot z databáze při úpravě, v reálu tam bude něco jako $array["answer_text"]. V answer[] se má index s každým řádkem zvyšovat, abych k němu mohl přistupovat jako k poli o prvcích answer[0] = "text prvního řádku", answer[1] = "druhý řádek" atp.
Petroff
Profil
Mám to skoro hotové, jen mi pro jistotu napiš jako příklad přesné znění druhého řádku (tak jak ho má vložit javascript spuštěný tlačítkem v prvním řádku:
<tr style="background:#e8e8e8">
<td style="text-align:right">Text odpovědi</td>
<td><input type="text" name="answer[2]" size="45" value="<? echo $surveyAnswer[1]; ?>" /></td>
<td>
<input type="submit" value="Přidat řádek" onclick="return !pridatRadek(this);" />
<input type="submit" value="Odebrat" onclick="return !ubratRadek(this);" />
</td>
</tr>
Je to ono ?
RiZe
Profil
Ano, pokud vytvořím nový řádek, navýší se index v answer třeba z [1] na [2]. Taky jsem to zkoušel. Naklonoval jsem řádek, umístil ho pod ten poslední, načetl inputy a přes regulární výrazy upravit ten index v názvu, ale nějak nefunguje převedení stringu na int.

Přesné znění:

<!-- 1 řádek -->
<tr>
	<td style="text-align:right">Text odpovědi</td>
	<td><input type="text" name="answer[1]" size="45" /></td>
	<td><input class="inputButton" type="submit" value="Přidat" onclick="return !add_row(this);" /> <input class="inputButton" type="submit" value="Odebrat" onclick="return !remove_row(this);" /></td>
</tr>
<!-- 2. javascriptem -->
<tr>
	<td style="text-align:right">Text odpovědi</td>
	<td><input type="text" name="answer[2]" size="45" /></td>
	<td><input class="inputButton" type="submit" value="Přidat" onclick="return !add_row(this);" /> <input class="inputButton" type="submit" value="Odebrat" onclick="return !remove_row(this);" /></td>
</tr>



function add_row(button) 
{
	var row 	= button.parentNode.parentNode;
	var row2 	= row.cloneNode(true);
	row.parentNode.insertBefore(row2, row);

	var inputs  = row2.getElementsByTagName('input');

	for (var i = 0; i < inputs.length; i++)
	{
		/**
		 * V následujícím řádku jsem testoval náhradu za '$1[' + ($2 + 1) + ']', (ParseInt('$2') + 1) i '$1[$2' + 1 ']'
		 */ 
		inputs[i].name			= inputs[i].name.replace(/([a-zA-Z0-9_])\[(\d+)\]/, '$1[' + ('$2' + 1) + ']');	
		confirm(inputs[i].name); // Vypíše answers[11] místo očekávaného answers[2]
	}

	return true;
}

Petroff
Profil
S tím číslováním:
Nejjednodušší by to bylo, kdyby se řádky chovaly jako zásobník LI-FO. Číslování bude souvislé.
Recept:
-před vložením nové "last-row" disablovat obě tlačítka submit dosavadní last-row.
-po vymazání last-row tlačítka nastávající last-row zaktivovat
!!! Ošetřit 1. řádek => nelze odstranit => disable tlačítko odebrat !!!

Tohle jsem vyzkoušel (bez php) funguje tak jak má, chceš=li dodám i funkci odebrat

<html><head><title>test pridat radek</title>
<script>
function increment(str){return str.replace(/\d+/g,function(value,ix,s){return ++value})}

function pridatRadek(el) {
var oldTR=el.parentNode.parentNode;
var newTR=oldTR.cloneNode(true);
var TDs=newTR.getElementsByTagName("td");

var name=oldTR.getElementsByTagName("input")[0].name;
TDs[1].innerHTML=
'<input type="text" name="'+increment(name)+'" size="45" value="" />' ;

var TDs=oldTR.getElementsByTagName("td");
TDs[2].innerHTML=
'<input type="submit" value="Přidat řádek" disabled="true" onclick="return !pridatRadek(this);" />'
+'<input type="submit" value="Odebrat" disabled="true" onclick="return !ubratRadek(this);" />';

oldTR.parentNode.appendChild(newTR);

return false; /* odeslat - nehodici se skrknete */
return true; /* neodeslat - nehodici se skrknete */
}
</script>
</head>
<body>
<table>
<tr style="background:#e8e8e8">
<td style="text-align:right">Text odpovědi</td>
<td><input type="text" name="answer[1]" size="45" value="<? echo $surveyAnswer[1]; ?>" /></td>
<td>
<input type="submit" value="Přidat řádek" onclick="return !pridatRadek(this);" />
<input type="submit" value="Odebrat" onclick="return !ubratRadek(this);" />
</td>
</tr>
</table>
</body>
</html>
Petroff
Profil
Případně ten nesmysl s disablováním nedělat - pouze by někoho mohlo překvapit že se odmazává poslední příspěvek.
Pokud bys trval na odebrání libovolného řádku, není problém pro javascript - akorát vznikne mezera v číslování, pokud ti to nevadí, bude to ta nejkratší verze JS.
???
Petroff
Profil
Chceš-li numerické sčítání, lze to udělat takhle:
součet a+b: =(a-0)+(b-0)
inkrement: =a-0+1
RiZe
Profil
Tvůj kód funguje co se týče vytvoření řádku dokonce i nastavení indexu dobře (i když mi nový řádek udělal až pod odesílacím tlačítkem, což jsem upravil řádkem oldTR.parentNode.insertBefore(newTR, oldTR);. Co mě ale zaráží je, že i přesto PHP vidí pouze poslední řádek. Lze si nějak vypsat zdrojový kód celé stránky včetně toho doplněného JSkem? Možná by to usnadnilo ladění, protože když si natvrdo udělám dva inputy se jmény test[0] a test[1], vidím je v $_POST jako pole test s prvky 0 = první hodnota a 1 = druhá

EDIT: Chyba, PHP vidí jen ten původní řádek, ty vygenerované ne
Leo
Profil
"Pokud použiji pro každý ten prvek answer[], mám v poli $_POST jen toto (vypsáno fci print_f): [answer] => Array ( [0] => 333 ), tedy hodnotu inputu posledního řádku."

Pak mate nekde chybu, rekl bych, protoze tohle normalne beha. Zkuste si formular, kde mate par inputu s name answer[] udelat rucne, odeslat a kouknete se co dostanete v PHP, pripadne se kouknete co prohlizec odesila (nejakym nastrojem pro http sledovani). Mate vsechny inputy uvnitr form? Leo
Petroff
Profil
RiZe
Já jsem si to kontroloval - tu vytvořenou stránku po kliknutí tlačítkama.
Používám na to ve FF nástroj Firebug, na záložce HTML si můžeš všechny tagy i s atributama rozbalit.
RiZe
Profil
Pokud po jeho odeslání kde vygeneruji řekněme 2 řádky, tedy mám pole pro 3 odpovědi a do textového pole původního řádku dám hodnotu 1, do prvního vygenerovaného 2 a do druhého 3, nechám vypsat celý post, vyleze na mě tohle:

Array ( 
[question] => 
[startDay] => 27 
[startMonth] => 1 
[startYear] => 2008 
[startHour] => 12 
[startMinute] => 00 
[endDay] => 27 
[endMonth] => 1 
[endYear] => 2008 
[endHour] => 12 
[endMinute] => 00 
[answer] => Array ( [0] => 1 ) 
[write] => Přidat 
[surveyId] => 
)


Formulář:

<table>
<form action="?q=survey" method="post" name="form">
	<tr>
		<th colspan="3">Záznam ankety</th>
	</tr>
	<tr>
		<td>Otázka</td>
		<td colspan="2">
			<input type="text" name="question" size="45" value="<? echo $surveyQuestion; ?>" />
		</td>
	</tr>
	<tr>
		<td style="text-align:right">Datum začátku zobrazení</td>
		<td>              
			<select name="startDay" style="width:40px">
			// Vygenerování čísel 1-31
			</select>
			<select name="startMonth" style="width:40px">
			// Vygenerování měsíců
			</select>
			<select name="startYear" style="width:55px">
			// Vygenerování roků
			</select>
		</td>
		<td>
			<select name="startHour" style="width:45px">
			// Vygenerování hodin
			</select>
			<span>:</span>
			<select name="startMinute" style="width:45px">
			// Vygenerování minut
			</select>
		</td>
	</tr>
	<tr>
		<td style="text-align:right">Datum konce zobrazení</td>
		// Opět vygenerování všech dnů, měsíců, roků, hodin a minut
	</tr>
	<tr>
		<th colspan="3">Odpovědi k anketní otázce</th>	
	</tr>
	<tr>
		<td style="text-align:right">Text odpovědi</td>
		<td><input type="text" name="answer[0]" size="45" /></td>
		<td><input class="inputButton" type="submit" value="Přidat" onclick="return !pridatRadek(this);" /> <input class="inputButton" type="submit" value="Odebrat" onclick="return !remove_row(this);" /></td>
	</tr>	
	<tr>
		<th colspan="3">
			<input class="inputButton" type="submit" name="write" value="Přidat" />
			<input class="inputButton" type="submit" name="cancel" value="Zrušit" />		
		</th>
	</tr>

	<input type="hidden" name="surveyId" value="<? echo $surveyId; ?>" />
</form>
</table>
peta
Profil
Leo
Jak kde, jak v cem, jak v kterem PHP ci JS prohlizeci. Kazdopadne dal malo informaci na to, aby se s tim dalo pracovat a ten test bych urcite provedl.
Osobne ale cisluji radky jako "row1" "row2" nebo "ch1" jako checkbox.

RiZe
1)
ve foru JS nikoho PHP nezajima, protoze PHP zpracuje soubor a prohlizeci posle pouze vysledny HTML kod bez php znacek.
2)
--- formtest.php ---
<?php print_r($_POST);?>
<hr>
<form action="formtest.php" method="post">
<input type="text" name="answer[]" value="a"/>
<input type="text" name="answer[]" value="b"/>
<input type="text" name="answer[]" value="c"/>
<input type="text" name="answer[]" value="d"/>
<input type="text" name="answer[]" value="e"/>
<input type="submit">
</form>
mne to vypise:
Array ( [answer] => Array ( [0] => a [1] => b [2] => c [3] => d [4] => e ) )
3)
mozna by bylo lepsi, kdybys posla odkaz na stranku, tam tech chyb bude asi vicero.
RiZe
Profil
Zde je odkaz na takřka čistou stránku s tímto formulářem, ve kterém jsou jen políčka pro odpovědi a jejich generování. Při odeslání formuláře je vypisováno pole POST, kterým jsou data posílána.

test
Leo
Profil
"Zde je odkaz na takřka čistou stránku s tímto formulářem, ve kterém jsou jen políčka pro odpovědi a jejich generování. Při odeslání formuláře je vypisováno pole POST, kterým jsou data posílána. "

Pokud byste se OPRAVDU dival na vygenerovany kod (ve FF treba pres WebDeveloper), pak byste videl, kde mate ukoncovaci znacku form... Boze, Leo
RiZe
Profil
Ano, právě teď jsem se díval, takže se omlouvám, chyba byla na mé straně a všem děkuji za pomoc

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: