Best Practice – Upload souborů k nadřazenému elementu
- pidiclovek
- Člen | 91
Ahoj,
Už dlouho dumám nad naprosto běžným problémem a nenapadá mě lepší
řešení než o, které popíši:
Mějme třeba formulář pro nový článek. Chci k němu přihodit nějaké
obrázky a informace k nim si uložit
do db. Protože potřebuji ty obrázky již do textu, např pro nějaký
wysiwyg, nemohu to udělat wizardem.
Pro uložení obrázku do db logicky potřebuji id nadřazeného článku. To samozřejmě nemám, páč článek nebyl ještě vytvořen. Jak na to? :) Jak to děláte vy?
Já když to jde, použiji vícestránkový wizard, kde soubory nahrávám
až v dalších krocích. V případě že wizard nezafunguje a potřebuji je
již pro první krok, vytvořím prázdný článek, čímž získám jeho
id.
V případě zrušení tvorby článku pak mažu, co jsem falešně vytvořil.
Což mi nepřijde zrovna nejčistčí :)
A pro případné nápady okolo odhadování id nového článku z výše
těch předchozích – nepřichází v úvahu,
není bezpečné.
Co vy na to? Jak to děláte vy?
Díky za zkušennosti!
- OK3
- Člen | 91
Pár poznámek:
Wysiwyg obvykle pracuje s relativní nebo absolutní cestou k obrázku, takže
žádné ID není potřeba. Obrázky při využití těchto editorů se často
uploadují „mimo“ třeba v novém okně. To je pro využití obrázku
přímo v textu. Pokud je chceš jen přiložit k článku na způsob galerie,
budeš si muset předtím článek uložit, abys získal ID (ajax nebo
s reloadem zpět na editaci článku). Do té doby nepovolit přidání
obrázku (není k čemu). Ještě jedna možnost je to workflow změnit tak,
že článek nejdřív založíš prázdný a vždy jdeš na editaci…
- pidiclovek
- Člen | 91
Ani:
To se mi líbí! Je to čistčí, než to co dělám já a zas tak o moc se to neliší a zaručí to, že tam nezbydou prázdné. Super! Díky za inspiraci
OK3:
Jasně, to ze změnou workflow je asi nejlepší, jen pro ty wysiwygy se to nehodí. A jak jsem říkal, potřebuji kvůli použitelnosti v jiných strukturách a UX uložit to s id. Uživatelům se většinou nelíbí hlášky typu Obrázek s tímto názvem již existuje, zvolte prosím jiný :) O cestu (relativní/absolutní) mi tak vůbec nejde, jen o název souboru.
- Filip Procházka
- Moderator | 4668
- vykreslím formulář, kde bude 1 file input (nebo jiný upload)
$form->addTextarea('article');
$files = $form->addDynamic('files', function ($container) {
$container->addHidden('id');
$container->addSubmit('remove', 'Odstranit soubor')
->onClick[] = callback(...);
});
$files->addFile('new', ...);
$files->addSubmit('upload', "Nahrát")
->onClick[] = callback(...);
$form->addSubmit('save', 'Uložit článek');
- uživatel píše píše a pak chce přidat obrázek
- přiloží obrázek a klikne na tlačítko „Nahrát“, které je vedle file inputu
- odešle se všechno, protože file input i text jsou v jednom formuláři
- na straně serveru uložím text do session, popřípadě další políčka. Soubory zpracuju, uložím do tabulky název, id, cestu… co je potřeba. Tohle ID pak uložím do session k textu článku
- přesměruji a vykreslím nový formulář, v tomto fomuláři bude ale
i ID toho nahraného souboru v kontejneru
files
foreach ($session->files as $id => $info) {
$file = $form['files']->createOne(); // vytvoř kontejner
$file['id']->setValue($id);
$file['id']->setOption('name', basename($info->path));
}
Teď mám ve formuláři políčko na nahrání dalšího souboru, ale i neomezený kontejner na další soubory. Uživatel může postup opakovat do zblbnutí.
- Když chce soubor vložit do textu, tak si zkopíruje nějaký kód, nebo
použije WYSIWYG. Tady na Nette wiki to funguje tak, že pro každý nahraný
soubor se vygeneruje značka ve tvaru
[* obrazek.jpg *]
, třeba. A to když zkopíruji do textu, tak to texy převede na správný<img />
. - uživatel je s článkem spokojen, tak dá uložit
- ty si vezmeš IDčka všech přiložených souborů
$ids = $form['files']->values;
unset($ids['new']);
a můžeš si je uložit k článku.
- Rellik
- Člen | 104
Tak to já mám samostatný upload souborů, které jsou pak v iframu vedle
texarey, na které je nástavby tinyMCE. Pro vložení přílohy do článku ji
pak stačí pouze přetáhnout myší. Jediný problém je ten, že když smažu
nějaký obrázek, který je v nějakém textu, tak z toho textu zmizí
taky…
Můžeš vyzkoušet: http://nette.rellik.eu/…dd-news/news login
i heslo: test
- Jan Voráček
- Člen | 90
Vnesu do toho trochu jiný pohled. Obvykle to řeším tak, že mám oddělenou „fotogalerii“ a články. V průběhu psaní článku lze dejme tomu v nějakém vyskakovacím okně / jQuery UI dialogu spravovat fotogalerii a zároveň vkládat obrázky do článku atd.
Není to tedy tak, že by byly nějaké fotografie přímo u jednoho článku, ale lze je použít všude. Odpadají tím starosti o ID článku a podobně, ale zase přibývají starosti v případě, kdy je články třeba promazávat (typicky tam zůstávají viset všechny obrázky, které se tam kdy nahrály, protože nikdo neví, kde všude jsou použity a jestli se něco nerozbije, když se obrázek smaže).
Je tedy jen na tobě, jestli se ti tenhle přístup hodí či nikoliv.
Edit: Rellik byl rychlejší, takže zase tak jiný pohled to není :)
Editoval Jan Voráček (1. 3. 2012 17:29)
- echo
- Člen | 134
Jan Voráček napsal(a):
…, ale zase přibývají starosti v případě, kdy je články třeba promazávat (typicky tam zůstávají viset všechny obrázky, které se tam kdy nahrály, protože nikdo neví, kde všude jsou použity a jestli se něco nerozbije, když se obrázek smaže).
Tady bych se inspiroval MediaWiki, která ukládá informace o použití obrázků do db. Pak je primitivní při mazání článku ověřit, zda smazat i obrázek.
Mohla by se vytvořit metoda pro Texy, která by toto obsluhovala.
- Jan Voráček
- Člen | 90
@echo: Napadlo mě to, ale bohužel to není ve spojení s Texy!, ale s nějakým wysiwygem. A upřímně jsem byl příliš líný na to, abych to implementoval. Pro klienta jsem to otočil ve feature – když tam jednou nahraje obrázek, může ho v budoucnu kdykoliv použít, i kdyby původní článek už neexistoval :D
- echo
- Člen | 134
Rellik napsal(a):
A co když článek s obrázkem zůstane a obrázek pak smaže? ;-) To pak obrázek zmizí i z článku.
jak jsem psal :-) Ještě mě napadlo prohnat html od wysiwyg přes Texy – ta by měla zvládnout i čisté html bez texy syntaxe a tam napíchnout nějakou tu metodu pro závislosti (obrázek-článek) do db.