php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2006

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 21.03.2006, 11:06  
ssm
Benutzer
 
Registriert seit: 21.03.2006
Beiträge: 65
ssm
Standard Strukturierung modularer Website mit CleanUrls

Hallo zusammen,
meine erste Frage im Forum betrifft eine aktuelle Anwendung.

Es handelt sich dabei um eine Web-Anwendung, welche aus vielen unterschiedlichen Modulen (news,galerie etc.) besteht und welche wie folgt funktionieren soll.

module:
- news
- galerie
- page
- etc.

Nun möchte ich den Aufruf dieser Module an beliebiger Stelle der Anwendung durch CleanUrls (ausgeschriebene URls ohne Parameter) per .htaccess mit mod_Rewrite lösen.

Beispiel:
Instanzen des Moduls "Galerie" sollen jeweils wie folgt aufgerufen werden:
1. www.domain.tld/galerie/
2. www.domain.tld/produkt/galerie/

Dabei handelt es sich jeweils um Galerien mit unterschiedlichem Inhalt.

Da die URl sehr unterschiedlich sein kann habe ich einige Schwierigkeiten bie der Festlegung eines Prinzips zu Aufschlüsselung der URl bzw. der Weitergabe der Parameter mit mod_rewrite.

Im Grunde müssen folgende Patterns gleichzeitig erfasst, aber dennoch unterschieden werden.

www.domain.tld/modul/
www.domain.tld/bereich/modul/
www.domain.tld/bereich/unterbereich/modul/
www.domain.tld/einfacheUrl/nochwas.html -> z.B. für Modul "page"
www.domain.tld/einfacheUrl/nochwas/ -> z.B. für Modul "page"
usw.

Da die Module an beliebiger Stelle einsetzbar sein sollen und mal "bereich" oder "bereich/unterbereich" dem modulnamen vorranstehen bietet es sich an "bereich" oder "bereich/unterbereich" direkt per mod_rewrite als parameter für das Modul zu nutzen.

Beispiel:
www.domain.tld/kuchen/eistorte/galerie/ per mod_rewrite in http://www.domain.tld/index.php?modu...aram2=eistorte umwandeln.

Andererseits kolliediert das mit anderen Modulen und URl-Strukturen für z.B. eine einfache Seite mittles Modul "page" mit der URl: http://www.domain.tld/produkte/kuche.../weichnachten/

Ich kann mir vorstellen die Bereiche der Seite (auch für navi) jetzt in der DB mit einem parameter für das jeweilige Modul zu versehen - bleibt die Frage ob ich nicht generell etwas auf dem Holzweg bin und es für den beliebigen Einsatz von Modulen in Verbindung mit CleanUrls nicht einen wesentlich bessseren Ansatz gibt.

Für Tips, Anregungen und Links bin ich sehr dankbar !

ssm
__________________
IP-Popularität und Linkpopularität
ssm ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 21.03.2006, 11:27  
ssm
Benutzer
 
Registriert seit: 21.03.2006
Beiträge: 65
ssm
Standard

Da fällt mir noch ein prinzipiell gehts dabei wohl tatsächlich weniger um mod_rewrite sondern um eine vernünftige Möglichkeit die Paramter der URL auszuwerten um festzustellen - was ist eigentlich modul - und was modulparameter bei so unterschiedlichen URls.
__________________
IP-Popularität und Linkpopularität
ssm ist offline  
Alt 21.03.2006, 11:54  
Erfahrener Benutzer
 
Registriert seit: 18.07.2004
Beiträge: 2.162
PHP-Kenntnisse:
Fortgeschritten
Basti
Standard

Hi "ssm" und herzlich willkommen.

Ich würde die Auswertung in den PHP-Code nehmen und mod_reqrite nur anweisen, den ganzen
Pfad als query string zu übergeben:

PHP-Code:
RewriteEngine on
RewriteCond 
%{REQUEST_FILENAME} !-f
RewriteRule 
^(.*) index.php?path=$1&%{QUERY_STRING}

