Best Practice – Upload souborů k nadřazenému elementu

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

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
+
0
-

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…

Ani
Člen | 226
+
0
-

Jak kdy. Někdy si zablokuji autoincrement, tak že udělám insert a pak hned delete. Následně ukládám s tím id. V podstatě to tam popisuješ jen já ho mažu hned a mám jistotu že mi v db nezůstanou prázdné články (když se třeba zavře prohlížeč). Přijde mi to vcelku čisté řešení.

pidiclovek
Člen | 91
+
0
-

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
+
0
-
  • 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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

@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

Rellik
Člen | 104
+
0
-

Jan Voráček napsal(a):

@echo: 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

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.

echo
Člen | 134
+
0
-

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.