Přeskočit přímo na text


Jak na správné nastavení tvorby URL aliasů na vícejazyčném webu?

Kategorie: Jak na to?
Týká se verze: Drupal 6.x

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?

  • Adresa ke hře bude z hry/had → hry/tetris_a_had
  • Adresa k seznamu screenshotů zůstane hry/had/screenshoty kvůli chybě výše
  • Při dalším uložení hry se opraví na hry/tetris_a_had/screenshoty
  • Ale všechny staré screenshoty budou mít hry/had/screenshoty/[nid]

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

software                        screenshot
========                        ==========
 node-2 <----(cck reference)---- node-4
   |
(překlad)
   |
 node-3 <----(cck reference)---- node-5, node-6

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:

  • zpožděné uloženi URL-aliasu původního uzlu
  • jak hromadně změnit URL aliasů uzlů typu screenshot při změně titulu softwaru

A nový dotaz (ten problém jsem měl i včera, ale zapomněl jsem na něj)

  • pro seznam screenshotů ze hry had (node-2) je adresa „screenshots/2“ nebo „hry/had/screenshoty“ jako URL alias. Pro anglickou verzi (node-3) je to „screenshots/3“ resp. „games/snake/screenshots“. Problém je v tom, že když si zobrazím tento seznam a přepnu jazyk, zůstane původní verze – a to vede k dalším špatným odkazům – jsem ve druhé jazykové verzi. A dotaz je – jak drupalu říct, že „screenshots/2“ a „screenshots/3“ (resp. „hry/had/screenshoty“ a „games/snake/screenshots“) jsou na sebe jazykově vázané? Myslím tím to, že když mám v CZ verzi node/2, odkaz „Angličtina“ nevede na „node/2“, ale „node/3“, protože je to nějak překladově vázané.

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á:

  • musím uložit hru 2×, aby se správně vytvořily odkazy na seznamy screenshotů a logů
  • mám uzel hra nid=2 a alias na seznam screenshotů ukazuje na screenshots/2 a kliknutí na cizí jazyk stále vede na screenshots/2, ale já potřebuji screenshots/3, protože nid=3 je uzel překladu daného jazyka.

Poslat nový komentář

Obsah tohoto pole je soukromý a nebude veřejně zobrazen.
  • You can use Texy! to format and alter entered content.
  • Povolené HTML značky: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <p> <br> <b> <i> <h2> <img> <pre> <sup> <sub> <pre class="php"> <span class="php-keyword1"> <span class="php-var"> <span class="php-num"> <img class="screenshot"> <p class="beginner"> <a class="greybox"> <h3> <h4>

Více informací o možnostech formátování

Type the characters you see in this picture. (verify using audio)
Type the characters you see in the picture above; if you can't read them, submit the form and a new image will be generated. Not case sensitive.

Hledat

Přihlášení

Bezpečnost Drupalu

Z hlediska bezpečnosti je Drupal na velmi vysoké úrovni, díky propracovanému systému hlášení, prověřování a řešení možných problémů.

Čtěte více a odebírejte bezpečnostní aktuality

Poslední komentáře

Kdo je online

Momentálně je online 0 uživatelů a 0 hostů.