Geek tričko zdarma Geek tričko zdarma
Tričko zdarma! Stačí před dobitím bodů použít kód TRIKO15. Více informací zde
Avatar
rhojza
Člen
Avatar
rhojza:15.11.2018 19:00

Zdravím, chtěl bych se dozvědět něco více o routování. Na komerčních webech nebo např. informačních portálech typu novinky, idnes atd... jsou vidět hezké URL, které kopírují stromovou strukturu odkazů na různé sekce. Např. Hlavní rozcestník (menu) -> Sport -> Hokej -> Extraliga -> článek o něčem. URL poté vypadá takto www.domena.cz/…-clanku.html Na hodně webech také tuto strukturu v URL nebo navigaci kopíruje cestička, která je i na tomto webu.

Zkusil jsem: Zkusil jsem postupovat dle tutoriálu Jednoduchý redakční systém MVC. Pochopil jsem (snad) jak funguje routování v tomto projektu. Chápu že URL je domena.cz/kon­troler/parame­tr1/parametr2­..., poté v další části pokročilého tutoriálu je routování předáno na ArticleControler, který vybere článek a popřípadě přidružený kontroler k danému článku a vypíše to, což jsem také schopen pochopit.

Chci docílit: Ale co už nevím, jakým směrem se ubrat pokud bych chtěl mít stromovou navigaci (menu) a podle toho tvořit URL a cestičku jak je vidět na velkých portálech i na tomto webu.

 
Odpovědět 15.11.2018 19:00
Avatar
gold604
Člen
Avatar
gold604:15.11.2018 20:02

Ak by si sa chcel naučiť ako funguje routing od profíkov tak jednoznačne odporúčam skúmať kód open source frameworkov ako Laravel, či Lumen. Lumen je vlastne zjednodušený a menší Laravel... Kód majú veľmi pekne napísaný :)

Pred tým ako sa pozrieš na kód prečítaj ich dokumentáciu o routingu https://lumen.laravel.com/…/5.7/routing. Github repozitár Lumenu: https://github.com/laravel/lumen.

 
Nahoru Odpovědět 15.11.2018 20:02
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:16.11.2018 8:26

Ja ted pouzivam tento jednoduchy routing na jednom webu

### soubor .htaccess ###
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*)$ osob_stranky.php?path=$1 [L,QSA]

  RewriteCond %{REQUEST_FILENAME} -f
  RewriteCond %{REQUEST_URI} !/upload$
  RewriteCond %{REQUEST_URI} !/download$
  RewriteRule ^(.*)$ osob_stranky.php?path=$1/download [L,QSA]

  RewriteRule ^(.*)$ osob_stranky.php?path=$1 [L,QSA]
</IfModule>
  • Faze 1: Neni to adresar, neni to soubor, presmeruj to na osob_stranky.php?pat­h=$1
  • Faze 2: Je to soubor a neni na konci adresy /upload ani /download presmeruj to na osob_stranky.php?pat­h=$1/download
  • Faze 3 Vse ostatne presmeruj na osob_stranky.php?pat­h=$1

Problem s detekci soubor a adresar je ten, ze to nehodi vzdy error 404 na zadanou cestu, proto to ma 3 faze.
Faze1 resi, ze kdyz soubor nebo adresar neexistuje, nech resit presmerovani php.
Faze2. Pokud soubor existuje a na konci adresy neni ani dovnload ani upload, tak tam pridej automaticky download a opet to presmeruj na php. V php pak na download volam specialni script, ktery posila do hlavicky spravne mime/type a posila data. (cili, nenecha nic resit linux, posilat uzivateli treba php kody. Vsechno s priponou php si odfiltruji ve svem kodu. Navic, v php kontroluji cestu a nedovolim mu krast soubory z jineho adresare).
Faze 3 Plati pro vsechno, co ma spravnou adresu, cili na konci je /upload nebo /download, tak pto posli na me smerovani v php.
Z toho plyne, ze zadny adresar se nesmi jmenovat download ani upload. A take samozrejme nechci, aby mi pridaval do adresy download, kdyz uz tam jedno je .../download/dow­nload (to je spatne). Proto ve fazi 2 kontroluji, co je na konci adresy.

Jenze, tento kod je omezeny, neresim zadne parametry stranky. To by se museli podminky nejak rozsirit. Adresy typu
.../neco.php?a=123 nemam testovane, nepouzivam, pravdepodobne mi je prepise takto
.../neco.php?a=123/d­ownload nebo
.../neco.php/dow­nload a nebo
.../neco.php/dow­nload?a=123
Nechtelo se mi studovat, jak presne to funguje.
Ale jeste je mozne, ze tam budu delat zmeny, neni to konecna faze. Program zatim funguje jen castecne. Soubory, stranky zobrazuje, upload take jede. Ale u nekterych adres s ./ a uvnitr adresy s ./ a ../ mi to nefunguje. Zatim jsem odlozil zkoumani proc, protoze staci zadat uplnou adresu a je to v cajku. Ale k tomu se taky dostanu, az poresim jine veci :)

