Routování + adresy v *.css souborech

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

Mám nový problém: dostal jsem za úkol udělat vzhled stránek tak, že na hodně místech potřebuju v *.css stylu odkazy na obrázky. Jenomže zároveň routuji a to v základu klasika <presenter>/<action> apod. To ovšem znemožňuje v *.css správně odkazovat, protože délka adresy (myslím tím vnoření „adresářů“) se mění (když tam mám třeba default pohled, pak se celá sekce vynechá). V šablonách snadno odkazuji pomocí v {$baseUri}, ale jak v css?

Napadá mě několik řešení, ale ani jedno se mě nelíbí:

  • napsat css styly rovnou do stránky (minus: zbytečně se načítá pro každou stránku)
  • mít css styl s předem vytvořenými absolutními adresami (minus: web mám u sebe na PC a na serveru a pravděpodobně bude ještě na dalším serveru: tj. 2–3 absolutní adresy vzhledem k tomu, že se document root nachází v různých adresářích, takže bych musel udržovat 3 různé css soubory)
  • mít css styl uložený jako další presenter, který místo html stránky vrací styl s překódovanými adresami

Jak se tohle normálně řeší?

Editoval Laethnes (28. 10. 2009 12:36)

Ondřej Mirtes
Člen | 1536
+
0
-

Popisoval jsem to v tomto threadu:

LastHunter napsal(a):

K cestám obrázků a CSS souborů: adresa začínající / je absolutní, adresa bez / je relativní. A musíš to správně nalinkovat jen v HTML, pak v CSSku už stačí mít cesty k obrázkům relativně od daného CSS souboru, tam už adresu, kde projekt běží, řešit vůbec nemusíš.

(V době krásných URL je potřeba používat jen ty absolutní cesty, to je snad jasné :))

A k uvedení správné cesty pro CSS a obrázky v HTML slouží v Nette proměnná {$baseUri} (a pár revizí nazpět byla přidána i {$basePath}, která nemá tuším konečné lomítko), takže sám nic generovat nemusíš. Pokud je projekt v rootu, bude ta proměnná obsahovat /, pokud je v nějaké podsložce, obsahuje /podslozka/. Zápis v HTML pak vypadá takto:

<img src="{$baseUri}images/image.jpg" .... />

Takže stačí, pokud v HTML bude tvoje cesta k CSS souboru začínat „/“ (a povede od document_rootu) a v CSS už žádné změny provádět nemusíš.

Editoval LastHunter (28. 10. 2009 13:09)

Jur4
Člen | 51
+
0
-

Pokud se dobře pamatuju, tak adresy v CSS se berou relativně vzhledem k adrese css souboru. Takže to co je v adrese prohlížeče tě nezajímá, protože to CSSko ma pořád stejnou adresu.

Laethnes
Člen | 53
+
0
-

LastHunter napsal(a):

Popisoval jsem to v tomto threadu:

LastHunter napsal(a):

K cestám obrázků a CSS souborů: adresa začínající / je absolutní, adresa bez / je relativní. A musíš to správně nalinkovat jen v HTML, pak v CSSku už stačí mít cesty k obrázkům relativně od daného CSS souboru, tam už adresu, kde projekt běží, řešit vůbec nemusíš.

(V době krásných URL je potřeba používat jen ty absolutní cesty, to je snad jasné :))

A k uvedení správné cesty pro CSS a obrázky v HTML slouží v Nette proměnná {$baseUri} (a pár revizí nazpět byla přidána i {$basePath}, která nemá tuším konečné lomítko), takže sám nic generovat nemusíš. Pokud je projekt v rootu, bude ta proměnná obsahovat /, pokud je v nějaké podsložce, obsahuje /podslozka/. Zápis v HTML pak vypadá takto:

<img src="{$baseUri}images/image.jpg" .... />

Takže stačí, pokud v HTML bude tvoje cesta k CSS souboru začínat „/“ (a povede od document_rootu) a v CSS už žádné změny provádět nemusíš.

Jur4 napsal(a):

Pokud se dobře pamatuju, tak adresy v CSS se berou relativně vzhledem k adrese css souboru. Takže to co je v adrese prohlížeče tě nezajímá, protože to CSSko ma pořád stejnou adresu.

No, to o tom, že adresa začínající na / je absolutní vím a znám i to používání baseUri (vlastně jinak, než bez baseUri na soubory neodkazuju – stejně by mě to nefungovalo) a díky tomu vůbec neřeší zda jsem na ic.cz nebo na localhostu. Takže adresu k CSS souboru neřeším – tu tam mám a funguje. S čím jsem měl problém bylo jen a pouze odkazování v samotném CSS souboru.