---

$aArgs = array();
parse_str($_SERVER['QUERY_STRING'], $aArgs);
$sRequestPath $aArgs['path']; 
Da kannst du auch noch Parameter, wie z.B. die Session-ID anhängen.

Was das URI-"Design" angeht, so ist die Frage eher, welche Komponenten deiner Anwendung
welche Entscheidungen treffen, welche Informationen sie dazu brauchen und woher diese kommen.

Eine häufig benutzte Möglichkeit ist sowas, wie:
/Controller/Method/Key1/Value1/Key2/Value2

Oder das gleiche mit festgelegter Paremeterreihenfolge
/Controller/Method/Value1/Value2

Oder sowas:
/This/is/an/Alias
...der beliebig ist und dann entsprechend aufgelöst wird.

Zitat:
Da die Module an beliebiger Stelle einsetzbar sein sollen
Was heißt denn "an beliebiger Stelle"? Es scheint ja sowas, wie eine Sitemap, also auch "Seiten"
zu geben. Bleibt die Frage, wer anhand welcher Infos entscheidet, auf welcher Seite "das Modul"
angezeigt werden soll. Dem Modul ist das ja Wurscht und es hat damit ja erstmal nichts zu tun. Es
nimmt einfach Werte entgegen anhand dessen es entscheidet, was anzuzeigen ist - aber eben
nicht, in welchem Kontext/welche Navigationselemente wie dargestellt werden sollen.

Basti
Basti ist offline  
Alt 21.03.2006, 12:38  
ssm
Benutzer
 
Registriert seit: 21.03.2006
Beiträge: 65
ssm
Standard

Hallo Basti und erstmal danke für deine guten Vorschläge.

"Beliebig" heist einfach dass es urls wie (für modul "galerie")
/galerie/
/unterseite/galerie/
/unterseite1/unterseite2/galerie/
geben soll und jeweils eine andere Galerie abgebildet wird.

Dacht mir schon es ist am einfachsten einfach den ganzen query-string erstmal an php zu übergeben.

Angenommen man hätte dann für
/unterseite/unterseite/galerie/
einen string in der form ?param1=unterseite1&param2=unterseite2&param3=gale rie
so könnte man ja einfach testen (module liegen einem verzeichnis) ob es für einen der Parameter ein Modul gibt und dies entsprechend aufrufen mit den Parametern: unterseite1 & unterseite2, so dass die richtige Galerie dargestellt wird.

Nur bin ich mir noch nicht ganz im Klaren darüber ob ich am besten jedem Eintrag in der Galerie-DB ein Feld zu diesem Zweck zuweise. Man müsste ja theoretisch einen Galerie-Eintrag aus der DB mit den beiden Parametern "unterseite1" und "unterseite2" abgleichen können um die erwünschten Bilder zu erhalten.
Und ich weiss noch nicht wie genau ich das anstellen soll, je nachdem wie viele Parameter der URL aufzulösen sind.

Geht also vornehmlich ums Auseinandernehmen und Zuweisen der jeweiligen Parameter des query-strings - nur weiss ich noch nicht genau wie im Einzelfall !
__________________
IP-Popularität und Linkpopularität
ssm ist offline  
Alt 21.03.2006, 12:54  
Erfahrener Benutzer
 
Registriert seit: 18.07.2004
Beiträge: 2.162
PHP-Kenntnisse:
Fortgeschritten
Basti
Standard

Hi.

Also, wie das einzelne Modul damit umgeht, kannst du ja von Modul zu Modul entscheiden. Wichtig ist doch, dass dieses mit seinen Parametern aufgurfen wird. Ich kann mir nicht vorstellen, dass hier eine zentrale Lösung Sinn macht.

