Upload a zpracování více fotek s ruznymi ‚name‘

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
jeanes
Člen | 1
+
0
-

Ahoj,

mám klasický form, pomocí kterého (mimo jiné) uploaduji různý počet fotek, které pak chci uložit na různá místa (nikoliv do jednoho adresáře).

V presenteru mám:

$form = new AppForm;
...
$form->addFile('foto', 'Fotky:');
$form->addFile('realizace', 'Realizace:');
...

V šabloně pak pomocí .js rozšiřuji možnost narání více než jedné fotky

<td>
  <table id="foto">
    <thead>
      <tr>
        <th></th>
        <th></th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>{$form['foto']->control}</td>
        <td><a class="pridat_foto" onclick="fnClickAddRow();" href="javascript:void(0);">[+] přidat další obrázek</a></td>
      </tr>
    </tbody>
  </table>
</td>

.js skript vypada zhruba takto (je stejny jak pro „foto“ tak pro „realizace“)

<script type="text/javascript">
    /* Global variable for the DataTables object */
    var oTable;

    /* Global var for counter */
    var giCount = 1;

    $(document).ready(function() {
        oTable = $("#foto").dataTable({
            "bPaginate": false,
            "bLengthChange": false,
            "bFilter": false,
            "bSort": false,
            "bInfo": false,
            "bAutoWidth": false,
            "bProcessing": false,
            "bSortClasses": false,
            "oLanguage": {
            "sZeroRecords":  ""
            }
        });
    } );

    function fnClickAddRow() {
        oTable.fnAddData( [
            "<input type=\"file\" class=\"text\" name=\"foto"+giCount+"\" id=\"foto"+giCount+"\" />",
            "&nbsp;"
        ] );

        giCount++;
    }
</script>

Problém je v tom, že po odeslání a následném zpracování formu se dostanu jen k jedné (vždý té první) fotce, přestože jich tam pomocí .js uploaduji více.

Když pak dám při zpracování formu toto:

...
foreach($_FILES as $image){
	echo $image;
}
...

Tak mi to vypíše všechny uploadované fotky, ale já ke zpracování potřebuji dostat nejdříve fotky ‚foto‘ a uložit je kam potřebuji, a pak fotky ‚realizace‘ a též s nima udělat co potřebuji!

Když tkusím třeba toto

$data = $form->getValues();
...
foreach($data['foto'] as $f){
	echo $f;
}

foreach($data['realizace'] as $r){
	echo $r;
}

Tak mi to vypíše vždy jen tu první uploadovanou a zbytek nic…

Zkoušel jsem i vytvořit kontejner pro každou kategorii fotek (‚foto‘ a ‚realizace‘) a pak pomocí foreach projet vsechny prvky z kazdeho kontejneru, ale presto to vypsalo jen tu prvni… Uz nevim co s tim. Predpokladam, ze to bude nejaka blbost… Prosim o nejake nasmerovani. Dekuji!

studna
Člen | 181
+
0
-

Je to logické, kvůli bezpečnosti formulářů. Uplně to samé, jako by si po komponentě

	$form = new Form(..);
	$form->addText('valX');

chtěl hodnotu Y

	$form['valY']->value; // error

Dá se to řešit pomocí session. Třeba nějak podobně:

	$form = new Form(..);
	$container = $form->addContainer('val');
	$container->addFile(0);

	if( $sessionFilesCount>1 )
		for( $i = 1; $i < $filesCount; $i++)
			$container->addFile($i);

Pak musíš nějak vyřešit invalidaci formuláře – aby se ti nesmazaly předchozí vybrané soubory.

Nebo si napíšeš vlastní komponentu(třeba pro ajaxový upload) nebo použiješ nějakou už hotovou, viz doplňky.

Editoval studna (16. 9. 2011 21:44)