Slevový týden - Květen Office week
Pouze tento týden sleva až 80 % na e-learning týkající se MS Office
30 % bodů zdarma na online výuku díky naší Slevové akci!

Lekce 3 - Směrovač (router)

V minulé lekci, .htaccess, autoloader a obecný kontroler, jsme si nastavili .htaccess, vytvořili index.php a obecný kontroler.

Dnes se budeme věnovat směrovači, tedy komponentě, která podle URL adresy nasměruje požadavek na správný kontroler.

Směrovač

Směrovač (anglicky router) dostane URL adresu, kterou si zpracuje a na jejím základě zavolá příslušný kontroler. Opět je několik způsobů, kterými lze směrovač implementovat a opět jsem vybral ten nejjednodušší. Princip směrovače nápadně připomíná princip kontroleru, toho také využijeme, směrovač bude kontroler.

Směrovač tedy přidáme jako kontroler. Ve složce kontrolery vytvoříme soubor SmerovacKontro­ler.php a do něj stejnojmennou třídu, která bude dědit z obecného Kontroleru, který jsme si udělali minule. Nezapomeneme implementovat abstraktní metodu zpracuj().

Směrovač dle adresy zjistí, který kontroler voláme, vytvoří nám ho a zároveň i uloží do atributu $kontroler, který třídě rovněž přidáme.

<?php

class SmerovacKontroler extends Kontroler
{

    protected $kontroler;

    public function zpracuj($parametry)
    {
    }

}

Možná je trochu matoucí, že v sobě máme vlastně vložené 2 kontrolery, ale je to tak. Kontroler SmerovacKontroler bere URL od uživatele, tu zpracuje a podle ní zavolá příslušný vložený kontroler (např. ClanekKontroler). Oba kontrolery budou mít pohled, Smerovac bude mít šablonu s rozložením stránky (hlavička, menu atd.) a vložený kontroler bude mít šablonu s obsahem dané stránky (článek, kontaktní formulář, přihlašovací obrazovka atd.).

Parsování URL adresy

Jako první si naparsujeme URL adresu a to přímo v PHP. Adresa nám přijde jako textový řetězec, bude vypadat stejně, jako ta v adresním řádku. Pojďme se dohodnout nejprve na jejím formátu, který bude následující a který jsme již minule naťukli:

http://www.domena.cz/kontroler/parametr2/parametr3

V praxi by vypadala třeba takto:

http://www.domena.cz/clanek/nazev-clanku

Říkáme, že voláme kontroler ClanekKontroler a předáváme mu parametr "nazev-clanku". Kontroler si už článek vezme od modelu a předá ho pohledu, který ho vypíše uživateli.

Např. z této URL:

http://www.domena.cz/kontroler/parametr2/parametr3
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

bychom potřebovali získat takového pole:

Array
(
    [0] => kontroler
    [1] => parametr2
    [2] => parametr3
)

Přijdeme třídě tedy metodu parsujURL():

private function parsujURL($url)
{

}

K naparsování url adresy nám PHP poskytuje funkci parse_url(), která za nás sice neudělá všechnu práci, ale pomůže nám oddělit část s protokolem a doménou od části s parametry. Funkce vrátí asociativní pole, část "/kontroler/pa­rametr2/parame­tr3" dostaneme pod indexem "path". Pozor si dáme jen na "/", kterým může tato část začínat, pokud tam je, jednoduše ho odstraníme pomocí funkce ltrim(). Odstraníme také bílé znaky kolem URL (kdyby za ni třeba někdo napsal mezeru), k tomu slouží PHP funkce trim().

$naparsovanaURL = parse_url($url);
$naparsovanaURL["path"] = ltrim($naparsovanaURL["path"], "/");
$naparsovanaURL["path"] = trim($naparsovanaURL["path"]);

Nyní není nic jednoduššího, než si výsledný řetězec rozbít podle lomítek na pole jednotlivých parametrů:

$rozdelenaCesta = explode("/", $naparsovanaURL["path"]);

Výsledek vrátíme a funkce k parsování URL je hotová:

return $rozdelenaCesta;

Volání vloženého kontroleru

Přesuňme se do metody zpracuj(), která se nám na začátku požadavku zavolá. V argumentu $parametry budeme očekávat pole, kde na 1. indexu bude URL adresa. Tu si naparsujeme pomocí naší metody:

$naparsovanaURL = $this->parsujURL($parametry[0]);

Zatím nebudeme ošetřovat případy, kdy je URL zadána nekompletní nebo neexistující.

Získání názvu třídy

První úkol bude zjistit jméno třídy kontroleru. Již víme, že název kontroleru je 1. parametr v naparsované URL adrese. Pro URL adresy však platí jiné konvence, než pro názvy tříd. Proto nám název kontroleru přijde jako "nazev-kontroleru" a my z něj potřebujeme vytvořit "NazevKontrole­ruKontroler", tedy např. řetězec "clanek" převedeme na "ClanekKontroler" a "vypis-uzivatelu" na "VypisUzivate­luKontroler". Na tento převod si opět vytvoříme ve třídě metodu, bude se jmenovat pomlckyDoVelblou­diNotace();

private function pomlckyDoVelbloudiNotace($text)
{

}

Použijeme PHP funkci ucwords(), která zvětší počáteční písmeno všech slov ve větě. Funkce sice není UTF-safe, ale to nám zde nevadí. Z parametru si tedy nejprve uděláme větu a to jednoduše tak, že pomlčky nahradíme mezerami:

$veta = str_replace('-', ' ', $text);

Následně zvětšíme první písmena slov a mezery odstraníme:

$veta = ucwords($veta);
$veta = str_replace(' ', '', $veta);

To je vše. Kód by šel napsat i do jednoho řádku, ale pro potřeby tutoriálu jsem ho rozepsal. Metoda převede např. řetězec "vypis-uzivatelu" na VypisUzivatelu. Výsledek navrátíme:

return $veta;

Vraťme se do metody zpracuj() a zjistěme si název třídy kontroleru pomocí naší nové metody:

$tridaKontroleru = $this->pomlckyDoVelbloudiNotace(array_shift($naparsovanaURL)) . 'Kontroler';

Pomocí array_shift() jsme získali 1. parametr z naparsované URL a zároveň ho z tohoto pole i odstranili, již ho tam totiž nebudeme potřebovat.

Název třídy kontroleru si pro testovací účely pouze vypišme:

echo($tridaKontroleru);

Stejně tak si vypišme i zbytek pole z URL adresy:

echo('<br />');
print_r($naparsovanaURL);

Volání směrovače

Přesuňme se do index.php a vytvořme si zde směrovač. Necháme ho zpracovat URL adresu, kterou v PHP nalezneme v superglobálním poli $_SERVER pod klíčem REQUEST_URI. Hodnotu ještě musíme vložit do pole, jelikož to metoda zpracuj() očekává:

$smerovac = new SmerovacKontroler();
$smerovac->zpracuj(array($_SERVER['REQUEST_URI']));

Díky autoloaderu zminula se nám třída SmerovacKontroler sama načte. Celou magii si vyzkoušíme, zadáme následující URL:

