Advanced Mod Rewriting Contenido 4.4.4

stese
Beiträge: 1040
Registriert: Fr 3. Dez 2004, 17:47
Wohnort: München
Kontaktdaten:

Advanced Mod Rewriting Contenido 4.4.4

Beitrag von stese » Do 6. Jan 2005, 20:27

Advanced Mod Rewrite:

ACHTUNG Warnung vorweg: Momentan nur für Benutzer gedacht die
FORTGESCHRITTENE PHP-Kentnisse haben!!!!


Statt einer URL á la front_content.php?idcat=34&lang=2&idart=64&client=1
will man suchmaschinenfreundliche Links.

Lösungsansatz 1:
mod_rewrite wie hier auch im Forum Lösungen beschrieben wurden:
/1/2/34/64.html oder 1_1_34_64.html

Problem:
Die Varianten gefielen mir nicht sonderbar, da keine
suchmaschinenfreundlichen Keywords in der immer wichtiger
werdenden URL vorhanden sind.

Ziel:
eine schöne URL nach dem Schema /sprache/kategorie/artikel.html

Erweitertes Ziel:
der Nutzer (normal Endanwender, der nix von HTML versteht) soll
mit der Erzeugung dieser URL nix zu tun haben müssen.

... und genau das habe ich umgesetzt.

Demonstration:
Frontend: http://contenido.polycoder.com
Backend: http://contenido.polycoder.com/contenido/index.php
User: demo
Passwort: test


Download des kompletten Bundles: Contenido 4.4.5
Letzte Änderung: 15.07.05
(Achtung es ist NICHT für die 4.5.x angepasst, diese Version findet ihr hier)
Bitte die Textdatei im Ordner SETUP_DOKU lesen!!!!

Vielen Dank an Ronaldo, der das Package auf
die aktuelle stable Version 4.4.5 angepasst hat:
contenido4.4.5_copy_art--mod-rewr_pl2.zip




Zur theoretoschen Arbeitsweise der Mod_Rewrite Funktionen:

Herzstück der ganzen Geschichte ist eine neue Klasse namens
ModRewrite in der Datei class.modrewrite.php im Ordner classes
und einigen neuen Funktionen in der datei functions.modrewrite.php
im includes Ordner. Die Klasse wird hauptsächlich im Backend genutzt,
die Funktionen nur bei der Rückgenerierung der websicheren Namen in
die entsprechenden ID Nummern.

Backend
Wenn eine neue Kategorie erstellt wird, wird automatisch der
Kategoriename als Websicherer Name erzeugt. Dazu wurde in der
Datenbank "cat_lang" ein neues Datenfeld erzeugt namens "websafename"
Beim Erstellen/Modifizieren des Kategorienamens wird wie schon
gesagt ein neuer websicherer Name erstellt, der nur die Zeichen
a-zA-Z0-9.-_~ enthalten darf. Dieser Name wird automatisch
mit allen bereits vorhandenen Kategorienamen innerhalb dieser
Kategorie abgeglichen um evtl. dubletten auszuschließen. Sollte
bereits eine Kategorie mit gleich lautendem Namen vorhanden sein,
so wird der neuen Kategorie am ende automatisch die ID Nummer
angehangen. (z.B. "Kategorie_23").

Bei jedem Modifizieren der Kategorie, sei es durch Umbenennen oder
Verschieben in andere Kategorien wird der websichere Name erneut
überprüft und ggf. geändert.

Das gleiche gilt für Artikel. In der Artikel Tabelle art_lang wurde
ebenfalls ein neues Datenfeld namens "websafename" angelegt. Beim
Artikel wird automatisch der "Titel" des Artikels (unter
Eigenschaften) in einen websicheren Namen umgewandelt und mit evtl.
vorhandenen Artikeln in der gleichen Kategorie abgeglichen.

Das war die Arbeitsweise im Backend. Ihr werdet die URLs im
Backend nie als Mod_Rewrite umgewandelt erleben, da dies nur bei
der Ausgabe des Frontends geschieht. Ihr habt also absichtlich
KEINE Möglichkeit den websicheren Namen individuell Abändern zu
können.