Zentral lösen musst du das nur, wenn eben mit den verschiedenen Parametern auch ausgedrückt wird, auf welchen "Seite" das Modul eingebunden wird - zumindest muss das Modul dann die Info zurückgeben, in welchem Sitemap-Knoten es eingebaut werden soll (wobei die Frage wäre, woher und vr allem warum das Modul die Sitemap und damit die Knoten kennen sollte). Aber es macht keinen Sinn hier zu spekulieren ohne die Anforderungen zu kennen.

Basti
Basti ist offline  
Alt 21.03.2006, 13:01  
ssm
Benutzer
 
Registriert seit: 21.03.2006
Beiträge: 65
ssm
Standard

Vielleicht nochmal um die "Beliebigkeit" zu verdeutlichen ein Url-Tree:

/ --> Modul "index"
/galerie/ --> Modul "galerie" mit param"" oder ohne (standard-galerie)
/produkte/ --> modul "page" mit param "produkte"
/produkte/kleidung/ --> modul "page mit param "kleidung" (und param produkte?)
/produkte/kleidung/galerie/ --> modul "galerie" mit param "kleidung"
/produkte/kleidung/galerie/jeans.html --> modul "galerie" mit param1 "kleidung" & param2 "jeans"

/news/ --> modul news mit param "" (standard-news)
/news/archive/ --> modul "news" mit param1 "" und param2 "archive"

/textilindustrie/ --> modul "page" mit param "produkte"
/textilindustrie/glossar/ --> modul "glossar" mit param "textilindustrie"
/textilindustrie/glossar/formschnitt.html --> modul "glossar" mit param1 "textilindustrie" und param2 "formschnitt"

In der DB werden neue Sektionen (z.B. "/neu/galerie/") bereits zwecks navigation abgelegt.
Sinn machen könnte vielleicht ein weiteres DB-Feld mit der Modulart dieses neuen Bereichs........
__________________
IP-Popularität und Linkpopularität
ssm ist offline  
Alt 21.03.2006, 13:37  
ssm
Benutzer
 
Registriert seit: 21.03.2006
Beiträge: 65
ssm
Standard

Vielleicht sowas wie ein table:
Code:
sections-table:
	id |    name    |  url                                 |  module | parent_id |
	---+------------+--------------------------------------+---------+-----------+
	15 | kleidung   |/produkte/kleidung/galerie/           | galerie |     6     |
dann müsste nur der query-string mit dem feld "url" abgeglichen werden - aber macht das wirklich Sinn ?
__________________
IP-Popularität und Linkpopularität
ssm ist offline  
Alt 21.03.2006, 14:56  
Erfahrener Benutzer
 
Registriert seit: 18.07.2004
Beiträge: 2.162
PHP-Kenntnisse:
Fortgeschritten
Basti
Standard

Ich denke, das Problem ist dein Mix aus Seiten, Modulen und Parametern.

Wenn deine Site auf Seiten aufgebaut ist, dann sollte die unterste Schicht sozusagen die Page darstellen. Die Frage ist jetzt, ob anhand des Request allein entscheiden werden kann, welche Page anzegezigt werden soll. Gibt es ein Modul, dessen Ausgabe in Abhängigkeit von den Benutzereingaben und dem Status der Anwendung mal an diesem Punkt in der Sitemap und mal an jenem erscheinen muss und, wenn ja, lässt sich das über Location-Header-Redirects lösen?

Wenn nicht, dann macht es keinen Sinn die Info über die Seite in den Request zu packen, sondern diese müssen anhand der Rückgabewerte der Module dann definiert werden.

Wenn du die Seite unabhängig vom Ausgang der Modul-Operationen definieren kannst, dann können sie direkt oder indirekt in den Request mit rein. Hier ist dann die Frage, ob du die Verortung der anzuzeigenden Seite in der Sitemap auch in der URL abbilden willst. Das bietet den Vorteil, dass du qausi nur eine Ebene eben der Sitemap hast und nicht nochmal abstrahieren musst, aber den Nachteil, dass sich die URLs ändern, wen du was in der Sitemap rumschiebst! Außerdem hast du vielleicht z.B. die Homepage als Root-Knoten in der Sitemap und müsstest hierfür eine Sonderregel einführen, um nicht bei jedem Request /home/products/cakes eben dieses /home mitschleifen zu müssen.