Nicméně, jak oba píšete, adresy v CSS souborech jsou relativní vzhledem k poloze CSS souboru a ne stránky – což jsem netušil – a to je taky řešení mého problému. Takže oběma moc díky, tohle mě už funguje přesně, jak potřebuju. Fakt dík ;)

Laethnes
Člen | 53
+
0
-

Hm. Funguje to ve FF i IE, takže je to spíš jen taková rýpavá poznámka: píšeš

… A musíš to správně nalinkovat jen v HTML, pak v CSSku už stačí mít cesty k obrázkům relativně od daného CSS souboru, tam už adresu, kde projekt běží, řešit vůbec nemusíš.

(V době krásných URL je potřeba používat jen ty absolutní cesty, to je snad jasné :)) …

Ale právě v CSS to jinak, než relativně nejde ne? Nebo to chápu špatně, co píšeš? Na jednu stranu kvůli tomu, že mám projekt v různých adresářových strukturách a kvůli routování (tedy doba krásných URL) nemůžu v CSS souboru odkazovat jinak, než relativně, ale ty píšeš, že právě kvůli tomuto – routování – se musí používat absolutní cesty? Nebo to chápu blbě? (To, že v HTML musím odkazovat jedině absolutně vím a jinak to nedělám.)

_Martin_
Generous Backer | 679
+
0
-

Laethnes napsal(a):

Ale právě v CSS to jinak, než relativně nejde ne? Nebo to chápu špatně, co píšeš? Na jednu stranu kvůli tomu, že mám projekt v různých adresářových strukturách a kvůli routování (tedy doba krásných URL) nemůžu v CSS souboru odkazovat jinak, než relativně, ale ty píšeš, že právě kvůli tomuto – routování – se musí používat absolutní cesty? Nebo to chápu blbě? (To, že v HTML musím odkazovat jedině absolutně vím a jinak to nedělám.)

Neřeš to ;)

Ondřej Mirtes
Člen | 1536
+
0
-

Ano, v HTML se na soubory odkazuješ vždy absolutně, v CSS vždy relativně :)

Laethnes
Člen | 53
+
0
-

Fajn. Kapišto. Díky ;)

Honza Marek
Člen | 1664
+
0
-

WebLoader ti pomůže, obzvláště tato fičura

Laethnes
Člen | 53
+
0
-

Honza M. napsal(a):

WebLoader ti pomůže, obzvláště tato fičura

Vypadá to rozhodně zajímavě, díky. Zatím mě postačí to relativní adresování od místa, kde je soubor *.css, ale tohle rozhodně vypadá zajímavě co do jiných věcí, co jsem chtěl řešit. Dík :)

tom
Člen | 171
+
0
-

LastHunter napsal(a):

<img src="{$baseUri}images/image.jpg" .... />

Pokud mam v databazi text

<p><img src="{$baseUri}images/obrazek.jpg" /></p>

a chci ho zobrazit, tak je potreba ho po nacteni necim prohnat abych se zbavil toho {$baseUri}? Anebo jak zaridit aby to zafungovalo a misto {$baseUri} se vypsala ta adresa?

redhead
Člen | 1313
+
0
-

A proč proboha neukládáš jen tu adresu za {$baseUri} ???
V šabloně pak stačí za {$baseUri} vložit řetězec z db.

Editoval redhead (30. 10. 2009 15:51)

tom
Člen | 171
+
0
-

redhead napsal(a):

A proč proboha neukládáš jen tu adresu za {$baseUri} ???
V šabloně pak stačí za {$baseUri} vložit řetězec z db.

Ono v te databazi je to v ramci textu a ne jako samostatny zaznam … Pro ilustraci, jedna se o tabulku aktualit a v textech tech aktaulit jsou ty tagy pro obrazky … puvodne to tam bylo takto

<img src="images/image.jpg" .... />

a chtel jsem vyuzit {$baseUri} abych se vzdy odkazoval spravne …

Editoval tom (30. 10. 2009 16:12)

Yrwein
Člen | 45
+
0
-

tom: Můžeš si zabalit str_replace do nějaké jiné funkce, a pak použít jako helper. Nebo, pokud ti relativní url tvoří nějaký wysiwyg editor, použít tag <base>. :o)

tom
Člen | 171
+
0
-

Yrwein napsal(a):

tom: Můžeš si zabalit str_replace do nějaké jiné funkce, a pak použít jako helper.

aha to bude ono, zkusim dik

Ondřej Mirtes
Člen | 1536
+
0
-

Nebo když už píšeš texty pro jeden web, tak víš, v jaké složce obrázky jsou, tak to dát napevno i do textů.

Anebo použít Texy, kde se cesty k obrázkům nastavují na jednom místě :)