jQuery File Upload a Nette

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

Zdravím,

mám klasický formulář pro nahrávání souborů

public function createComponentGalerieForm() {
        $form= new Form();
        $form->addText('nazev', 'Název')
                ->setAttribute('placeholder', 'Název stránky')
                ->setAttribute('class', 'form-control');
        $form->addUpload('upload', 'text')
                ->setAttribute('class', 'form-control');

        $form->addSubmit('send', 'Přidat stránku')
                ->getControlPrototype()
                ->class('btn btn-info');

        $form->onSuccess[] = $this->strankaFormSucceeded;

        $form->setRenderer(new BootstrapRenderer());
        return $form;
    }

Jelikož je to pro paní, chtěl bych udělat vizuálně hezké a funkční nahrávání. Narazil jsem na toto

Chtěl bych se vás zeptat, zkoušeli jste to někdo implementovat na formulaře? Jak s tím dále pracovat?

Děkuji za rady a odpovědi

Kcko
Člen | 468
+
+2
-

Hledal jsem něco podobného pro fotogalerii.
Našel jsem jednodušší plugin (nevím jestli Ti bude stačit), ale implementace mi zabrala chvilku a dělá to defakto to samé.

Url: http://valums-file-uploader.github.io/file-uploader/

	public function handleUpload()
	{


		$www  =  $this->presenter->context->parameters["wwwDir"];
		$www .=  '/storage/upload/';



		$uploader = new \qqFileUploader();
		$result = $uploader->handleUpload($www);


		$this->sendResponse(new Nette\Application\Responses\JsonResponse($result));
	}
<div id="file-uploader-demo1">
	<noscript>
		<p>Please enable JavaScript to use file uploader.</p>
		<!-- or put a simple form for upload here -->
	</noscript>
</div>

<div class="qq-upload-extra-drop-area">Drop files here too</div>

<script src="{$basePath}/assets/uploader/fileuploader.js" type="text/javascript"></script>
<script>
    function createUploader(){
        var uploader = new qq.FileUploader({
            element: document.getElementById('file-uploader-demo1'),
           ** action: {link upload!},**
            onComplete: function(id, fileName, responseJSON)
            {
            	console.log(id);
            	console.log(fileName);
            	console.log(responseJSON);
            },
            debug: true,
            extraDropzones: [qq.getByClass(document, 'qq-upload-extra-drop-area')[0]]
        });
    }

    // in your app create uploader as soon as the DOM is ready
    // don't wait for the window to load
    window.onload = createUploader;
</script>
Tirus91
Člen | 199
+
0
-

Tak něco takového akorát taky řeším. Toto mi asi vyřeší úplně vše. Ovšem já potřebuju uložit uploadované soubory po svém. (potřebuju změnit velikosti, vytvořit náhledy, zapsat do DB, apod..)

Editoval Tirus91 (11. 9. 2014 13:32)

iguana007
Člen | 970
+
0
-

@Tirus91 a co ti v tom brání? :) Si jen přidej tu „svou logiku“ do té metody, která ty uploadované soubory ukládá/zpracovává. Do toho inicializačního Javasciptu uploaderu si mužeš předat i parametr typu id_kategorie do které daný soubor patří atd.

Jen pozor na jednu věc u těchto custom řešení/uploaderů – již se to tady na fóru několikrát řešilo – pokud daný uploader používá pro browsery bez HTML5 supportu flashovou instanci + upload probíhá u zalogovaného uživatele, tak je třeba v Nette ošetřit i session_id – jinak to vede k tomu, že hned po prvním uploadovaném souboru se uživatel odhlásí a upload potom nefunguje. Jedno z vláken, kde se tato problematika řešila je toto: https://forum.nette.org/…fy-chyba-303 (ale je jich tu více) – nebo se můžete podívat do addonu MultipleFileUpload, jak se to řeší tam: https://github.com/…leUpload.php#L92

Tirus91
Člen | 199
+
0
-

@iguana007
aha, hmm :) .. no tak to si pak budu muset dát bacha (už jsem se s tím právě i setkal)
Zatím si to řeším už doslova sám

Editoval Tirus91 (12. 9. 2014 12:55)

wicked
Člen | 290
+
0
-

Tirus91 napsal(a):

Tak něco takového akorát taky řeším. Toto mi asi vyřeší úplně vše. Ovšem já potřebuju uložit uploadované soubory po svém. (potřebuju změnit velikosti, vytvořit náhledy, zapsat do DB, apod..)

Tak tohle si pak uděláš v metodě pro zpracování, mě jde spíš i o to, zda to někdo už zkoušel popřípadě rozchodil.

iguana007
Člen | 970
+
0
-

Já to kdysi v jednom projektu měl, ale ne ve formu, ale jako samostatnou page, která řešila pouze upload souborů (+ jsem si tam předával id záznamu, ke kterému soubory patřily, tj. tak, jak jsem to už popsal výše).

wicked
Člen | 290
+
0
-

Přemýšlím, že řešení bez použití formu možná bude asi nejlepší…

Vůbec mě nenapadá jak to s formem spojit…

Kcko
Člen | 468
+
0
-

Normálně. Nejdřív bys musel uploadnout soubory, držet je nějak odděleně a poté co by se uložil formulář tak bys musel nový záznam / stávající spojit s těmi soubory.

wicked
Člen | 290
+
0
-

Však jo, samotnou komponentu jen na upload a s formem nic společného…

iguana007
Člen | 970
+
0
-

Já ten flow řeším úplně naopak, než píše @Kcko – tj.: nejdříve vytvořit přes form záznam, ke kterému se budou nahrané soubory/obrázky vázat a až, jakmile je záznam vytvořen, tak teprve potom se pustit do uploadu souborů. Nemusíš se je takto „držet bokem“ a rovnou je při uploadu přiřazuješ k již vytvořenému záznamu.
Mezitím se totiž může stát spousta věcí, které by vedly k tomu, že by sis musel ještě napsat nějaký garbage collector, který by ty soubory nepřiřazené k nějakému záznamu musel průběžně mazat.

Tirus91
Člen | 199
+
0
-

@wicked
tak jsem to zkusil a pro každý obrázek, to posílá celý formulář. Tudíž by to mělo jít provázat s normálním formulářem Nette ;)

jen co mi tam zatím chybí, je využítí snippetů, zkusil jsem si invalidovat něco a nepřekreslilo se mi to

Editoval Tirus91 (12. 9. 2014 11:05)

Kcko
Člen | 468
+
0
-

@iguana007 To je samozřejmě taky řešení a snažší. Nicméně, uživatel musí do editace záznamu dvakrát (Nejdřív tedy vloží nový záznam, pak ho to rovnou přesměruje opět do editace a nabídne mu to možnost nahrát soubor(y) …)

U mého řešení ne. Ať si @Tirus91 vybere :-)

wicked
Člen | 290
+
0
-

Tak nemusí 2x…

Já to mám tak, že v metodě pro zpracování formu, se nejdříve ověří a uloží data a potom pokud bylo vše ok zpracovávám obrázky, vše v jedné funkci voláne po odeslání formu

llook
Člen | 407
+
+1
-

Zkoušeli a uspěli, ale už je to skoro rok a nevím, jestli to bude funkční s aktuálním Nette. Část toho řešení je tady: https://github.com/…ploadControl

Druhá část, tj. samotnou práci se soubory, je potřeba dodělat implementací těch tří rozhranní ze src/model.

wicked
Člen | 290
+
0
-

Tak co, rozchodil to někdo? :)