Editováno 16.11.2018 8:26
 
Nahoru Odpovědět 16.11.2018 8:26
Avatar
rhojza
Člen
Avatar
rhojza:16.11.2018 13:03

Spíš než zkoumat kód (jedno řešení), tak by měl zajímal obecný standardní (nejvíce používaný) princip na kterém to funguje. Je to tak řešeno na mnoha webech, i na tom to webu (určitě by se k tomu mohl vyjádřit i autor zdejšího webu). Jde mi o tom, jestli existuje nějaká obecná architektura nebo princip jak to funguje. A podle toho bych chtěl zkusit vytvořit své řešení, nebo se o to aspoň pokusit. :-D

Editováno 16.11.2018 13:05
 
Nahoru Odpovědět 16.11.2018 13:03
Avatar
Daniel Vítek
Tým ITnetwork
Avatar
Odpovídá na rhojza
Daniel Vítek:16.11.2018 13:26

Nadřazené články (něco jako kategorie).

id id_parent name
1 NULL sport
2 1 hokej
3 2 extraliga
4 3 nazev-clanku

Při routování pak parsuješ jednotlivé části adresy:

/sport/hokej/ex­traliga/nazev-clanku

sport

SELECT * FROM article WHERE name = "sport" -> ID 1

hokej

SELECT * FROM article WHERE name = "hokej" AND id_parent = 1 ==> ID 2

extraliga

SELECT * FROM article WHERE name = "extraliga" AND id_parent = 2 ==> ID 3

nazev-clanku

SELECT * FROM article WHERE name = "nazev-clanku" AND id_parent = 3 ==> ID 4

dojel jsi nakonec, vypíšeš článek (případně si zkontroluješ, jestli pod sebou nemá nějaké další, v tom případě by se jednalo o kategorii a vypsal bys vše co má id_parent = 4)

Editováno 16.11.2018 13:27
Nahoru Odpovědět 16.11.2018 13:26
Na síti působím už pěknou řádku let. Pokud budeš něco potřebovat, písni mi, pokusím se ti poradit :)
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:16.11.2018 13:28

No, ono je to predmetem obchodniho tajemstvi a bezpecnostniho utajovani. Zkopiruj sem htacces a nekdo tam objevi moznou diru. Totez php nebo jeho popis. To urcite nechces.
Takze, dotaz, jak to delaji ostatni v tomhle pripade se moc asi nepodeli.

 
Nahoru Odpovědět 16.11.2018 13:28
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Daniel Vítek
Peter Mlich:16.11.2018 13:36

To uz by bylo snadnejsi hledat v pomocne tabulce cely string a vypsat 4 id naraz :)
Slozitejsi by to bylo pri prejmenovani kategorie, ze by se to muselo prepsat na vsech radcich. Ale to neni asi tak dramaticke.

 
Nahoru Odpovědět 16.11.2018 13:36
Avatar
Daniel Vítek
Tým ITnetwork
Avatar
Odpovídá na Peter Mlich
Daniel Vítek:16.11.2018 14:01

On se neptá na htaccess, on se ptá na routování a zanoření, a vychází z MVC ze zdejších tutoriálů.

Což je to co jsem popsal. Jediný úkol htaccess je přesměrovat všechno na index.php, kde si to přežvýká PHP router (například principem který jsem popsal; samozřejmě, je více možností jak to udělat).

Editováno 16.11.2018 14:01
Nahoru Odpovědět 16.11.2018 14:01
Na síti působím už pěknou řádku let. Pokud budeš něco potřebovat, písni mi, pokusím se ti poradit :)
Avatar
rhojza
Člen
Avatar
Odpovídá na Daniel Vítek
rhojza:16.11.2018 15:19

Takže URL rozdělím do pole podle / => budu procházet pole přes foreach a při každém průchodu se zeptám databáze na ID kde name = hodnota položky pole a parent id se rovná id z předešlého dotazu? Budu si muset zkusit napsat nějaký skript, abych to vyzkoušel, jak to funguje :-)

 
Nahoru Odpovědět  +1 16.11.2018 15:19
Avatar
rhojza
Člen
Avatar
rhojza:20.11.2018 9:44

Už se mi povedlo přes cyklus vypsat si id, ale nastala mi další otázka, co když budu mít v url nějaký parametr. Když budu mít rozbitou url v poli dle '/' např. admin/clanky/edit/1 tak budu mít pole $pole = ('admin', 'clanky', 'edit', '1'), tak budu vědět admin - id 1, parent 0; clanky id 2 parent 1, ale pak procházím pole dál a edit neni kategorie a 1 taky ne, takže z tabulky mi to nic nevrátí a url 1 není žádná stránka.

 
Nahoru Odpovědět 20.11.2018 9:44
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.