Forms extension – přesun souboru až po zpracování
- Landsman
- Člen | 152
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
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
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
Asi mi chybí nějakej kontext… :-)
Ty chceš teda
- vložit data do databáze včetně defaultního názvu souboru
- nějak modifikovat název souboru
- přemístit soubor podle modifikace z 2)
- 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.
- CZechBoY
- Člen | 3608
@Landsman A co
- do databáze uložit '' nebo nějaký random string
- vytáhnout si vložené ID
- přemístit soubor
- 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
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)