localhost/clanek/nazev-clanku/dalsi-parametr

A měli bychom dosáhnout následujícího výsledku:

Your page
localhost/cla­nek/nazev-clanku/dalsi-parametr

Směrovač nám tedy funguje, z URL adresy nám zjistil název kontroleru a pole parametrů. Pro dnešek toho již bylo dost.

Příště, v lekci Propojení kontroleru a pohledu, si propojíme pohled s kontrolerem.


 

Stáhnout

Staženo 2930x (4.21 kB)
Aplikace je včetně zdrojových kódů v jazyce PHP

 

 

Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
29 hlasů
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor sítě se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Předchozí článek
.htaccess, autoloader a obecný kontroler
Všechny články v sekci
Jednoduchý redakční systém v PHP objektově (MVC)
Miniatura
Následující článek
Propojení kontroleru a pohledu
Aktivity (10)

 

 

Komentáře

Avatar
kamil.kotek
Člen
Avatar
kamil.kotek:9.2.2013 22:20

zdravím,
došel jsem do bodu,kde potřebuju udělat vlastně jakoby podsložky..
jedná se o administraci
potřeboval bych udělat administrace/nas­taveni
ale nějak jsem nepochopil z tohohle tutorialu jak na to
to se vytvoří kostrukter kterej vyvolá model,ve kterém budou ty jakoby složky? public function....
v normálním php bych udělal normální složu,ale tohle..nejsem si jistej jak na to..díky za radu :)

 
Odpovědět
9.2.2013 22:20
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na kamil.kotek
David Čápka:10.2.2013 7:41

Pokračuj dál v seriálu a dozvíš se to ;-)

Odpovědět
10.2.2013 7:41
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
kamil.kotek
Člen
Avatar
kamil.kotek:10.2.2013 8:59

já jsem prošel už všechny serialy... :D
můžeš aspon napsat v jakém konkrétně to je? dík

 
Odpovědět
10.2.2013 8:59
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na kamil.kotek
David Čápka:10.2.2013 9:04

Pokud jsi je prošel, měl bys to vědět :) Administrace se tam dokonce řeší.

Odpovědět
10.2.2013 9:04
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
kamil.kotek
Člen
Avatar
Odpovídá na David Čápka
kamil.kotek:10.2.2013 10:18

prošel jsem to znovu,a..
Našel jsem jen ten editor,ale to není jakoby můj příklad,jelikož článek se bere z databáze,ta url..
administrace má novej kontruktor,jak hlavní administrace,tak i nastavení apod...
ve stylu administrace/nas­taveni,profily,web­... apod..

PS: nebo moment..ten parametr..není to náhodou v modelu? každá funkce v modelu=nový parametr?
pokud ano,tak jak mu nastavím novej konstruktor?jelikož všechno nemůžu mít v modulu,jelikož každé nastavení má svůj pohled,a konstruktor...

Editováno 10.2.2013 10:22
 
Odpovědět
10.2.2013 10:18
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na kamil.kotek
David Čápka:10.2.2013 10:34
  1. Nic nemá kontruktor, nejbližší slovo co se k tomu blíží je konstruktor, ale stejně nedává smysl v kontextu tvé věty.
  2. Nevím o žádném modulu, asi myslíš modelu.

Střílíš zde nesmyslné pojmy, přečti si seriál znovu a asi se také podívej na OOP v PHP, které je pro seriál předpokladem.

Editováno 10.2.2013 10:35
Odpovědět
10.2.2013 10:34
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
kamil.kotek
Člen
Avatar
Odpovídá na David Čápka
kamil.kotek:10.2.2013 16:27

no,tak jsem to zase prošel,ale nemůžu to najít,můžes mě alspon říct v jaké části tutorialu to je?byl bych ti vděčný díky

 
Odpovědět
10.2.2013 16:27
Avatar
kamil.kotek
Člen
Avatar
Odpovídá na David Čápka
kamil.kotek:11.2.2013 19:29

Tady je napsáno,Cituji:
http://www.domena.cz/…r2/parametr3
Já ale nepotřebuju kontroler/parametr2
ale kontroler/kon­troler2/
jelikož každá stránka v nastavení má svůj pohled...
a po přečtení článků jsem nic takovýho že by se to tu řešilo nenašel.
Díky za radu :)

 
Odpovědět
11.2.2013 19:29
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na kamil.kotek
David Čápka:11.2.2013 19:33

Určitě nepotřebuješ 2 kontrolery v sobě. Tvůj dotaz nedává smysl, přečti si znovu definici architektury. Kdyby tu nebyla, tak bych ti to vysvětlil, ale nevidím důvod, proč se opakovat, když je to tu přehledně vysvětleno.

Odpovědět
11.2.2013 19:33
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
kamil.kotek
Člen
Avatar
kamil.kotek:11.2.2013 19:44

Já chápu že nemůžou bejt 2 kontrolery,proto se ptám jak na to..
jelikož bych rád uvítal kdyby mě to šlo takhle jak to chci..
pokud jsi to nepochopil tak se to pokusím vysvětlit znovu.
Mám administraci
na stránce url/administrace
je přehled,histo­rie,novinky a menu
a v menu pokud klikne třeba na historie,tak bych potřeboval aby se to zobrazilo jakoby v pod kategorii tý administrace
tudíž administrace/his­torie
v čemž vlastně ta historie bude mít svůj vzhled,tak i administrace(hlavní stránka adminu)
prostě jinej vzhled,jiný nastavení
já chápu ten princip,že pokud bych chtěl parametr za kontruktorem,tak si musím vytvořit model,ale ty pohledy v modelu neudělám nebo ano?
Pokud se mýlím tak mě oprav,jsem přeci jen ještě pořád začátečník a pořád se mám co učit.
Díky za odpověd

Editováno 11.2.2013 19:45
 
Odpovědět
11.2.2013 19:44
Avatar
kamil.kotek
Člen
Avatar
Odpovídá na David Čápka
kamil.kotek:12.2.2013 17:05

ještě jednou jsem si to projistotu všechno přečetl,a musím říct,že to co potřebuji jsem tam nevyčetl,proto bych potřeboval tvojí radu děkuji :)

 
Odpovědět
12.2.2013 17:05
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na kamil.kotek
David Čápka:12.2.2013 20:33

Již jsem ti jednou psal, že není žádný kontruktor, jak mi můžeš napsat, že jsi to četl a potom napsat tohle? Pokud dělá historie něco jiného než administrace, je to samostatná stránka a s administrací tedy nemá nic společného, není důvod proč by měla stejný kontroler, kterému asi říkáš kontruktor. Udělej mi tu radost a přečti si alespoň 1. článek tohoto seriálu.

Odpovědět
12.2.2013 20:33
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
kamil.kotek
Člen
Avatar
Odpovídá na David Čápka
kamil.kotek:12.2.2013 20:43

