Autor Zpráva
Parker
Profil *
Zdravím,
vytvářím si malou fotogalerii a pro hromadné nahrání fotek na server chci použit jQuery. Našel jsem si tuhle funci, která mi vytváří kopie inputů:

<script type="text/javascript">
	$(document).ready(function() {
		$('#btnAdd').click(function() {
			var num		= $('.clonedInput').length;	// how many "duplicatable" input fields we currently have
			var newNum	= new Number(num + 1);		// the numeric ID of the new input field being added

			// create the new element via clone(), and manipulate it's ID using newNum value
			var newElem = $('#photo_packet_' + num).clone().attr('id', 'photo_packet_' + newNum);

			// manipulate the name/id values of the input inside the new element
			newElem.children(':second').attr('id', 'description[' + newNum + ']').attr('name', 'description[' + newNum + ']').attr('value', '');
			newElem.children(':first').attr('id', 'photo[' + newNum + ']').attr('name', 'photo[' + newNum + ']').attr('value', '');

			// insert the new element after the last "duplicatable" input field
			$('#photo_packet_' + num).after(newElem);

			// enable the "remove" button
			$('#btnDel').attr('disabled','');

			// business rule: you can only add 5 names
			if (newNum == 10)
				$('#btnAdd').attr('disabled','disabled');
		});

		$('#btnDel').click(function() {
			var num	= $('.clonedInput').length;	// how many "duplicatable" input fields we currently have
			$('#photo_packet_' + num).remove();		// remove the last element

			// enable the "add" button
			$('#btnAdd').attr('disabled','');

			// if only one element remains, disable the "remove" button
			if (num-1 == 1)
				$('#btnDel').attr('disabled','disabled');
		});

		$('#btnDel').attr('disabled','disabled');
	});
</script>


Formulář pro odeslání fotek i s popiskem:

<form action="" method="post" enctype="multipart/form-data">  
	<div id="photo_packet_1" style="margin-bottom:4px;" class="clonedInput">
        <span class="setObject">Umístění fotogafie:</span><input class="setObject" type="file" name="photo[1]" id="photo[1]"><br />
    	<span class="setObject">Popis fotogafie:</span><input class="setObject" type="text" name="description[1]" id="description[1]" value="" />
    </div>    
    <div>
        <input type="button" id="btnAdd" value="Přidat další fotografii" />
        <input type="button" id="btnDel" value="Odebrat fotografii" />
    </div>                    
    <input type="submit" name="submit" value="Uložit" class="" />
    <input type="hidden" name="sentForm" value="newPhotos" />
</form>	


Ale vyskytl se malý problém. Když vložím před inputy jiný tag (span nebo label), tak se mi chybně odesílají informace $_FILE['photo'] => vždy obsahuje pouze jednu fotografii (první). Ale $_POST['description'] je v pořádku, ten obsahuje správný počet popisků. V momentě, kdy odstraním přidané tagy (v tomto případe <span>) tak odesílání funguje tak jak má.

Můžete mi prosím poradit v čem je problém a nebo jak byste to řešili?
Díky moc.
P.
peta
Profil
            newElem.children(':second').attr(...description
            newElem.children(':first').attr(...photo

Znamena, ze nastavi id prvku v poradi 1 (second) a 0 (first). Pokud vlozis span, tak se poradi zmeni.
Misto toho pouzij :eq(0) :eq(1) :eq(2).
Parker
Profil *
peta:
Prosímtě, mohl bys mi to jěště malinko vysvětlit? A především ukázat jak to mám zapsat.
Zkoušel jsem to dle rady a i různě přeházet a jediné čeho jsem docílil bylo, že se mi $_FILE['photo'] odešle správně, ale pak se u $_POST['description'] odešle vždy jen první položka.

Zkoušel jsem ten newElem.children voližit pro kazdý element který se má nakopírrovat, ale stále stejný výsledek :( :
newElem.children(':eq(0)');
newElem.children(':eq(1)').attr('id', 'photo[' + newNum + ']').attr('name', 'photo[' + newNum + ']').attr('value', '');
newElem.children(':eq(2)');
newElem.children(':eq(3)').attr('id', 'description[' + newNum + ']').attr('name', 'description[' + newNum + ']').attr('value', '');
Parker
Profil *
peta:
Ouuu, beru zpět, ja jsem zapomněl že tam je ještě vložený tag <br />.
Takže mi nyní správně funguje tento zápis:

newElem.children(':eq(0)');
newElem.children(':eq(1)').attr('id', 'photo[' + newNum + ']').attr('name', 'photo[' + newNum + ']').attr('value', '');
newElem.children(':eq(2)');
newElem.children(':eq(3)');
newElem.children(':eq(4)').attr('id', 'description[' + newNum + ']').attr('name', 'description[' + newNum + ']').attr('value', '');


Je to tak v pořádku, udělal bys to tak také?
Jinak díky moc za radu!

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:

0