AMR - spezielle Anpassung zum url-beautifying

Gesperrt
nonano
Beiträge: 43
Registriert: Do 13. Apr 2006, 17:45
Kontaktdaten:

AMR - spezielle Anpassung zum url-beautifying

Beitrag von nonano » Mo 10. Mai 2010, 07:14

Hi,

Ich nutze Contenido 4.8.12 mit AMR und habe das auch schon wunderbar zum Laufen bekommen. ein paar Zeilen aus der htaccess, die ich für relevant halte:

Code: Alles auswählen


RewriteEngine on

RewriteBase /cms

# Bulgarian Users
RewriteCond %{HTTP:Accept-Language} ^bg [NC]
RewriteRule ^$ /bg/ [L,R=301]
# German Users
RewriteCond %{HTTP:Accept-Language} ^de [NC]
RewriteRule ^$ /de/ [L,R=301]
# French Users
RewriteCond %{HTTP:Accept-Language} ^fr [NC]
RewriteRule ^$ /fr/ [L,R=301]
# Default Page
RewriteRule ^$ /en/ [L,R=301]



# Exclude some files and directories from rewriting
# -------------------------------------------------
RewriteRule ^usage/.*$ - [L]
RewriteRule ^contenido/.*$ - [L]
RewriteRule ^setup/.*$ - [L]
RewriteRule ^cms/upload/.*$ - [L]
RewriteRule ^cms/test/.*$ - [L]
RewriteRule ^cms/front_content.php.*$ - [L]
# enable following line if you want to run the plugin test
# RewriteRule ^cms/mr_test.php.*$ - [L]



# One RewriteRule to rule them all
# --------------------------------
RewriteRule !\.(js|ico|gif|jpg|jpeg|png|css|pdf|txt|xml)$ front_content.php [NC,QSA,L]
Die URL-Struktur ist also so, dass immer (\/[a-z]{2}\/) als Sprachkürzel nach der tld kommt.

Konfiguation AMR:

Code: Alles auswählen

Kategorie-Separator (Trenner zwischen einzelnen Kategorien)                             /
Kategoriewort-Separator (Trenner zwischen einzelnen Kategoriewörtern)                   -
Kategorie-Artikel-Separator (Trenner zwischen Kategorieabschnitt und Artikelname)       /
Artikelwort-Separator (Trenner zwischen einzelnen Artikelwörtern)                       -
Wie gesagt, alles funzt wunderbar. Nur habe ich noch einen Wunsch an das URL-Design.
Folgendes ist der Status quo:

Agenommen es handelt sich um lorem-ipsum.com , gibt es im Hauptnavigationsordner ein Verzeichnis mit dem Namen lorem-ipsum:

Code: Alles auswählen

root
    Hauptnavigation
        lorem-ipsum
            ueber-lorem-ipsum
            lorem-ipsum-aktuell
            alle-mal-ipsum
        Blah-blubb
        foo-bar
somit ist also in der Adresse der Seiten innerhalb des ersten Ordners der Hauptkategorie der domainname wiederholt:
http://lorem-ipsum.com/de/lorem-ipsum/etc-pp/

wie kann ich dafür sorgen, dass aus
http://lorem-ipsum.com/de/lorem-ipsum/ueber-lorem-ipsum/
http://lorem-ipsum.com/de/ueber-lorem-ipsum/

wird? Natürlich dennoch so, dass die id der Kategorie mit übergeben wird? Muss ja irgendwie in der .htaccess geregelt werden können, nur wie ist die Frage :D

xmurrix
Beiträge: 3147
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: AMR - spezielle Anpassung zum url-beautifying

Beitrag von xmurrix » Mo 10. Mai 2010, 16:55

Hallo nonano,

am einfachsten wäre es, wenn die Kategoriestruktur mit der generierten Pfadstruktur der URL übereinstimmt. Soll der Navigationspunkt "lorem-ipsum" nicht in der URL erscheinen, nehme es doch aus dem Kategoriebaum raus, also folgendermaßen:

Code: Alles auswählen

root
    Hauptnavigation
        ueber-lorem-ipsum
        lorem-ipsum-aktuell
        alle-mal-ipsum
        Blah-blubb
        foo-bar