já vím že to je konstruktor,jen mě tam pořád vynechává to "s"...
ta historie má spadat pod administraci,je­likož jí má vidět pouze admin a to přímo v té administraci,má akorát svůj konstruktor,jelikož má svůj vlastní vzhled(pohled)

 
Odpovědět
12.2.2013 20:43
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na kamil.kotek
David Čápka:12.2.2013 21:16

Ne, žádný konstruktor v MVC není, vzdávám to, tobě není pomoci. Vše potřebné tu je popsáno.

Odpovědět
12.2.2013 21:16
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
kamil.kotek
Člen
Avatar
Odpovídá na David Čápka
kamil.kotek:16.2.2013 23:56

Omlouvám se,jsem blbec.. už jsem na to přišel... akorát lomítko nejde,jelikož to rozbijí ty řetězce a nechtělo se mě to předělávat,tak jsem to nastavil na "|"
a šlape to :)

 
Odpovědět
16.2.2013 23:56
Avatar
zdenek.kral
Člen
Avatar
zdenek.kral:10.3.2013 13:45

Zdravím,

dostal jsem se k tomuto seriálu a při ladění na localhostu jsem narazil na nevyhovujicí parsování vstupní url adresy a chybnému vytvoření kontroleru. Trochu jsem to upravil a pokud má někdo zájem, tak to lze použít při ladění na lokálním serveru.

        private function parsujURL($url)
        {
                // Naparsuje jednotlivé části URL adresy do asociativního pole
        $naparsovanaURL = parse_url($url);
                // Odstranění počátečního lomítka
                if (mb_strpos($naparsovanaURL["path"], "/") === 0)
                        $naparsovanaURL["path"][0] = "";
                // Rozbití řetězce podle lomítek
                $rozdelenaCesta = explode("/", $naparsovanaURL["path"]);
/*
    // Odstranění bílého místa z částí řetězce
                for ($i = 0; $i < count($rozdelenaCesta); $i++) // verze pro produkční server
                {
        $rozdelenaCesta[$i] = trim($rozdelenaCesta[$i]);
    }
                return $rozdelenaCesta;
*/
    ////////////////////////////////////////////////////////////////////////////////////
    // Upravené vstupní pole pro localhost, na produkčním serveru nutno zakomentovat,
    // z adresy http://localhost/AdresarAplikace/JmenoKontroleru/parametr01/parametr02
    // chybne vyhodnoti jako "KontrolerAdresarAplikace" místo "KontrolerJmenoKontroleru"
    ////////////////////////////////////////////////////////////////////////////////////
    $lastIndex = ((count($rozdelenaCesta))-1);
    // verze pro localhost zaciname indexem od 1 místo od 0
    $localhostCesta = array_slice($rozdelenaCesta, 1, $lastIndex);
    // Odstranění bílého místa z částí řetězce
    for ($i = 0; $i < count($localhostCesta); $i++)
    {
                        $localhostCesta[$i] = trim($localhostCesta[$i]);
    }
                return $localhostCesta;
        }

Zdraví Zdeněk

 
Odpovědět
10.3.2013 13:45
Avatar
teeg
Neregistrovaný
Avatar
Odpovídá na zdenek.kral
teeg:10.3.2013 14:04

To je způsobeno právě tím, že máš tu aplikaci v samostatném adresáři. Pokud by jsi ji měl čistě v kořenovém adresáři, tak vše funguje. V případě, že to máš ještě v té složce, tak by mělo stačit před vrácením parsované URL odstranit první prvek(což by měl být název složky) např takhle:

aray_shift($rozdelenaCesta);
      return $rozdelenaCesta;
 
Odpovědět
10.3.2013 14:04
Avatar
zdenek.kral
Člen
Avatar
zdenek.kral:11.3.2013 11:44

Je to dáno tím, že mám více projektů na localhostu v jednotlivých adresářích. Tvoje řešení je podstatně elegantnější a kratší, takže doporučuji všem místo mého návrhu.

Zdraví Zdeněk

 
Odpovědět
11.3.2013 11:44
Avatar
Kit
Redaktor
Avatar
Odpovídá na zdenek.kral
Kit:11.3.2013 11:48

Takový problém jsem kdysi řešil. Nakonec jsem to udělal tak, že každý projekt dostal samostatnou privátní doménu.

Odpovědět
11.3.2013 11:48
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Neaktivní uživatel:15.4.2013 18:55

Nevím jestli to je chyba, nebo je php nějaký prazvláštní, nebo to tak má být a budu zase za debila :D

  1. Proč je v IFu === místo ==?
  2. Nikde tam není na konci ?>?

Berte to tak, že v PHPku jsem nedávno začal, a překvapuje mě, jak je v některých ohledech volný a nedůsledný :D

Odpovědět
15.4.2013 18:55
Neaktivní uživatelský účet
Avatar
Neaktivní uživatel:15.4.2013 19:00

A ještě

  1. Vadí když si budu názvy metod psát s prvním velkým písmenem?
Odpovědět
15.4.2013 19:00
Neaktivní uživatelský účet
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Neaktivní uživatel
David Čápka:15.4.2013 19:04

Pokud s PHP začínáš, určitě není dobré začínat tímto seriálem, je pro pokročilé. Tři rovnítka porovnávají i s ohledem na datový typ, dvě ti vrátí true třeba pro prázdný string a nulu. Pokud píšeš třídy, nemusíš PHP direktivu zavírat, platí do konce souboru. Metoda s velkým písmenem je výmysl C#, do PHP bych to netahal.

Odpovědět
15.4.2013 19:04
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Odpovědět
15.4.2013 19:06
Neaktivní uživatelský účet
Avatar
Jan Němec
Člen
Avatar
Jan Němec:28.7.2013 1:29

Ahoj, narazil jsem na chybu v funkci parseURL() a to pro první a poslední lomítko v path. Pro ostatní přikládám funkci

private function parseURL($url){
        $parsedURL = parse_url($url);
        $parsedPath = explode("/",$parsedURL["path"]);
        foreach($parsedPath as $path){
                if(empty($path))
                        continue;
                $return[] = trim($path);
        }
        return $return;
}
Odpovědět
28.7.2013 1:29
Co si nadrobíš, to si sežereš.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jan Němec
Kit:28.7.2013 1:49

Nebo třeba takhle bez cyklu:

function parseURL($url) {
    $parsedURL = parse_url($url);
    $parsedPath = explode("/",$parsedURL["path"]);
    return array_filter($parsedPath, function($path) {
        return !empty($path);
    });
}
Odpovědět
28.7.2013 1:49
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Jan Němec
David Čápka:28.7.2013 9:03

První lomítko se tam přeci odstraňuje, poslední ničemu nevadí.

Odpovědět
28.7.2013 9:03
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:29.7.2013 2:18

A jak si poradí s tím, když ti tam někdo vecpe tohle?

http://www.domena.cz//kontroler//parametr2//parametr3
Odpovědět
29.7.2013 2:18
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:29.7.2013 8:40

Tak je 1., 3. a 5. parametr prázdný.

Odpovědět
29.7.2013 8:40
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:29.7.2013 8:41

Pokud narážíš na kontrolu existence kontroleru, tak tak je v dalších dílech.