Das ist in meinen Augen ziemlich unschön. Einmal natürlich, weil du für zerbrochene Links vor der Wahl stehst den Benutzer veralteter Links ins Leere laufen zu lassen oder für ihn (ggf. automatisiert) Redirects einzubauen. Aber auch für die interne Verlinkung macht das wenig Spaß, es sei denn, du arbeitst hier mit IDs, die die Ziele eindeutig referenzieren. Damit hast du aber schon die Abstraktionsschicht und kannst die Links glech von der Sitemap entkoppeln.

Aber das hängt eben von den konkreten Anforderungen ab, was hier Sinn macht.

Vermutlich reicht folgendes:
Irgendeine beliebige Zeichenkette (/products/cake oder /kuchen oder php-news oder /news/php) ist in der Datenbank mit einem Platz in der Sitemap, einem aufzurufenden Modul und diesem zu übergebenden Parametern verknüpft. Der Front-Controller (oder was auch immer) kann nun im URL diese Request-ID von weiteren Parametern unterscheiden, liest das Modul und die "statischen" Parameter aus der DB, packt die übergebenen Parameter mit dran und übergibt an das Modul. Die Ausgaben packt es dann eben in den in der DB definierten Kontext.

Da bliebe dann die Frage, woran die Request-ID von den Parametern unterschieden werden kann. Und da hast du egentlich nur die Möglichkeiten, dass sich die beiden Parts entweder äußerlich unterscheiden (Request-IDs beginnen immer mit enem Slash gefolgt von einem Großbuchstaben, Parameter beginnen immer mit einem Slash gefolgt von einem Zeichen != Großbuchstabe) oder du ein bestimmtes Trennzeichen definieren kannst (der erste Slash oder der zweite, oder zwei Unterstriche oder ein /_/, ...). Der Andere Weg, wäre den ganzen Pfad mit der Datenbank zu vergleichen und solange Stück für Stück von hinten abzuschneiden, bis du einen Treffer landest:

SELECT module, method, args
FROM actionmap
WHERE id='/news/php/3' OR
id='/news/php' OR
id='/news'
LIMIT 1
ORDER BY LENGTH(id) DESC

Aber das ist vermutlich schwer, das konfliktfrei zu halten..!

Basti
Basti ist offline  
Alt 21.03.2006, 17:30  
ssm
Benutzer
 
Registriert seit: 21.03.2006
Beiträge: 65
ssm
Standard

Erneut vielen Dank Basti,

habe eben nochmal weiter oben in deinem Posting gelesen und denke dass für meine URl-Konstellation die Erzeuging von Alias-Namen der beste Weg ist.
Zitat:
Oder sowas:
/This/is/an/Alias
...der beliebig ist und dann entsprechend aufgelöst wird.
Dieser kann dann direkt beim erzeugen einer neuen Seite eingestellt werden und kann mit dem request-string verglichen werden und auch direkt in die navigation mit eingbaut werden.

Weiterhin bietet diese Herangehensweise die einfachste Strukturierung für Nutzer und Sumas.

Anders wird eine beliebige Struktur wie:
http://www.domain.com/werbetechnik/f...raun-gmbh.html
modul=directories, category=folienhersteller, item=braun-gmbh

wohl nicht einheitlich aufzulösen sein.