Das wäre wohl die einfachere Lösung. Das AMR-Plugin bildet beim Generieren der URL den Pfad aus der Kategoriestruktur und braucht diesen, um aus einer ankommenden URL wieder die Kategorieid zuzuordnen. Lässt du einen Teil der Kategorie weg, wird das mit der Erkennung schwierig.

Du kannst dennoch das Plugin so zurechtbiegen, dass es den Anforderungen gerecht wird, aber davon würde ich abraten, da dann in einem halben Jahr keiner genau weiß, warum die URLs so generiert werden.

Also, hier ein Lösungsvorschlag:
1.) erstellen eine /cms/config.php und schreibe folgendes rein:

Code: Alles auswählen

<?php
/**
 * Modifies generated url.
 *
 * @param  string  $url  URL generated by UrlBuilder
 * @param  string  Modified URL, if URL contains '/lorem-ipsum/', otherwhise the untouched incomming URL
 */
function myFrontendPostprocessUrlBuilding($url)
{
    if (strpos($url, '/lorem-ipsum/')) {
        $url = str_replace('/lorem-ipsum/', '/', $url);
    }
    return $url;
}

// Get CEC registry and register a chain function
$_cecRegistry = cApiCECRegistry::getInstance();
$_cecRegistry->addChainFunction('Contenido.Frontend.PostprocessUrlBuilding', 'myFrontendPostprocessUrlBuilding');
Hier werden aus den generierten URLs der Teilstring 'lorem-ipsum' entfernt.

2.) Passe in der Datei contenido/plugins/mod_rewrite/includes/front_content_controller.php vor Zeile 32 die Variable $_SERVER['REQUEST_URI'] an, damit die Kategorie richtig erkannt wird:

Code: Alles auswählen

$requestUri = $_SERVER['REQUEST_URI'];
if (strpos($requestUri, '/ueber-lorem-ipsum/')) {
    $requestUri = str_replace('/ueber-lorem-ipsum/', '/lorem-ipsum/ueber-lorem-ipsum/', $requestUri);
} elseif (strpos($requestUri, '/lorem-ipsum-aktuell/')) {
    $requestUri = str_replace('/lorem-ipsum-aktuell/', '/lorem-ipsum/lorem-ipsum-aktuell/', $requestUri);
} elseif (strpos($requestUri, '/alle-mal-ipsum/')) {
    $requestUri = str_replace('/alle-mal-ipsum/', '/lorem-ipsum/alle-mal-ipsum/', $requestUri);
}

// create an mod rewrite controller instance and execute processing
$oMRController = new ModRewriteController($requestUri);
Hier wird wieder, sofern in der ankommenden URL Unterkategorien von lorem-ipsum vorkommen, die Kategorie lorem-ipsum den Unterkategorien vorangestellt.

Die Beispiele sind nicht getestet, und der Code ist nicht 100% sauber - Die Änderungen sollen an richtigen Stellen passieren, es kann ja sein, dass eine Kategorie "lorem-ipsum" mehrfach im Katgorienbaum vorkommt, z. B. nochmal am Ende, usw...

Während der Code unter 1.) keine Sourcen von Contenido odes des Plugins ändert, ist der Code unter 2.) nur durch Anpassung einer Datei des AMR-Plugins möglich, hier musst du bei einem Update aufpassen...

Eine andere Alternative zu 2.) wären ein paar Regeln in der .htaccess, probier es mal mit folgenden aus:

Code: Alles auswählen

RewriteRule ^([a-z]{2})/ueber-lorem-ipsum/(.*)$ $1/lorem-ipsum/ueber-lorem-ipsum/$2 [QSA,L]
RewriteRule ^([a-z]{2})/lorem-ipsum-aktuell/(.*)$ $1/lorem-ipsum/lorem-ipsum-aktuell/$2 [QSA,L]
RewriteRule ^([a-z]{2})/alle-mal-ipsum/(.*)$ $1/lorem-ipsum/alle-mal-ipsum/$2 [QSA,L]
Auch das ist aus demBauch raus und nicht getestet...

Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

nonano
Beiträge: 43
Registriert: Do 13. Apr 2006, 17:45
Kontaktdaten:

Re: AMR - spezielle Anpassung zum url-beautifying

Beitrag von nonano » Mo 10. Mai 2010, 16:59

Hallo xmurrix,

Wahrscheinlich hast Du recht und es ist nicht ratsam das so zu machen ... Dennoch vielen Dank für die ausführliche Antwort !

Gesperrt