Odpovědět
29.7.2013 8:41
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
tribal.cz
Redaktor
Avatar
tribal.cz:8.12.2013 12:03

ahoj pisu to presne podle serialu a vyplivlo i to toto :

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at admin@example.com to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.

t same mi to ukazalo i kdz sem zdrojak stahnu a dal to na local pouzivam wampserver

 
Odpovědět
8.12.2013 12:03
Avatar
Odpovídá na David Čápka
Libor Šimo (libcosenior):12.1.2014 8:35

Mám podobný problém ako tribal.cz:

Odpovědět
12.1.2014 8:35
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Libor Šimo (libcosenior)
Libor Šimo (libcosenior):12.1.2014 9:05

Už je mi to jasné. Treba zadať takto:
localhost/Redak­cnySystem/cla­nek/nazev-clanku/dalsi-parametr
a výpis je:
RedakcnySystem­Kontroler
Array ( [0] => clanek [1] => nazev-clanku [2] => dalsi-parametr )

Dúfam, že je to tak správne.

Editováno 12.1.2014 9:07
Odpovědět
12.1.2014 9:05
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Libor Šimo (libcosenior)
Libor Šimo (libcosenior):12.1.2014 9:08

Nie je to správne, pretože sa nevytvorí správny názov triedy kontroleru.
Čo s tým?

Odpovědět
12.1.2014 9:08
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Libor Šimo (libcosenior)
Libor Šimo (libcosenior):12.1.2014 10:11

Už som na to prišiel.
Pôvodne som vytvoril v netbeans nový projekt RedakcnySystem a do neho som pridal zložky a ostatné súbory.
Zrušil som to a vytvoril PHP Application with Existing Sources a dal som východziu zložku htdocs a do nej som dal potrebné zložky a súbory.
Teraz to už pracuje ako má. :)

Odpovědět
12.1.2014 10:11
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
vb
Člen
Avatar
Odpovídá na tribal.cz
vb:4.2.2014 11:56

Musíš povolit na Apache rewrite

 
Odpovědět
4.2.2014 11:56
Avatar
Winnie
Neregistrovaný
Avatar
Winnie:4.2.2014 17:41

Dá se to rozběhnout na linuxu? a ten web když si zobrazím cez local tak se mi nic nenačte

 
Odpovědět
4.2.2014 17:41
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Winnie
David Čápka:6.2.2014 16:55

Samozřejmě, že dá. Musíš mít web v rootu a zapnutý mod rewrite.

Odpovědět
6.2.2014 16:55
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
tonko
Neregistrovaný
Avatar
tonko:15.2.2014 12:13

super článek ale mám menší problém který nedokážu vyřešit, ve složce htdocs mám složku myOwnCms a v tom to všechno tvořím -> modely, view atd..
jenomže když parsuju tu url, tak mi to jako Controller bere to myOwnCms a to nechci, zkoušel jsem všude kde se pracuje s url dávat index 1 místo 0 ale je to zřejmě málo

 
Odpovědět
15.2.2014 12:13
Avatar
00
Člen
Avatar
Odpovídá na tonko
00:16.2.2014 10:50

Myslím si, že před

return $rozdelenaCesta;

se napíše

array_shift($rozdelenaCesta);

// Nečetl jsem to celé, ale nejspíš to bude ta chyba.

Editováno 16.2.2014 10:51
 
Odpovědět
16.2.2014 10:50
Avatar
Tori
Člen
Avatar
Tori:22.3.2014 8:58

Dotaz na autora: podle jaké logiky je router potomkem (= specielním případem) kontroleru? Četla jsem tu větu, že "princip routeru připomíná princip kontroleru", ale na co jsou routeru vlastnosti jako "hlavicka" nebo "pohled" - přeci sám nic nezobrazuje.

 
Odpovědět
22.3.2014 8:58
Avatar
Odpovídá na Tori
Neaktivní uživatel:22.3.2014 9:02

No, on by totiž router neměl být potomkem kontroleru. Měla by to být samostatná třída, která spouští kontroler.

Odpovědět
22.3.2014 9:02
Neaktivní uživatelský účet
Avatar
Neaktivní uživatel:22.3.2014 9:10

Aha, omlouvám se autorovi, v článku to zmínil.

Odpovědět
22.3.2014 9:10
Neaktivní uživatelský účet
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Tori
David Čápka:22.3.2014 9:14

Router sbírá požadavky a volá další kontrolery aplikace, úplně to samé dělá controller. Proto se z něj router běžně dědí.

Odpovědět
22.3.2014 9:14
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Tori
Člen
Avatar
Odpovídá na David Čápka
Tori:22.3.2014 9:21

Ok, díky. Nevěděla jsem, že se to běžně dělává a připadalo mi, že router kromě přesměrování nepotřebuje žádnou jinou funkčnost kontroleru.

 
Odpovědět
22.3.2014 9:21
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Tori
David Čápka:22.3.2014 9:23

V tomto projektu RouterController slouží i jako hlavní kontroler a vypisuje pohled layout.

Odpovědět
22.3.2014 9:23
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Odpovídá na David Čápka
Neaktivní uživatel:8.4.2014 15:44

Ahoj, zapl jsem mode rewrite. Nechápu přesně výrok ,,musíš mít web v rootu".

Mam nainstalovaný LAMP na Lubuntu, web daný v '/var/www/', nejde mi mi v prohlížeči. Web v rootu jako '/root/' nebo v '/' ?

Děkuji za brzkou odpověd.:)

Odpovědět
8.4.2014 15:44
Neaktivní uživatelský účet
Avatar
jadana
Člen
Avatar
Odpovídá na Neaktivní uživatel
jadana:5.5.2014 15:43

"Nechápu přesně výrok ,,musíš mít web v rootu".

to je trochu nepochopení toho, že na *NIX je i "/" a "/root"

pro Apache je root to, kam ukazují proměnné "DocumentRoot" a "<Directory>"
see "man httpd" etc...

 
Odpovědět
5.5.2014 15:43
Avatar
Odpovídá na jadana
Libor Šimo (libcosenior):11.5.2014 19:56

Tak mi to konečne na ubuntu a netbeans funguje. ;)
Použil som tento postup, príkazy v konzole:

  • sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/mysite
  • gksudo gedit /etc/apache2/sites-available/mysite

v časti:

<Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All (tu bolo pôvodne: AllowOverride None
        Order allow,deny
        allow from all
</Directory>

zmeniť AllowOverride z None na All

  • sudo a2dissite default && sudo a2ensite mysite
  • /etc/init.d/apache2 reload
  • sudo a2enmod rewrite
  • service apache2 restart
  • sudo a2enmod userdir
  • /etc/init.d/apache2 restart
  • cd /var
  • chmod 777 www

V netbeans vytvoriť nový projekt s koreňovým adresárom: /var/www
a všetko funguje presne podľa lekcie.

Odpovědět
11.5.2014 19:56
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Jakub "Jacob" Sycha:19.5.2014 19:14

Moc pěkný tutoriál, ale čeština v názvu proměnných a fcí je pěkný svinstvo... jako pomlckyDoVelblou­diNotace", to je vtip že?


A btw, když to máte v podsložce, tak vám ten router nepojede, tady je fix... https://gist.github.com/…12d330a50cd3

 
Odpovědět
19.5.2014 19:14
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Jakub "Jacob" Sycha
Petr Nymsa:19.5.2014 19:34

Autor a prakticky všichni píší v AJ :) pro místní tutoriály se zvolila čeština, aby to bylo pro začátečníka jasnější. Každý kdo se bude dál tomu věnovat sám od sebe přejde na angličtinu. Ale souhlasím že ten název funkce by mohl být kratší

