CW(1,0) - ARTICLE ROUTER - páteř celé aplikace; směrování obsahu databáze do příslušných šablon
Nejzásadnější funkcí celého webu je article router, tedy funkce, která:
1. čte požadavky na stránku z url prohlížeče,
2. na jejich základě vytahuje data článku z databáze,
3. vybírá vhodnou HTML šablonu stránky a posílá na ni data článku, čímž vytváří zdání html souboru s obsahem článku, na který přesměrovává nebo jej rovnou vykresluje.
<?php
function articleROUTER() {
Nejdříve nás čeká nejzásadnější úvaha celého webu, kolem které se bude točit každá jeho stránka. A sice, jak definovat tvar vašich URL, které budou ukazovat na jedinečný kus HTML obsahu v databázi (článek). A definovat způsob, jak PHP tento mustr v URL rozpozná a data správného článku pro něj vyloví.
Takže vzorec svých URL jsem určil takto:
http://mojedomena.cz/permalink/permalink2
Přičemž permalink je jedinečný identifikátor obsahu v databázi a permalink2 je pouze jednomístná číslovka pořadí v případě velmi dlouhých rozsekaných článků na číselnou posloupnost menších.
Velké CMS systémy a frameworky, jako např. Joomla a Yii2 dělí URL na sekce a kategorie, jako např.:
domena.cz/kategorie/podkategorie/clanek
Ale to mi připadá kontraproduktivní, takže jsem volil cestu pouhého názvu článku následujícího hned za doménou.
Přitom mi jde o search engine friendly (SEF) adresy URL, čehož lze krásně docílit v PHP právě pomocí article routeru v jediném výchozím skriptu architekturou Singleton. Váš web poté netrpí krkolomnými nicneříkajícími adresami let dvoutisících typu: domena.cz/clanky.php?id=04567&no=02
Tato zásadní úvaha je zcela na vás. Můžete řešit identifikaci unikátní položky v databázi pomocí části URL úplně, jak chcete a žádná cesta není nejsprávnější. Prostě aby to jen fungovalo.
global $pdo, $permalink, $permalink2;
Nejdříve ošetřuji URL, která je vlastně libovolným vstupem uživatele do adresy na mém webu a tedy musí být ošetřena od nepovolených znaků, které by mohly vykonat nebezpečný kód potenciálního hackera:
$urlpole = filter_input(INPUT_SERVER, $_SERVER['REQUEST_URI'], FILTER_SANITIZE_SPECIAL_CHARS);
A konečně routing: URL rozsekám pomocí lomítek na tři části, jež uložím do jediné proměnné typu pole.
$urlpole = explode("/", $_SERVER['REQUEST_URI'], 3);
Přičemž $urlpole[0] mě vůbec nezajímá a nic s ním dále neřeším. $urlpole[1] je kýžený permalink = identifikátor článku v databázi. Ten je definován vždy.
$permalink = $urlpole[1];
Tu a tam budu potřebovat permalink2, který bude definován jako číslovka pořadí u dlouhých dělených článků. Když je definován, beru jen číslo v něm obsažené (ošetření vstupu).
if (isset($urlpole[2])) {
$urlpole[2] = filter_var($urlpole[2], FILTER_SANITIZE_NUMBER_INT);
$permalink2 = $urlpole[2];
} else {
return;
}
Pokud je permalink prázdný nebo je slovem index, pak se jedná o frontpage webu (index) a tedy rovnou zobrazím šablonu indexu (vstupní stránku na holé doméně bez argumentů)
if ($permalink == "" or $permalink == "index") {
include 'v1INDEX.view.php';
return;
} else {
return;
}
return;
}
Dále už je definován výčet funkcí, které s permalinky pracují, jsou volány v MAIN vláknu a obstarávají vyzvednutí textu z databáze a jeho umístění do HTML šablon.
Funkce NajítČlánek vůbec zjišťuje, jestli vůbec nějaký článek s tímto permalinkem existuje.
function najitCLANEK() {
global $pdo, $permalink;
A zjišťuje to SQL dotazem počtu splňujících identifikátorů. Databázi musíte mít navrženu tak, aby každý samostatný kus textu, měl svůj permalink jedinečný v celé databázi. Můj odpovídající sloupec k permalinkům v databázi se jmenuje URLalias.
$dotaz = $pdo->prepare("SELECT COUNT(id) FROM CONTENT WHERE URLalias=:permalink");
$dotaz->bindValue(':permalink', $permalink);
$dotaz->execute();
$celkemnalezeno = $dotaz->fetchColumn();
Když je pole nalezenců v databázi nula, a přitom permalink není prázdná hodnota, pak stránka neexistuje a vracím kód protokolu HTTP jako odpověď serveru. A sice kód 410 znamenající Gone, tedy stránka trvale neexistuje. Pokud totiž dáte kód 302 (dočasně odstraněno), nadělá vám to časem pěknou neplechu v údajích v Google search console. O tom někdy v samostatném článku. Zde by šlo také přesměrovávat na stránku custom404, ale na to bacha, tam musíte vědět, co děláte. O tom právě v samostatném článku.
if ($celkemnalezeno == "0" and ! empty($permalink)) {
http_response_code(410);
}
return;
}
Vlastní (custom)404 musí vypadat velice výmluvně:
Dále bude následovat nasávání textů z databáze.
Zdroje
Stavové kódy protokolu HTTP:
https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/410