Frontend
Durch die .htaccess Datei werden der front_content.php neue
Variablen übergeben. Eine beispielhafte RewriteRule schaut
folgendermaßen aus:
RewriteRule ^(de|en|fr|sp|deutsch|english|englisch|franzoesisch|francais|spanisch|spain|espanol)/([^/]*)/([^/]*)/([^/]*)/(.*).html$ front_content.php?langname=$1&catnames[]=$2&catnames[]=$3&catnames[]=$4&artname=$5 [L]

Die neuen übergebenen Variablen lauten also (string) $langname,
(array) $catnames sowie (string) $artname.

Am Anfang der front_content werden diese 3 Variablen durch
entsprechende Funktionen ausgewertet, welche dann die korrekten
IDs $idcat, $idart und evtl. $lang zurückliefern.

Danach arbeitet die front_content ganz normal weiter, bis kurz vor
der Ausgabe der eigentlichen Seite. Statt der direkten Ausgabe des
Befehls eval("?>\n".$code."\n<?php\n"); wird der Ausgabe gebuffert
und einer Variable übergeben. Danach wird gecheckt ob Mod Rewrite
überhaupt aktiviert ist (wird mittels eines Schalters in der
config.php gesetzt). Wenn ModRewrite aktiv ist, so durchsucht eine
kleine funktion die gebufferte Ausgabe nach vorkommen von
href="front_content.php(.?)" und ersetzt diese dann in einer
kleinen Funktion zu den "schönen" Modrewrite URLs. Somit ist
gewährleistet, dass auch noch alle Module funktionieren und nicht
umgeschrieben werden müssen und bei einem evtl. Umzug und der
Tatsache, dass ein Server .htaccess nicht mehr unterstützt, die
Artikel mit Ihren Querverlinkungen zu anderen Artikeln nicht im
Nachhinein geändert werden müssen.


geänderte Dateien:

/cms/front_content.php
/contenido/includes/functions.con.php
/contenido/includes/functions.str.php
/contenido/includes/functions.modrewrite.php
/contenido/classes/class.modrewrite.php
/contenido/main.php

Ich hoffe ich hab da nix vergessen. Wenn Ihr das obige Zip File
geladen habt, könnt ihr mit dateiübergreifendem Suchen nach "stese"
alle modifizierten Stellen herausfinden.

Eine Manuelle Installationsanleitung findet Ihr unter:
http://contenido.polycoder.com/doku/man ... lation.txt

Ich bitte darum dass VERSIERTE Anwender das mal Testen und evtl.
Schwachstellen finden (die gibt es immer)
Zuletzt geändert von stese am So 14. Aug 2005, 12:36, insgesamt 8-mal geändert.

emergence
Beiträge: 10641
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Do 6. Jan 2005, 23:03

also auf den ersten blick liest sich das extrem gut...
besonders die lösung mit websafename ist wirklich ein großer sprung nach vorne...
das sollte an sich in den cvs head hinein (das mit dem websafename) ohne das ich mir jetzt den code angesehen habe...
*** make your own tools (wishlist :: thx)

timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo » Do 6. Jan 2005, 23:07

emergence hat geschrieben:also auf den ersten blick liest sich das extrem gut...
besonders die lösung mit websafename ist wirklich ein großer sprung nach vorne...
das sollte an sich in den cvs head hinein (das mit dem websafename) ohne das ich mir jetzt den code angesehen habe...
ähm das gibt es schon im CVS_HEAD...nennt sich url_name und ist auch über das Backend pflegbar ;)

emergence
Beiträge: 10641
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Do 6. Jan 2005, 23:10

timo hat geschrieben:ähm das gibt es schon im CVS_HEAD...nennt sich url_name und ist auch über das Backend pflegbar ;)
du meinst das mit dem alias oder ? ja stimmt , den pathresolver sollte ich mir mal ansehen ;-)
*** make your own tools (wishlist :: thx)