Odpovědět
19.5.2014 19:34
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
svanda777
Redaktor
Avatar
svanda777:31.7.2014 22:04

Jak upravit směrovač pro vícejazyčný web?

 
Odpovědět
31.7.2014 22:04
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Mazwor
Člen
Avatar
Mazwor:21.8.2014 19:32

Ahoj, opět bych měl jeden drobný dotaz :). Z jakého důvodu se příkaz $_SERVER['REQU­EST_URI'] dává do pole, když je z tohoto pole následně vybírán opět jeho první index? Vždyť tento příkaz sám o sobě vytáhne URL adresu jako textový řetězec, s kterým lze pracovat přímo, nemám pravdu?
Pro ujasnění mám na mysli to, proč nepoužít pouze:

$smerovac->zpracuj($_SERVER['REQUEST_URI']);
$naparsovanaURL = $this->parsujURL($parametry);

namísto původního:

$smerovac->zpracuj(array($_SERVER['REQUEST_URI']));
$naparsovanaURL = $this->parsujURL($parametry[0]);

Díky moc za ujasnění, možná mi něco uniká nebo toho bude využíváno v dalších dílech, jen mi to momentálně moc nejde do hlavy a přijde mi to docela zbytečné, když i bez této práce s polem celý program funguje stejně dobře ;).

Odpovědět
21.8.2014 19:32
Pořádek je pro blbce, inteligent ovládá chaos. :D
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Mazwor
David Čápka:21.8.2014 20:16

Protože směrovač dědí z kontroleru a jeho metoda zpracuj bere pole parametrů, tak aby to bylo stejné :)

Odpovědět
21.8.2014 20:16
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Matěj Kripner:16.10.2014 17:11

Ahoj, mám problém se směrovačem. Web již mám hotový a na produkci. Pokud se ale kdykoli pokusím o přesměrování, vypíše se známá hláška header already send... on SmerovacKontroler line 1. Moc nechápu, jak může směrovač odesílat header na řádku 1, když tam je jen <?php. Kód je stejný jako tady v seriálu a navíc na localu mi to fungovalo. Pokud někdo pomůže, budu rád. Hosting mám u Onebit.cz

Odpovědět
16.10.2014 17:11
Give me a deep enough pipeline, and I shall move the world.
Avatar
Honza Bittner
Šupák
Avatar
Honza Bittner:26.12.2014 17:12

Proč ve funkci parsujURL() pracujeme s proměnnou $naparsovanaURL stále jako s polem, když by šlo udělat zjednodušení jako níže? :)

$naparsovanaURL = parse_url($url)["path"];
Odpovědět
26.12.2014 17:12
Student FIT ČVUT. In love with Dart &...
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Honza Bittner
David Čápka:26.12.2014 17:23

Protože tohle jde až od PHP 5.4, jinak ti to napíše syntax error.

Odpovědět
26.12.2014 17:23
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Honza Bittner
Šupák
Avatar
Odpovídá na David Čápka
Honza Bittner:26.12.2014 17:25

Tak to všechno vysvětluje... :)

Odpovědět
26.12.2014 17:25
Student FIT ČVUT. In love with Dart &...
Avatar
Martin Píštěk (Denir):23.2.2015 12:24

Tutoriál opět super, jen mám pocit, že by bylo dobré na úvod při vývoji takovéto trochu složitější aplikace nejdříve udělat jednoduchý návrh (ideál top-down), třeba pomocí UML diagramu, kde by se specifikovaly jednotlivé metody a rozhraní a až potom by se to rozebíralo dále do hloubky. Byla by to i dobrá pomůcka pro člověka, který se podle tutoriálu učí a mohl by si návrh třeba vytisknout a sledovat, kde vlastně v programu právě je, nehledě na to, že v praxi by nikdo nezačal psát jen tak od boku aniž by si výše uvedené nejdříve ujasnil :-)

 
Odpovědět
23.2.2015 12:24
Avatar
Tomáš Haubert:6.5.2015 12:05

Ahoj, potřebuji si spustit ještě adminer pro správu databáze, lze udělat nějakou vyjímku v .htaccess nebo směrovači aby mi localhost/adminer nebral smerovac? Nebo jak řešit jinak? Díky

Odpovědět
6.5.2015 12:05
Jsem malopodnikatel, buším do kompu jak datel
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Tomáš Haubert
David Čápka:6.5.2015 17:43

Ahoj, pokud cesta existuje, tak ji smerovac nezachyti. Proste zadej cestu k php souboru s adminerem. Kdyz ho mas ve slozce adminer, musi se samozrejme jmenovat index.php nebo si to nastav v htaccess jako rewrite. Nejjednodussi mi prijde zadat jen celou url.

Odpovědět
6.5.2015 17:43
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
MArtin
Člen
Avatar
MArtin:19.10.2015 16:04

Takze este raz pre pouzivatelov WAMP, UWAMP, XAMPP a podobnych, co maju v document roote este aj ine projekty a teda maju zdrojaky tohoto tutorialu v podadresari:

upravit v subore SmerovacKontro­ler.php metodu parsujURL tak, ze pred return $rozdelenaCesta; treba napisat:

if ($_SERVER['SERVER_NAME'] == 'localhost')
        array_shift($rozdelenaCesta);
Editováno 19.10.2015 16:05
 
Odpovědět
19.10.2015 16:04
Avatar
Marián
Člen
Avatar
Odpovídá na MArtin
Marián:17.11.2015 18:50

Používam wamp server a vôbec ta podmienka nie je potrebná. všetko funguje ako má aj bez nej.

 
Odpovědět
17.11.2015 18:50
Avatar
MArtin
Člen
Avatar
Odpovídá na Marián
MArtin:18.11.2015 10:09

Ta podmienka je len kvoli tomu, ak by si to chcel davat aj na hosting a nechcel by si mat dva rozne konfiguracie ;)

 
Odpovědět
18.11.2015 10:09
Avatar
Bebbana
Člen
Avatar
Bebbana:24.11.2015 17:12

Ahoj, co s timhle, viz obrazek. Vse mam presne podle navodu, projekt je v htdocs v xampp. Kdyz zadam localhost/index.php tak to funguje tak, ze to vypise:

Index.phpKontroler
Array ( )

Prosim poradte.

 
Odpovědět
24.11.2015 17:12
Avatar
Bebbana
Člen
Avatar
Bebbana:24.11.2015 19:00

