Jak na správné nastavení tvorby URL aliasů na vícejazyčném webu?
S tímhle bojuji týdny a už fakt nevím, kudy kam.
Nejprve zadání, co jsem si vymyslel: mám seznam her a programů (typ uzlu: software) a ke každému z nich lze přiřadit screenshot. Přiřazení dělám pomocí cck node reference from url. Dále zde mám seznam screenshotů k danému softwaru, vytvořeno jako pohled.
Jak jsem to udělal: protože hru lze vytvořit v angličtině i češtině, je logické, že screenshot lze přidat též v obou verzích. Jenže jak potom udělat seznam screenshotů tak, aby tam byly oba typy? A nejlépe aby to fungovalo s případným třetím jazykem? Vyřešil jsem to tak, že jsem ke screenshotu přidal cck computed filed, do něhož uložím tnid – načtu referencovaný uzel a z něj získám tnid (pokud není, pak nid) a výběr v pohledu dělám pomocí této hodnoty. A protože chci mít hezká URL pro oba jazyky, vytvořil jsem si pravidlo (z modulu Rules), které při každém uložení uzlu typu software vytvoří URL alias pro seznam screenshotů. Funguje to takhle:
- první část URL je ta samá, jako od daného uzlu (např. hry/had). K tomuto účelu jsem si vytvořil vlastní token, který do metody drupal_get_path_alias vloží „node/$object->nid“ a jako jazyk $node->nid (aktuální jazyk je nežádoucí kvůli synchronizaci překladů – upravím EN verzi, upraví se tedy i CS verze, ta ovšem pro sebe vyvolá pravidlo, které by pak bralo EN url verzi a místo „hry/had“ by se objevilo „node/2“ (např.)).
- druhá část je lokalizovaný řetězec „screenshots“ (vytvořil jsem si pro to nový token)
V čem je problém:
- Je to o krok zpožděné. Když vytvořím hru had s nid 2, vytvoří se alias node/2 → hry/had, ale v rámci screenshotů node/2/screenshoty a teprve při dalším uložení (kliknu upravit → uložit) se uloží hry/had/screenshoty. Tedy když se vyvolává pravidlo „po vytvoření nového obsahu“ a „po aktualizování existujícího obsahu“, není ještě vytvořen URL alias samotného uzlu. (Což se projeví i tak, že pokud změním titulek, projeví se to v URL uzlu hry, ale v aliasu seznamu screenshotů ne – musím to podruhé uložit.)
- Při vytváření nového překladu to ignoruje tnid. Vytvořím hru had, nid 2. Pak ho přeložím – nid 3. Při vytvoření nového uzlu ovšem token tnid vrací 3 a ne 2. Při dalších uložení je to ale správně. (Takže alias „games/snake/screenshots“ vede na „screenshots/3“ (to je adresa v pohledu) a ne „screenshots/2“. Po druhém uložení ale již ano.) Takže když se vyvolává pavidlo pro „vytvoření nového obsahu“, tnid není uloženo.
- Pokud v přidám akci „uložit obsah“ a zaškrtnu „force“, výše zmíněné problémy zmizí, ale překlady se na sebe nenavážou. Tedy vytvořím hru had (nid 2). Vytvořím překlad a uložím (nid 3). Když si kliknu na překlady hada (2), v seznamu není žádný překlad a stejně tak v případě snake (nid 3). Navíc pokud si otevřu takto vytvořený uzel, z bloku „jazyky“ zmizí druhý jazyk.
Jediné řešení, které mne napadlo je místo vyvolání tohoto pravidla jej načasovat. Po té nějak vyvolat cron a nakonec přesměrovat na novou stránku. Nicméně problém je v tom, že
- cron přes PHP v pravidle nemohu spustit, protože pořád platí, že ne vše je uloženo
- když spustím cron tak, že do pravidla vložím přesměrování na URL „cron.php“, pak nemám jak po jeho skončení opět přesměrovat. Když vytvořím přesměrování na „cron.php?destination=node/[node:nid]“, tak to nefunguje, když vytvořím akci „Page redirect“ v pravidlu, které se vyvolá cronem, nepřesměruje. Ve výpisu ovšem je "28.982 ms Action execution: "Page redirect""…
Ještě...
Chjo, už zas jsem se zapomněl přihlásit.
Ještě jedna věc – při vytvoření screenshotu si aktivuji pravidlo, které vytvoří pro screenshot url alias a to tak, že si nejprve zjistí alias na jeho seznam (screenshot má odkaz na hru, ke které se vztahuje, z něj si uloží tnid (computed field) a z něj pravidlo pak vytvoří adresu „screenshots/tnid-referencovaného-uzlu“ a z něj vytáhne alias "hry/had/screenshoty) a k němu prostě přidá nid. Tohle funguje hned napoprvé a bez problémů. Jenže co když změním název hry?
A můj dotaz – existuje možnost, jak všechny tyto URL aliasy upravit?
Může mi někdo vysvětlit, proč
Může mi někdo vysvětlit, proč po té, co dny hledám, řeším, Googlím a nic, pak napíšu dotaz do fóra a na druhý den to jenom tak levou zadní vyřeším? Takže pokud jde o tnid, není třeba to řešit – podařilo se mi sesmolit pohled (view) tak že pro
když jako argument zadám 2 nebo 3, vždy to vybere 4, 5 a 6 (a tedy mohu URL-aliasy tvořit dle nid – „screenshots/2“ pro jeden jazyk a „screenshots/3“ pro druhý).
Stále zde ale mám problémy:
A nový dotaz (ten problém jsem měl i včera, ale zapomněl jsem na něj)
a opravdu chcete menit url
a opravdu chcete menit url aliasy na funkcnim webu? nadela to vic skody nez uzitku.
To je sice fakt (proto silně
To je sice fakt (proto silně uvažuji o zaškrtnutí volby „při tvorbě nového aliasu ponechat starý“), ale to o hromadné změně aliasů je víceméně „kdyby náhodou“ (např. po přidání 20ti screenshotů si všimnu chyby v nadpisu ještě ten den, kdy to všechno tam vložím) a ostatní problémy se toho zas tolik netýká:
Poslat nový komentář