stese
Beiträge: 1040
Registriert: Fr 3. Dez 2004, 17:47
Wohnort: München
Kontaktdaten:

Beitrag von stese » Do 6. Jan 2005, 23:12

timo hat geschrieben:ähm das gibt es schon im CVS_HEAD...nennt sich url_name und ist auch über das Backend pflegbar ;)
äh wo bitte?

emergence
Beiträge: 10641
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Do 6. Jan 2005, 23:14

stese hat geschrieben:
timo hat geschrieben:ähm das gibt es schon im CVS_HEAD...nennt sich url_name und ist auch über das Backend pflegbar ;)
äh wo bitte?
in den snapshots zu finden:
-> http://www.contenido.de/snapshots/?C=M;O=D
-> http://www.contenido.de/snapshots/conte ... 06.tar.bz2
*** make your own tools (wishlist :: thx)

stese
Beiträge: 1040
Registriert: Fr 3. Dez 2004, 17:47
Wohnort: München
Kontaktdaten:

Beitrag von stese » Do 6. Jan 2005, 23:16

danke, werd ich mir mal reinziehen ...

Alex
Beiträge: 174
Registriert: So 20. Jul 2003, 11:31
Kontaktdaten:

Beitrag von Alex » Fr 7. Jan 2005, 07:56

Hi!

Das wäre doch mal was für die nächsten Contenido-Versionen, oder? Ein riesiger Schritt...

Viele Grüße

Alex
Contenido 4.4.4 & 4.5.3-CVS

timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo » Fr 7. Jan 2005, 09:33

Alex hat geschrieben:Das wäre doch mal was für die nächsten Contenido-Versionen, oder? Ein riesiger Schritt...
Hast du meine Antworten dazu gelesen? ;)

Alex
Beiträge: 174
Registriert: So 20. Jul 2003, 11:31
Kontaktdaten:

Beitrag von Alex » Fr 7. Jan 2005, 09:36

Aha! Dein "ist schon im CVS" hieß, dass dies komplett möglich ist? Hab ich missverstanden...

Sorry!

Viele Grüße

Alex
Contenido 4.4.4 & 4.5.3-CVS

timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo » Fr 7. Jan 2005, 09:49

Alex hat geschrieben:Aha! Dein "ist schon im CVS" hieß, dass dies komplett möglich ist? Hab ich missverstanden...
Ja, im Prinzip ist es so: Aus dem CVS werden die Snapshots erzeugt...und da ist das drin. Aber was der Site-Implementor immer noch selbst machen muß und nie abbgekommen wird: mod_rewrite entsprechend seinen Wünschen einrichten.

stese
Beiträge: 1040
Registriert: Fr 3. Dez 2004, 17:47
Wohnort: München
Kontaktdaten:

Beitrag von stese » Fr 7. Jan 2005, 11:31

hi,

habe mir die 4.5.2 angeschaut und dort ist das alles schön im plementiert, aber 2 fehler hab ich dort gefunden:
1: umlaute und sonderzeichen werden unzulänglich umgewandelt. (als Ü wird nicht Ue sondern einfach gelöscht, aus einem [blank] wird nicht etwa ein - sondern ebenfalls einfach gelöscht.

beim artikel konnte ich keinen websicheren namen einstellen. (a la artikeltitel.html) aber sonst schaut mir das 4.5.2er sehr gut aus. für die leute die das 4.4.4er nutzen (weils eben ne stable version ist) die können sich mein bundle runtersaugen hehe

timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo » Fr 7. Jan 2005, 11:33

ähm die 4.5.2? oder hast du einen Snapshot verwendet?

stese
Beiträge: 1040
Registriert: Fr 3. Dez 2004, 17:47
Wohnort: München
Kontaktdaten:

Beitrag von stese » Fr 7. Jan 2005, 11:35

äh ja sorry - snapshot von gestern

timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo » Fr 7. Jan 2005, 11:48

ah okay...dann schau ich mir das nochmal an ;)

Gesperrt