Tak jsem na to přišla, blbě uložený .htdocs, já blbec jsem to měla s příponou .txt a ne bez přípony, takže to apache vubec neviděl. Jen pozor na to pro všechny začátečníky.
Pokud jste to nikdy předtím nevytvářeli tak jako já, tady je návod: http://www.coniseal.com/…amkovy-blok/

 
Odpovědět
24.11.2015 19:00
Avatar
Bita Radek
Člen
Avatar
Bita Radek:22.11.2016 22:05

Vynikající celý seriál ! Moc díky.

 
Odpovědět
22.11.2016 22:05
Avatar
Tomáš Honka:24.12.2016 17:21

Udělal jsem si web, který používá tenhle Směrovač s hezkýma URL. Potřeboval bych ale, aby web fungoval, když hezké URL nefungují a Směrovač tedy dokázal pracovat i s "ošklivými". Nevíte někdo jak na to? Díky moc

 
Odpovědět
24.12.2016 17:21
Avatar
arnost99
Člen
Avatar
Odpovídá na Tomáš Honka
arnost99:22.1.2017 10:18

Odkazy zobecníš a naparsuješ přesně, jak je tady v tomto směrovači(samoz­řejmě na základě nějaké obecné definice toho "nehezkýho" URL), akorát musíš dle odlišností "vypodmínkovat"(po­kud chceš použít víc typů URL), aspoň tak bych to řešil já...

 
Odpovědět
22.1.2017 10:18
Avatar
arnost99
Člen
Avatar
arnost99:22.1.2017 10:22

Můžu poprosit o radu, jak tady z tohoto redakčního systému a (obecně z MVC) nalinkuju metodu třídy (př: z SpravceClanku.php, mam metodu public function ulozClanek($id,$cla­nek){}..) na AJAX tak, abych mohl uložit bez znovunačtení stránky do databáze? Dík

Editováno 22.1.2017 10:24
 
Odpovědět
22.1.2017 10:22
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na arnost99
David Čápka:22.1.2017 10:51

Na kurz navazuje kurz E-shop, kde jsou všechny tyto pokročilé postupy vysvětlené.

Odpovědět
22.1.2017 10:51
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
arnost99
Člen
Avatar
Odpovídá na David Čápka
arnost99:22.1.2017 11:42

Díky, ten si klidně taky projdu, ale v této chvíli bych raději ocenil konkrétní radu a ne odkaz na zdroj :-) .Díky

 
Odpovědět
22.1.2017 11:42
Avatar
DREAMDEV
Člen
Avatar
DREAMDEV:13.3.2017 13:39

zdravim trochu som vylepsil tento MVC system ale mam tam jednu taku zahadu. Spravil som si funkciu na zasielanie emailov ak nahodov nastane na webe nejaka chyba. Obcas mi pride mail ktory hlasi ze v routri vo funkcii parseURL je chyba:

Error message: Undefined index: path
Error location: Router.php Ln: 43

coz mi pride ako keby $_SERVER['REQU­EST_URI'] nebolo nastavene moze sa stat ze by to nejako spustali roboti a preto REQUEST_URI nie je nastavene? alebo ako sa moze stat ze REQUEST_URI nie je nastavene?

 
Odpovědět
13.3.2017 13:39
Avatar
Daniel Horák:2.6.2017 5:56

Parádní tutoriál, díky!

 
Odpovědět
2.6.2017 5:56
Avatar
Jan Bartík
Člen
Avatar
Jan Bartík:12.8.2017 10:33

Mazec seriál na pochopení OOP v praxi . Aspoň teda doufám že tomu začínám rozumět :) . Vše funguje, tk doufám že to tak pujde i dál ...

 
Odpovědět
12.8.2017 10:33
Avatar
Radovan Škvor:24.10.2017 12:40

Ahoj, chci se zeptat z jakého důvodu je u metody zpracuj parametr pole?

 
Odpovědět
24.10.2017 12:40
Avatar
Lukáš Hornych
Redaktor
Avatar
Odpovídá na Radovan Škvor
Lukáš Hornych:24.10.2017 13:56

Když v URL adrese budeš mít víc parametrů, tak se ti všechny naskládají do toho pole a ty pak s tím můžeš pracovat dál:

adresa.cz/parameter1/parameter2/parameter3/...
$parametry[0] = "parameter1";
$parametry[1] = "parameter2";
$parametry[2] = "parameter3";
...
 
Odpovědět
24.10.2017 13:56
Avatar
Odpovídá na Lukáš Hornych
Radovan Škvor:24.10.2017 14:44

To přeci není pravda, pole v parametru metody zpracuj neobsahuje nic jiného než URL adresu.

$smerovac = new SmerovacKontroler();
$smerovac->zpracuj(array($_SERVER['REQUEST_URI']));

je to takhle

$parametry[0] = "adresa.cz/parameter1/parameter2/parameter3/...";

teprve až metoda parsujURL rozdělí URL adresu na nazev kontroleru a parametry.

Pokud bych to udělala takto

$smerovac = new SmerovacKontroler();
$smerovac->zpracuj($_SERVER['REQUEST_URI']);

tak by v routeru stačilo toto a nemusel bych předávat URL adresu zbytečně přes pole

public function zpracuj($url)
{
        $naparsovanaURL = $this->parsujURL($url);

napadlo mě ještě že se budou předávat ještě nějaké další parametry které neobsahuje URL adresa ale to jsem si v článcích zadarmo nevšiml.

 
Odpovědět
24.10.2017 14:44
Avatar
Lukáš Hornych
Redaktor
Avatar
Odpovídá na Radovan Škvor
Lukáš Hornych:24.10.2017 14:56

To bys sice mohl posílat jako string, ale musel bys to v každém dalším kontroleru zbytečně pořád dokola parsovat. Nemyslíš, že je proto lepší to předat jako pole jen tomu prvnímu, který si to naparsuje a pošle to ostatním kontrolerům jako pole parametrů a ty pak s těmi parametry můžeš pohodlně pracovat jako s polem? ;-)

 
Odpovědět
24.10.2017 14:56
Avatar
Odpovídá na Lukáš Hornych
Radovan Škvor:24.10.2017 15:19

Teď tě vůbec nechápu.
Pokud budu metodě zpracuj předávat adresu stringem v poli nebo pouze stringem není v tom přeci rozdíl, aplikace bude fungovat pořád stejně.

 
Odpovědět
24.10.2017 15:19
Avatar
Lukáš Hornych
Redaktor
Avatar
Odpovídá na Radovan Škvor
Lukáš Hornych:24.10.2017 15:33

No tak přece když budeš předávat adresu stringem, tak v každém novém kontroleru si ji budeš muset rozkouskovat na jednotlivé parametry. Kdežto takhle ti to udělá ten první router a potom se o to už nemusíš starat.

 
Odpovědět
24.10.2017 15:33
Avatar
Odpovídá na Lukáš Hornych
Radovan Škvor:24.10.2017 15:39

No dojedu tutoriál do konce a pak mě to snad bude jasný asi tomu ještě pořád tomu MVC, děkuju za tvůj čas :-)

 
Odpovědět
24.10.2017 15:39
Avatar
Odpovídá na Lukáš Hornych
Radovan Škvor:25.10.2017 7:51

