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

DC home |
Portál vojenských technologií |
Ostatní články |
Organizační

První kontakt bude tak nezvyklý, tak nečekaný, že nás něco takového ani vzdáleně nenapadne.
Nick Pope