Wie du bereits erwähnt hast mach folgendes in der Tat bei mir Sinn:
Zitat:
Der Front-Controller (oder was auch immer) kann nun im URL diese Request-ID von weiteren Parametern unterscheiden, liest das Modul und die "statischen" Parameter aus der DB, packt die übergebenen Parameter mit dran und übergibt an das Modul.
Ich denke ich könnte z.B. einen Eintrag des Moduls "directory" mit folgender url:
Code:
www.domain.com/werbetechnik/folien/hersteller/braun-gmbh.html
in die Teile
Code:
modul=directories, category=folienhersteller, item=braun-gmbh
splitten, indem ich den Request zunächst in
Code:
Request-ID = "/werbetechnik/folien/hersteller/" und
Parameter = braun-gmbh
(Parameter für den letztendlichen Eintrag kommen immer nach / und enden mit ".html")
splitte und zunächst das Modul über DB-Abgleich mit folgender Tabelle, die auch für die navigation dient :
Code:
 |   id   |  name            |  parent_id  |   module    |  category         |  alias                            |
 +--------+------------------+-------------+-------------+-------------------+-----------------------------------+
 |   5    | Folienhersteller |     3       |  directory  |  folienhersteller |  /werbetechnik/folien/hersteller/ |
aufrufe und schonmal den Parameter "category" aus der DB habe.
Dann kann ich ja in Ruhe den Parameter "braun-gmbh" an das Modul übergeben.

Weiss noch nicht ganz genau ob das jetzt optimal ist - aber zumindest kann ichs mir theoretisch so vorstellen. Zumindes würde das auf die meisten meiner Module so anwendbar sein.
__________________
IP-Popularität und Linkpopularität
ssm ist offline  
Alt 21.03.2006, 17:44  
Erfahrener Benutzer
 
Registriert seit: 18.07.2004
Beiträge: 2.162
PHP-Kenntnisse:
Fortgeschritten
Basti
Standard

Da seh ich spontan zwei Schwachstellen:

Erstens kannst du so nur einen Parameter per URL übergeben, oder? Und damit würdest du wohl kaum hinkommen.

Zweitens müsstest du für alle "statischen" Parameter ein DB-Feld einfügen. Ich würde hier eher ein Parameter-Array oder -Objekt serialisiert ablegen. Muss ja eh nicht durchsuchbar sein. Alternativ eine zweite Tabelle mit id, request_alias, key und value, wobei du hier value auch wieder auf den größten gemeinsamen Nenner bringen müsstest - also wohl auch nicht wirklich besser...

Basti
Basti ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Kleine Änderungen in meiner Website ValusheII Beitragsarchiv 3 28.04.2008 08:32
Captcha in Website einbauen Dartgott PHP Tipps 2008 9 23.04.2008 15:53
Telefonschnittstelle für eine Website madhatter PHP-Fortgeschrittene 5 28.03.2008 17:35
Idee: Website mit uncrackbarem Serial Broadcast PHP Tipps 2007 13 23.02.2007 22:59
komplette Website als Grafik speichern PHP-Fortgeschrittene 68 08.03.2006 21:29
[Erledigt] Mit Yahoo Mess. mit Usern auf Website ohne account chatten PHP-Fortgeschrittene 10 18.09.2005 22:02
eigene Fonts in Website einbinden? ThaRider HTML, Usability und Barrierefreiheit 2 16.07.2005 16:16
website macht auf localhost probleme PHP Tipps 2005 8 14.04.2005 10:25
website lässt sich nicht öffnen PHP Tipps 2005 2 18.02.2005 19:38
[Erledigt] spezielle schrift in der website HTML, Usability und Barrierefreiheit 23 12.12.2004 12:02
[Erledigt] schriften für website HTML, Usability und Barrierefreiheit 2 15.10.2004 09:57
Daten aus einer externen Website lesen via PHP Locutus007 PHP Tipps 2004 4 29.09.2004 17:20
Browser und MSG Box HTML, Usability und Barrierefreiheit 4 17.08.2004 18:40
Begrüssung auf website PHP Tipps 2004 2 25.07.2004 00:36
[Erledigt] Fehlermeldung auf der Website nach dem Veröffentlichen PHP Tipps 2004 6 10.07.2004 15:03

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
wird mit der index.php verknüpft und übergibt dabei einen query-string mit dem parameter id, clean urls ohne mod_rewrite

Alle Zeitangaben in WEZ +1. Es ist jetzt 21:07 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.