V další kapitole jsem to pochopil ;-)

 
Odpovědět
25.10.2017 7:51
Avatar
box.me
Člen
Avatar
box.me:17.2.2018 9:22

Narazil jsem na problém při testování na localu. Nefungoval mi rewrite. Většina zde asi má zkušenosti s konfigurací apache na to aby fungoval .htaccess. Pro ty kdo by ho museli konfigurovat od začátku:

v souboru httpd.conf:
možnost AllowOverride All (pokud je none - .htaccess nemá vliv)
odkomentovat řádek - LoadModule rewrite_module modules/mod_rew­rite.so

 
Odpovědět
17.2.2018 9:22
Avatar
radian1
Redaktor
Avatar
radian1:12.3.2018 20:43

ahoj, když napíšu tuhle url adresu

http://www.domena.cz/clanek/nazev-clanku

jak ji skript může získat? A dá se nějak záskat i hash (např. #obrazek12)?
Koukam jsem se do proměnné $_SERVER a tam to nikde neni, a neni tam ani úplně celá adresa, jenom REQUEST_SCHEME, REQUEST_URI, a další z kterých bych to mohl poskládat....

 
Odpovědět
12.3.2018 20:43
Avatar
Odpovídá na radian1
Michal Šmahel:13.3.2018 12:14

Ahoj, pokud chceš celý tvar URL, musíš si ho poskládat z částí superglobálního pole $_SERVER.

Co se týče kotvy (#) a údajů za ní, ty náleží pouze klientské části (pro nasměrování na určitý bod a pro Javascript). Zatím jsem neviděl žádné rozumné řešení, jedině snad použít k odeslaní Javascriptu.

Pokud se tu najde někdo, kdo toho využívá a našel nějaké dobré řešení, budu rád, když mě doplní.

Odpovědět
13.3.2018 12:14
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
radian1
Redaktor
Avatar
Odpovídá na Michal Šmahel
radian1:13.3.2018 19:54

hm, takže nejdříve musím složit url a potom ji zas rozbít pres parse_url? OK

 
Odpovědět
13.3.2018 19:54
Avatar
Odpovídá na radian1
Michal Šmahel:13.3.2018 20:26

Jde o to, co potřebuješ. Pokud řešíš zpracování URL parametrů nějakým parserem v MVC, stačí ti hodnota na klíčí REQUEST_URI.

...

$params = $_SERVER['REQUEST_URI'];

...
Odpovědět
13.3.2018 20:26
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Lukáš Hypša:20.8.2018 17:16

V sekci "parsování URL":
Pokud jsme funkcí "ltrim" v levo kromě lomítka odstranili i vše ostatní, co by (vlevo) odstranila funkce "trim", není výhodnější následně použít "rtrim" - tedy trimovat pouze na pravé straně?

Odpovědět
20.8.2018 17:16
Jsem lama co se roky snaží naučit napsat aspoň pár řádků a furt mu to nejde...
Avatar
Marty
Člen
Avatar
Marty:20.10.2018 21:43

Proč

echo(ltrim("Hello World", "Hdle"));

vrací

o World

? Nemělo by to spíš vracet

o Wor

?

 
Odpovědět
20.10.2018 21:43
Avatar
Marty
Člen
Avatar
Odpovídá na Marty
Marty:20.10.2018 21:49

Jasně, teď mi to došlo, ono se to odstraňuje jen z levé strany dokud je co odstraňovat a pak už to nechá zbytek být.

 
Odpovědět
20.10.2018 21:49
Avatar
Alma Mater
Člen
Avatar
Alma Mater:27.1.2019 20:36

$naparsovanaURL = $this->parsujURL($pa­rametry[0]);

$parametry[0]; index 0 by mal byť s hodnotou $parametry[0]= clanok

Odpovědět
27.1.2019 20:36
Kopírovanie je jednoduchá forma zdieľania informácii, aby sa šírili tam kde chýbajú..Autorské právo je demonštrácia m...
Avatar
Alma Mater
Člen
Avatar
Alma Mater:27.1.2019 20:49
$naparsovanaURL = $this->parsujURL($parametry[0]);

$parametry[0]; pole s indexom 0 by mal byť s hodnotou $parametry[0]= clanek;

Prečo vypisuje pri print_r ($this->parsujURL($pa­rametry[0])); cele pole a nie iba hodnotu poľa??

ako vypíšem hodnotu napr.poľa indexu 1?? keď toto mi vykazuje chybu
echo ($this->parsujURL($pa­rametry[1]));

Odpovědět
27.1.2019 20:49
Kopírovanie je jednoduchá forma zdieľania informácii, aby sa šírili tam kde chýbajú..Autorské právo je demonštrácia m...
Avatar
Odpovídá na Alma Mater
Michal Šmahel:28.1.2019 17:03

Ahoj, nech si vypsat proměnnou $parametry funkcí var_dump(). Je to testovací funkce, která ti detailně zobrazí strukturu pole v ní uloženého.

Pokud tě výsledek nějak překvapí, projdi si celou cestu změn této proměnné. Když bys narazil na něco, čemu nerozumíš, ještě napiš.

Odpovědět
28.1.2019 17:03
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Alma Mater
Člen
Avatar
Odpovídá na Michal Šmahel
Alma Mater:30.1.2019 1:18
       <?php

      $url = "http://www.mydomain.com/clanek/nazev-clanku/dalsi-parametr";

$naparsovanaURL = parse_url($url);
$naparsovanaURL["path"] = ltrim($naparsovanaURL["path"], "/");
$naparsovanaURL["path"] = trim($naparsovanaURL["path"]);
$rozdelenaCesta = explode("/", $naparsovanaURL["path"]);

echo('<br />');
print_r ($rozdelenaCesta); // vypíše pole: Array ( [0] => clanek [1] => nazev-clanku [2] => dalsi-parametr )


$tridaKontroleru = (array_shift($rozdelenaCesta)) . 'Kontroler';

echo('<br />');
echo($tridaKontroleru); //vypíše: clanekKontroler

echo('<br />');
echo('<br />');
print_r ($rozdelenaCesta);//vypíše:Array ( [0] => nazev-clanku [1] => dalsi-parametr )

echo('<br />');
echo ($rozdelenaCesta[1]); //vypíše: dalsi-parametr

?>

všetko čo chcem z lekce 3 aby mi vypísalo hodnotu poľa: dalsi-parametr,vieš mi to napísať?

Odpovědět
30.1.2019 1:18
Kopírovanie je jednoduchá forma zdieľania informácii, aby sa šírili tam kde chýbajú..Autorské právo je demonštrácia m...
Avatar
Alma Mater
Člen
Avatar
Odpovídá na Alma Mater
Alma Mater:30.1.2019 3:21
// pôvodná časť súboru:index.php
$smerovac = new SmerovacKontroler();
$smerovac->zpracuj(array($_SERVER['REQUEST_URI'])); // hodnota v poli s indexom 0

//upravená časť súboru:index.php
$smerovac = new SmerovacKontroler();
$smerovac->zpracuj($_SERVER['REQUEST_URI']); // hodnota v reťazci


// pôvodná časť súboru:SmerovacKontroler.php

public function zpracuj($parametry)
    {

                $naparsovanaURL = $this->parsujURL($parametry[0]);


             echo('<br />');
                print_r($parametry);    //vypíše: Array ( [0] => /clanek/nazev-clanku/dalsi-parametr )

// kontroler je 1. parametr URLArray ( [0] => /clanek/nazev-clanku/dalsi-parametr

$tridaKontroleru = $this->pomlckyDoVelbloudiNotace(array_shift($naparsovanaURL)) . 'Kontroler';
                 echo('<br />');
                echo($tridaKontroleru); //vypíše: ClanekKontroler

                echo('<br />');
                print_r($naparsovanaURL);//vypíše: Array ( [0] => nazev-clanku [1] => dalsi-parametr )
    }

// upravená časť súboru:SmerovacKontroler.php

 public function zpracuj($parametry)
    {
                $naparsovanaURL = $this->parsujURL($parametry); //odkazuje na reťazec nie na pole.

                echo('<br />');
                print_r($parametry); //vypisuje: /clanek/nazev-clanku/dalsi-parametr

                $tridaKontroleru = $this->pomlckyDoVelbloudiNotace(array_shift($naparsovanaURL)) . 'Kontroler';
                 echo('<br />');
                echo($tridaKontroleru); // vypisuje: ClanekKontroler

                echo('<br />');
                print_r($naparsovanaURL); // vypisuje: Array ( [0] => nazev-clanku [1] => dalsi-parametr )

}

Až teraz som si všimol že, pôvodné súbory predávaju url do poľa Array ( [0] => /clanek/nazev-clanku/dalsi-parametr

ďalší index už neexistuje. Prečo autor neodkazoval url do reťazca ako mam uvedené upravenom kóde ale dával to do poľa:-). Prečo to treba dať do poľa?

Odpovědět
30.1.2019 3:21
Kopírovanie je jednoduchá forma zdieľania informácii, aby sa šírili tam kde chýbajú..Autorské právo je demonštrácia m...
Avatar
Odpovídá na Alma Mater
Michal Šmahel:30.1.2019 17:21

Aha, takhle. Být tebou bych to nechal podle Davida. Svou úpravou porušuješ dědičnost.

Články zatím nejsou převedeny pod verzi PHP 7+, tedy nevyužívají striktní typování. Metoda zpracuj() je zděděna ze třídy Kontroler, kde je deklarována. Aktualizovaná deklarace by vypadala nějak takto:

// Kontroler

public abstract function zpracuj(array $parametry): void;

// ...

Jak je vidět, parametry se ve všech implementacích této abstraktní metody budou předávat jako pole. Je to zejména kvůli tomu, že později (i v tomto seriálu) bude potřeba předávat několik parametrů dalším kontrolerům (těm, které budou volané pro další zpracování a nastavení dat pro obsah). Tebou zmiňovaná implementace tedy nesmí být výjimkou.

Odpovědět
30.1.2019 17:21
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Petr
Člen
Avatar
Petr:4.6.2019 7:38

Na localhost se mi vypíše:
Kontroler
Array ( )
Má být:ClanekKontroler
Array ( [0] => nazev-clanku [1] => dalsi-parametr )

nebo:
http://localhost/…lsi-parametr se vypíše:
The requested URL /clanek/nazev-clanku/dalsi-parametr was not found on this server.

Je to ze vzorového ITnetworkMVC02
Netuším, kde je chyba. /clanek/ neexistuje. Jinak apache2 a localhost funguje korektně. (phpinfo())

 
Odpovědět
4.6.2019 7:38
Avatar
Jan Lupčík
Šéfredaktor
Avatar
Odpovídá na Petr
Jan Lupčík:9.6.2019 16:14

Ahoj, máš vytvořený soubor .htaccess s obsahem z minulé lekce?

Odpovědět
9.6.2019 16:14
TruckersMP vývojář
Avatar
Petr
Člen
Avatar
Petr:11.6.2019 10:42

Nefunguje mi "RewriteEngine", ani na primitivní akci. Samozřejmě na vzorové také ne.

_htaccess
Options -Indexes
RewriteEngine On
RewriteRule index\.html indexy.html

Mám Linux Mint 19 Cinnamon, apache2 php 7.2. Používám Localhost.

Virtual host mi v home funguje normálně, včetně databáze. Modul rewrite.so je v /usr/lib/apache2/. Asi mod Rewrite na Localhostu nesmí fungovat. Nevím.

 
Odpovědět
11.6.2019 10:42
Avatar
Petr
Člen
Avatar
Petr:12.6.2019 19:33

sudo a2enmod rewrite, to byl ten správný příkaz roota, aby apache povolilo mod RewriteEngine. Potom v htaccess příkaz "RewriteEngine On" dostal smysl.
Dále v sites-enable ve virtual.conf bylo třeba změnit příkazy na:
Options Indexes FollowSymLinks MultiViews
AllowOverride All ... nikoliv none

Restart apache2 a bylo vše funkční.
Takže problém byl jenom v konfiguraci apache, který jsem netušil, jak ho vyřešit.
Google pomohl.

 
Odpovědět
12.6.2019 19:33
Avatar
Matěj Přerovský:17. února 12:41

Ahoj,
už druhý den řeším jeden problém.

<?php
// Nastavení interního kódování pro funkce pro práci s řetězci
mb_internal_encoding("UTF-8");
// Callback pro automatické načítání tříd controllerů a modelů
function autoloadFunkce($trida)
{
        // Končí název třídy řetězcem "Kontroler"
    if (preg_match('/Kontroler$/', $trida))
        require("kontrolery/" . $trida . ".php");
    else
        require("modely/" . $trida . ".php");
}

spl_autoload_register("autoloadFunkce");

// Vytvoření routeru a zpracování parametrů od uživatele z URL
$smerovac = new SmerovacKontroler();
$smerovac->zpracuj(array($_SERVER['REQUEST_URI']));

echo("Pokus");

Když zakomentuju

$smerovac = new SmerovacKontroler();
$smerovac->zpracuj(array($_SERVER['REQUEST_URI']));

, tak to správně vypíše Pokus.

Jinak tam je jen bílá plocha.

Mám PHP 7.3.12 a je to na Endoře.

Veškerý kód jsem si nakonec zkopíroval, ale stejně to nefunguje.

Pomůžete mi prosím?

Editováno 17. února 12:42
Odpovědět
17. února 12:41
42
Avatar
Milan Turyna
Redaktor
Avatar
Odpovídá na Matěj Přerovský
Milan Turyna:17. února 14:01

Nevím jak je to s tímhle návodem, nečetl jsem ho, ale možná když půjdeš na další lekci tam se podíváš jak to propojit a napíšeš pokus do pohledu tak by to mohlo jít.

 
Odpovědět
17. února 14:01
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 102 zpráv z 102.