Předávání a držení dočasného ID mezi komponentami

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

Ahoj,

rád bych se zeptal, jestli už někdo neřešil následují situaci nebo dokázal poradit.

Mám dvě komponenty:

  1. Formulář na přidání novinky
  2. Univerzální komponentu na správu fotografií

Tyto dvě komponenty se zobrazují na stejné stránce (tedy v rámci jednoho presenteru) a jsou spojené přes ID novinky tak, aby správce fotografií věděl, jak a kam uložit nahrané soubory.

Vše funguje dobře, pokud je známo ID záznamu novinky, ale tápu jak zpracovat situaci, kdy přidávám nový záznam novinky (a tedy není známo ID) a chci uživateli umožnit upload a práci s fotografiemi ještě než odešle formulář novinky a uložím novinku do DB (= získám ID).

Moje myšlenka je taková, že se při prvním načtení stránky vygeneruje dočasné ID, které si komponenty předají, ale nevím si rady s tím, kde a jak elegantně tohle ID držet tak, aby řešení fungovalo:

  • i v rámci otevření více záložek (= bylo pro každou záložku unikátní, např. při použití session pro uložení dočasného ID)
  • negenerovalo se nové ID např. při každém ajaxovém požadavku

To že se dočasné ID ztratí pokud uživatel udělá refresh stránky by mi zase tak nevadilo.

Funkčnosti jsem docílil přes persistentní parametr rodičovského presenteru, ale to řešení se mi moc nelíbí…

Neřešil prosím někdo už něco podobného?

Díky za radu.

CZechBoY
Člen | 3608
+
0
-

Ten spravce fotek je vzdy napojen k nejake komponente? Co na nem udelat metodu saveForNews s parametrem id novinky?

Yaromil
Backer | 20
+
0
-

CZechBoY napsal(a):

Ten spravce fotek je vzdy napojen k nejake komponente? Co na nem udelat metodu saveForNews s parametrem id novinky?

Děkuji za odpověď.

Obě komponenty (správce fotek i formulář pro editaci novinek) jsou samostatné komponenty a jsou připojeny k rodičovskému presenteru. Zvažoval jsem ještě spráce fotek jako subkomponentu formuláře,… ale prozatím takto propojené nejsou.

Co se týče uložení přes saveForNews, tak problém nastává v momentě, kdy by měl uživatel otevřených více záložek / formulářů (je to méně pravděpodobné, ale stát se to může), tak jak identifikovat, že daná sada fotek (session ve správci fotek) patří ke konkrétnímu formuláři. Dle mého je tedy nutné mít dočasné ID, už při vkládání fotek, které bude říkat, takhle sada fotek patří k tomuhle formuláři…

Oli
Člen | 1215
+
+2
-

Řešil jsem to u fotogalerie. A nevidím důvod (v mém případě), proč bych měl umožnit poslat fotky spolu s galerií. Přijde mi, že to přináší víc starostí než užitku. V mém konkrétním případě je work flow následující:

  1. Přijdu do fotogalerie
  2. vyplním alespoň jméno
  3. odešlu a to mě refreshne na tu samou stránku, ale už s ID a díky tymu se mě zobrazí druhá komponenta pro nahrávání fotek.
  4. Nahraju fotky (používám dropzone) a ajaxem se mě překreslí grid s fotkama co je pod upload komponentou.

Proč potřebuješ aby mohli poslat fotky spolu s novinkou?

Yaromil
Backer | 20
+
0
-

Oli napsal(a):

Řešil jsem to u fotogalerie. A nevidím důvod (v mém případě), proč bych měl umožnit poslat fotky spolu s galerií. Přijde mi, že to přináší víc starostí než užitku. V mém konkrétním případě je work flow následující:

  1. Přijdu do fotogalerie
  2. vyplním alespoň jméno
  3. odešlu a to mě refreshne na tu samou stránku, ale už s ID a díky tymu se mě zobrazí druhá komponenta pro nahrávání fotek.
  4. Nahraju fotky (používám dropzone) a ajaxem se mě překreslí grid s fotkama co je pod upload komponentou.

Proč potřebuješ aby mohli poslat fotky spolu s novinkou?

Děkuji za odpověď. Doposud jsme to řešil stejně tak, jak píšeš. Jediným důvodem je pro mě prakticky UX, že uživatel s fotkami má možnost pracovat hned a nemusí první uložit záznam novinky / fotogalerie. Technicky to určitě problémy přináší, ale přijde mi to uživatelsky přívětivější, proto se to snažím vyřešit…

Oli
Člen | 1215
+
0
-

Ještě mě napadlo, hned při v stupu na stránku uložit do db prázdnou novinku s nějakým přepínačem, že se jedná jen o kostru. Ale už budeš mít ID. Pokud přijdeš znova na stránku, tak se jen zeptáš, jestli existuje nějaká kostra, pokud ano nastavíš ID pokud ne vytvoříš novou kostru. Ta kostra by byla jen ID, nic jinýho. Po řádným uložení (ať novinky nebo fotek) by se příznak změnil, že se jedná o již vyplněnou entitu (klidně bez fotek nebo bez popisku novinky).

Problém je, že pak by jsi měl nekonzistentní data. Z hlediska databáze by ti existovalo něco, co by nemělo. Tzn. novinka bez name (např), který by bylo za normálních okolností NOT NULL…

Plus by jsi musel ověřovat jestli se otevřela stránka s kostrou a odeslala taky. Pokud by si otevřel 2 stránky s kostrou a jednu vyplnil a uložil, tak pak by to muselo vygenerovat novou kostru při uložení té druhé kostry (aby ti to nepřepsalo už relevantní data z první kostry)

Uf, snad je to aspoň trochu srozumitelný a dává to smysl :-)

Pavel Kravčík
Člen | 1180
+
+1
-

@Oli: Rozepsal jsem stejnou myšlenku, ale pak to raději neodeslal, protože mi to přišlo jako hloupost. :D

Ale na podobném principu funguje Facebook – mohl by tu kostru normálně vyplnit, aby byla data konzistentní → galerie_name = „Vyplňte jméno galerie“. A nakonec přidat checkbox „publikovat“, kde by mohl být custom validace, která by porovnala jestli někde nezbylo něco defaultního a třeba vypsala confirm – „nezměnili jste jméno galerie“. Do produkce by šly jen věci s „publikováno = 1“. Zbytek by mohl viset někde v „draftech“.

Oli
Člen | 1215
+
+1
-

Presne tak jsem to myslel :)

Yaromil
Backer | 20
+
0
-

@Oli a @PavelKravčík díky moc za nápad(y).

Myšlenka „neuložených / prázdných“ dat v DB se mi moc nelíbí…, ale na druhou stranu pokud se na to podívám ze strany zmíněného draftu, tak to je jiná a věřím, že by to mohlo přinést i jistý uživatelský komfort v dalších směrech,…

Stále jsem ale doufal, že bude nějaké jednoduché řešení, jak někde držet společný parametr (dočasné ID) pro obě komponenty, aniž bych musel nejprve záznam novinky ukládat…

Každopádně díky za nápady, určitě se nad tím zamyslím!