Forms extension – přesun souboru až po zpracování

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

Zdravím,

vytvářím rozšíření, které se mi postará o nahrátí souboru a rád bych ještě docílil toho, aby se mi i při „create“ položky soubor nahrál do umístění typu: „path/{$id}/“ tzn, až po zpracování formuláře, resp. těsně před koncem.

Dá se to nějak řešit, je tam nějaký hook, kterým bych mohl zavolat ještě nějakou metodu té extension? (v onClick / onSuccess).

dík

Editoval Landsman (16. 9. 2016 14:04)

CZechBoY
Člen | 3608
+
0
-

tzn. že se provedou všechny onSuccess callbacky (zapsání do db, zalogování, poslání emailu, …) a potom až se fyzicky přemístí soubor z TMP do nějaký tvojí upload složky?
Co si udělat vlastní událost a na tu navázat všechny dosavadní onSuccess callbacky a až potom vyvolat ono přemístění souboru?

Landsman
Člen | 152
+
0
-

CZechBoY napsal(a):

Co si udělat vlastní událost a na tu navázat všechny dosavadní onSuccess callbacky a až potom vyvolat ono přemístění souboru?

A přesně to mě zajímá, jak na to?

Zatím jsem to plánoval tak, že záznam normálně uložím do db s cestou /path/{$id}/ která se vezme z nastavení form položky a tuto cestu vrátím metodě, která ji regularem upraví, soubor přesune z defaultní path mé extension do původně požadované a vrátí cestu správnou ⇒ provedu dodatečný update, ručně v onSuccess / onClick.

CZechBoY
Člen | 3608
+
0
-

Asi mi chybí nějakej kontext… :-)
Ty chceš teda

  1. vložit data do databáze včetně defaultního názvu souboru
  2. nějak modifikovat název souboru
  3. přemístit soubor podle modifikace z 2)
  4. updatovat data v db aby se odakzovalo na existující přemístěný soubor

Proč ten soubor nepřemístíš rovnou a neuložíš do db správný finální název?
Editovat data napříč callbackama není moc dobrej nápad, protože nikdy nevíš v jakým pořadí proběhnou.

Landsman
Člen | 152
+
0
-

@CZechBoY Prože chci soubor uložit, ale ještě neznám ID, tak ho uložím do mého „temp“ a jakmile se ke mě dostane ID z databáze, tak s ním šoupnu do správné složky.

Pokud mám ve formuláři více uploaderů, rád bych to ukládal do jedné složky pojmenované po ID položky = ID.

CZechBoY
Člen | 3608
+
+2
-

@Landsman A co

  1. do databáze uložit '' nebo nějaký random string
  2. vytáhnout si vložené ID
  3. přemístit soubor
  4. updatnout záznam v DB

?

$form->onSuccess[] = function ($form, $values) {
	$this->db->beginTransaction();

	$this->db->insert(...);
	$id = $this->db->lastInsertId();

	$newFilename = $this->formatFilename($values['filename']);

	$this->db->update(...);

	$this->db->commit();
};
hitzoR
Člen | 51
+
0
-

Přesně jako píše @CZechBoY. Nevím proč bys to chtěl dělat tak složitě, Ten soubor máš v paměti celou dobu běhu skriptu, tak proč místo jednoho write na disk mít dva writy a jeden read, případně write a move?

Ikdyž best practice by mělo být zapsat soubory první, neřešit u nich vůbec pojmenování podle ID a až pak vkládat do databáze, protože při ukládání na disk je o hodně větší pravděpodobnost, že se něco pokazí, než když zapisuješ do DB. Plus by se dala brát v potaz i konzistentnost dat, takhle se ti nestane, že bys měl v DB záznam a neměl k němu požadovaný obrázek. Pokud už to chceš mít nějak logicky uložené, tak vytvoř třeba složku s časem a nějakou vypovídající hodnotou z formuláře, třeba pro článek by to byl titulek prohnaný přes Utils\Strings::webalize.

Editoval hitzoR (16. 9. 2016 23:07)