Routování více jazyků kde nelze z adresy přímo přiřadit presenter

d@rkWolf
Člen | 167
+
0
-

Zdravím, dumám nad přepisem starého administračního rozhraní k webům do Nette(především z důvodu mizerného zabezpečení), ale narážím na problém s tím, jak vytvořit routování. Starý systém funguje tak, že mám tabulu Pages(+ Pages_lang), do které ukládám úplně každou stránku(adresy dělím v základu na stránky a detaily, /o-nas je stránka, /novinky je stránka, /novinky/novy-web je detail novinek) webu v administraci. Tam té stránce přiřadím typ(typy mají přiřazené php templating „šablony“), takže si vytvořím např.:

/o-nás – typ cms (vypadne stránka s obsahem vloženým přes CKEditor, případně připojenou fotogalerií nebo čímkoliv)
/aktuality – typ novinky (generuje nějaký výpis novinek např.)
/zahradni-sekacky – typ produkty (generuje nějaký přehled produktů patřících do dané kategorie)
/retezove-pily – typ produkty (generuje přehled produktů patřících do dané kategorie)
/kontakt – typ kontakt

  • toto určí základní strukturu adresování(strom v administraci přesně reprezentuje jak budou vypadat reálné adresy stránek, klidně můžu mít např. adresu domena/o-nas/cela-firma/obchodni-oddeleni a kanonická je pouze adresa v celém znění, není možné se na stránku „obchodni oddeleni“ dostat pres domena/obchodni-oddeleni – taková stránka neexistuje, považuju přesnou adresu za užitečnou, rád mám v adrese to samé, co v drobečkové navigaci
  • vše samozřejmě můžu uložit v libovolném množství jazyků(/en/about-us, /sk/zahradne-kosacky, whatever) a stránka vždy existuje pouze v jazyce, v kterém má vyplněné texty

A pro zobrazování mám kód, který identifikuje jazyk, tím omezí dotazy do db jen na klíč daného jazyka a následně postupně hledá v tabulkách, první v Pages+Pages_lang, pokud nenalezene, jde na další tabulky s detaily(„1-vanocni-slevy“, „trakturek-mountfield“), s výjimkou situace, kdy hledaná adresa je /neco a je to nenalezeno, protože za této situace neexistuje jiná šance, než 404 (všechny další aktivní moduly mají adresy typu /aktuality/1-vanocni-slevy nebo /zahradni-sekacky/trakturek-mountfield)


Mno a já teď přemýšlím, jak tohle routovat v Nette – dokázal bych to asi vyřešit tak, že budu vše routovat na PagesPresenter a ten bude mít asi 20 tisíc řádek kódu, budou v něm desítky typů Renderů a to je přesně to, co nechci, protože to by celá snaha v zásadě pozbyla smyslu.

  • Potřebuju routovat /o-nas, /en/about-us na PagesPresenter, pak třeba /en/news na NewsPresenter, /novinky/novinka-pokus (případně varianta s ID na zač. detailu novinky – /novinky/1-novy-web) na NewsPresenter:Detail, /zahradni-sekacky na ProductsPresenter atd. – a nemůžu přijít na to, jak podobnou věc v Nette udělat, jak získat Presenter stránky, který není identifikovatelný z adresy, protože ta může být libovolná dle požadavků /novinky, /aktuality, /cokoliv-jineho a furt to musí jít na NewsPresenter, protože je v db uloženo, že ta daná adresa bude vypisovat přehled novinek

V podstatě jediné, co mě napadlo, je vytvořit speciální routing tabulku a do ní ukládat veškeré slugy ve veškerých jazycích s presenterem, ke kterému patří k dohledání a moc se mi takové řešení nelíbí. Zbytečná tabulka, potenciálně veliká, zbytečné dvojité ukládání dat, složitější veškeré modifikace kvůli nutnosti dohledávání v další tabulce atd.

S tím ještě souvisí problém s Kdyby/Translation pro překlady statických textů-nezjistil jsem, jak „on the fly“ přidávat z administrace jazyky, protože jazyky se nastavují přes config.neon. Ve starém systému si můžu z administrace kdykoliv přidat nový jazyk, potřebuji jen iso kód a do všech editací mi přibude záložka pro nově přidaný jazyk včetně statických překladů(mám uloženy v DB, v tomto jediném případě modifikuju sloupce tabulky, přidání jazyka přidá do tabulky sloupec s názvem nově přidaného iso kódu jazyka, není to pěkné, ale je to rychlejší)

Nevím, jestli se mi to podařilo popsat dost pochopitelně, ale kdyby náhodou někdo řešil podobné vícejazyčné variabilní adresování, beru jakékoliv tipy. Cílem je získat čistší, přehlednější kód, lépe zabezpečený, ale neztratit rychlost, stará verze je napsaná v čistém php(7.0+ kompatibilní), přímé mysqli dotazy do DB bez nějakých nadstaveb, protože většinou je nutné, aby web šlapal(a rychle) na naprosto primitivním hostingu za pár korun kde žádné pokročilejší způsoby cachování nejsou k dispozici.

dms
Člen | 93
+
-1
-

Ahoj, v podstatě to máme řešené v systému stejně. Je jedna tabulka určená pro veškerý routing (sloupce jsou myslím id, domain, url, presenter, action, lang) a do této tabulky se při změnách produktů, článku apod. v cms ukládají a aktualizují záznamy. Routing z URL na presenter „funkce match“ je pak řešen jedním dotazem a nemusí se prolézat x tabulek. Zpětný routing „funkce constructUrl“ je také vyřešen jedním dotazem pro každé makro link (je zde řešeno i nějaké kešování aby se hloupě pořád neptalo do db).

Ohledně Kdyby/Translation jsou nejspíše 2 možnosti na které jsem přišel

  1. napsat si loader pro načítání překladů z db
  2. při uložení překladů do db vygenerovat překladové soubory .neon a smazat cache (používám toto)
chemix
Nette Core | 1310
+
0
-
d@rkWolf
Člen | 167
+
0
-

@dms takže ta moje úvaha dává trochu smysl jo? tak se v tom zkusím povrtat tímto směrem a uvidím, co se mi podaří

Kdyby/Translation-já uvažoval nad tím, že by mohlo jít načíst ten překladovej neon file přímo a přímo jej editovat(a pak jen smazat někde cache), ale generovat je z DB bude asi uživatelsky lepší

Jde spíš o to, že když se instaluje Kdyby/Translation, dostupné jazyky se konfigurují v config.neon a ten bych z administrace upravoval nerad-a bez toho si sice můžu přidat další jazyk, dostanu to do DB a vygeneruju překladový soubor(y), ale bez editace config.neonu ten nově přidaný jazyk, resp. překladový slovník pro nově přidaný jazyk, nenačtu.

@chemix já zatím laboruju nad Nette 2.4kou a tam mi jede Kdyby/Translation, na Contribute/Translation sem se díval ale viděl jsem někde poznámky, že tam chybí nějaké užitečné implementace, co byly v Kdyby/Translation(ale nevybavím si teď, o co šlo, protože už je to nějakej čas nazpět…)