root-index Modifikation für Short-URLs

Fragen zur Implementierung und/oder Anpassung von ConPresso 4 werden in diesem Forum diskutiert.
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7457
Registriert: 01.01.1970 02:00
Hat sich bedankt: 117 Mal
Danksagung erhalten: 939 Mal

root-index Modifikation für Short-URLs

Beitrag von MarkusR »

Für ein privates Projekt habe ich die index.php im root etwas angepasst, die ja im Grunde nur auf die eingestellte Startseite weiterleitet.
Dieses Weiterleiten kann man bei Übergabe von Parametern aber auch für Short-URLs nutzen.

So leitet domain.tld/?350 auf den Artikel 350 weiter, also z.B.
domain.tld/_rubric/detail.php?nr=350&rubric=rubrikname
weiter, wenn eine Nummer übergeben wird.

Wird dagegen ein Text übergeben wie domain.tld/?Test, wird auf eine gleichnamige Rubrik
domain.tld/_rubric/inde.php?rubric=Test
umgeleitet.

Die entsprechenden Verzeichnisse bzw. Rubriken werden aus der Datenbank ausgelesen.

Dazu in der index.php im cpo-root VOR der Zeile

Code: Alles auswählen

header('Location: '.BASE_ABS.$cpoSystem['homepage']);
noch folgenden Block einfügen

Code: Alles auswählen

// redirect short urls
if (!empty($_SERVER['QUERY_STRING'])) {

    // target needed?
    $articleTarget = "";
    $rubricTarget  = "";

    // get all released articles
    $db = new DB;
    $urls = array();
    $articlestates = $cpoSystem['release'] 
        ? 'artikel_archiv<2 AND freigabe='.STATE_RELEASED.' ' 
        : 'artikel_archiv<1 AND freigabe!='.STATE_BLOCKED.' ';
    $addwhere = $articlestates
        ."AND pub_datum<='".date('Y-m-d H:i:s', time())."' "
        ."AND verfallsdatum>='".date('Y-m-d H:i:s', time())."' ";
    $query = 'SELECT nr, name, directory FROM '.CPO_NEWS.', '.CPO_RUBRIC.' where id=rubric_id AND ' . $addwhere;
    $db->query($query);
    while ($db->next_record()) 
        $urls[$db->v('nr')] = BASE_ABS.$db->v('directory')."/detail.php?nr=".$db->v('nr')."&rubric=".$db->v('name').$articleTarget; // released articles stored in $releasedArticles

    // get all rubrics
    $query = 'SELECT directory, name FROM '.CPO_RUBRIC.' ';
    $db->query($query);
    while ($db->next_record()) 
        $urls[$db->v('name')] = BASE_ABS.$db->v('directory')."/index.php?rubric=".$db->v('name').$rubricTarget; // existing rubrics stored in $rubricList

    // check for matching keys, otherwise redirect to homepage
    if (!array_key_exists($_SERVER['QUERY_STRING'], $urls)) {
       header('Location: '.BASE_ABS.$cpoSystem['homepage']);
       exit;
    }
    header('Location: '.$urls[$_SERVER['QUERY_STRING']]);
    exit;
}
Bei

Code: Alles auswählen

    // target needed?
    $articleTarget = "";
    $rubricTarget  = "";
kann auch ein Target wie #article definiert werden, wenn z.B. der Inhalt direkt angesteuert werden soll statt erst den Seitenkopf zu zeigen.

Hinweis: Zuerst werden alle freigegebenen Artikel und existierenden Rubriken eingelesen und damit der übergebene Query-String verglichen. So sind keine SQL-Injections möglich.
Ggf. wird dieses Auslesen in neue CPO+ Versionen einfließen, so dass hier nur noch der Vergleich durchgeführt werden muss. Artikel- und Rubriklisten werden ja immer mal wieder gebraucht.
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle