mod_rewrite und variablen einlesen

Das Board für alle Fragen und Diskussionen, die keinen direkten Bezug zu CMS made simple haben
Post Reply
owr_bgld

mod_rewrite und variablen einlesen

Post by owr_bgld »

Ich arbeite mit mod_rewrite und brauche für ein externes script, dass eingebaut werden soll, die Übergabe einer Variablen. Ich hab zwar gesucht, aber entweder bin ich vor lauter Arbeiten mit Code schon blind oder überhaupt.

Wenn ich mod_rewrite eingestellt habe, wie kann ich die Variable einlesen, wenn ich anstatt ?page=test&var=1 die Version /1/test ausgeben will (das stellt noch kein Problem dar) und das script dann auch weiß, dass 1 der Wert für die Variable $var ist?

Ich hab mir zwar das Script für die Modulentwicklung und clean urls durchgelesen - aber ich versteh nur Bahnhof  ???
Last edited by owr_bgld on Wed Mar 24, 2010 3:22 pm, edited 1 time in total.
NaN

Re: mod_rewrite und variablen einlesen

Post by NaN »

Schau mal in den Quellcode irgendeines Moduls das Pretty URLs unterstützt (z.B. News Modul).
Dort gibt es eine Funktion namens function SetParameters().
In dieser Funktion wird mit der Funktion $this->RegisterRoute(...) ein Regulärer Ausdruck festgelegt nach dem CMSms erkennt, dass es sich bei der aufgerufenen URL um einen Modulaufruf handelt und welche Teile dieses Ausfrufs welchen Variablen als Werte zugewiesen werden sollen.

Bsp: deineDomain/1/test

Der reguläre Ausdruck wäre also in Worten: eine Gruppe von Ziffern, gefolgt von einem Schrägstrich, gefolgt von dem Wort Test.

Aussehen würde er z.B. so: /(\d+)\/test$/

PHP nutzt auch einen anderen Syntax, den ich jetzt leider nicht so einfach erklären kann. Im Prinzip werden die Namen der Variablen mit Hilfe von ?P mit in in den Suchausdruck eingebaut und dem eigentlichen Suchmuster vorangestellt.
Wie gesagt, ein Blick in den Quellcode anderer Module dürfte etwas Klarheit verschaffen.
In Deinem Beispiel müsste die Funktion so aussehen:

Code: Select all


$this->RegisterRoute('/(?P<Name Parameter 1>Wert Parameter 1)\/(?P<Name Parameter 2>Wert Parameter 1)$/', array(optionale zusätzliche parameter));

genauer:

Code: Select all


$this->RegisterRoute('/(?P<Name Parameter 1>\d+)\/(?P<Name Parameter 2>test)$/', array('action'=>'foo'));

Somit findet CMSms als erstes eine Ziffer und weist sie Parameter 1 zu.
Als zweites das Wort 'test' und weist es Parameter 2 zu.
CMSms sammelt alle Parameter im Array $params.
Als zusätzlicher Parameter, der nicht in der URL enthalten ist, wird noch 'action' mit dem Wert 'foo' übergeben. Jetzt weiß das CMS, welche Aktion des Moduls ausgeführt werden soll.
In dieser Aktion - action.foo.php - kannst Du nun mit $params['Name Parameter 1'] bzw. $params['Name Parameter 2'] auf die Werte in der URL zugreifen.

Man könnte die Aktion auch in die URL einbauen:

Code: Select all


$this->RegisterRoute('/(?P<action>\w+)\/(?P<Name Parameter 1>\d+)\/(?P<Name Parameter 2>test)$/');

Im Prinzip sind fast alle Pretty URLs so aufgebaut:

modul name/wert1/wert2/.../und irgendwo auch noch die returnid.
Ohne Returnid weiß das CMS  nicht auf welcher Seite es die Modulaktion anzeigen soll und zeigt es auf der Startseite an.

Ich hoffe das hilft Dir weiter.
Last edited by NaN on Wed Mar 24, 2010 8:06 pm, edited 1 time in total.
owr_bgld

Re: mod_rewrite und variablen einlesen

Post by owr_bgld »

noch nicht wirklich. Das Problem ist dass ich einerseits keine Ahnung von Modulen hab und es andererseits eine rein interne Geschichte ist, die außerhalb nicht verwendet werden kann. Also wirds als eigenes Script verwendet (ist schon so vorhanden) Und ich brauchs eigentlich nur um zu wissen, auf welcher Seite ich mich gerade befinde und wenn ich auf weiter klicke, dass ich auf die nächste Seite komme. Bei Zurück auf die vorige Seite. also die $var wird entweder eins höher oder eins niedriger.

Da es eine reine xml-Abfrage mit Ausgabe der Inhalte dieser xml-Datei ist (jedoch mit vielen internen Variablen usw., da diese von woanders mit immer aktuellen Werten abgeholt wird), ist mein einziges Problem, dass ich nur die Seite wissen muss, auf der ich gerade bin bzw. eigentlich an die neue Seite nur den Wert eins höher oder niedriger übergeben muss.
NaN

Re: mod_rewrite und variablen einlesen

Post by NaN »

Achso, ich dachte es ginge um ein CMSms Modul und das Erzeugen / Auswerten von pretty URLs.
Versuchs mal in der .htaccess damit:

Code: Select all


RewriteCond %{REQUEST_URI} ^/([0-9]+)/$
RewriteRule ^(.+)$ index.php?variablenName=$1 [QSA]

Das sollt eim Prinzip alle Anfragen von deineDomain/1/ nach deineDomain/index.php?variablenName=1 umleiten.
owr_bgld

Re: mod_rewrite und variablen einlesen

Post by owr_bgld »

Der Ansatz wär schon mal nicht schlecht, aber da gibt er mir dann die Page-Variable nicht mehr aus. Derzeit habe ich ja folgendes drinnen:

Code: Select all

RewriteRule ^(.+)$ index.php?page=$1 [QSA]
Die Frage wäre, wie er mir dann die Variable zusätzlich übergeben könnte.


Aber ich lebe derzeit einfach damit, dass er mir auf dieser Seite bei Weiterblättern dann das nicht pretty ausgibt, da ich auch noch andere Dinge zu ändern habe.
NaN

Re: mod_rewrite und variablen einlesen

Post by NaN »

CMSms prüft zur Zeit (leider) nur das Seiten-Alias.
D.h. es schaut nur nach, ob die letzte Angabe nach dem Schrägstrich mit einem Alias aus der DB übereinstimmt.

(Besser wäre eigentlich, wenn der komplette Pfad geprüft werden würde, da er ebenso eindeutig ist wie ein Seiten-Alias - würde duplicate content nur auf Seiten, die tatsächlich existieren reduzieren, aber dazu wäre eine Menge Arbeit an allen Modulen nötig; ich versuche das gerade mit dem NewsModul - aber egal)


D.h. die Seite (die Variable page) muss in Deiner URL immer hinten stehen.
Also wie in Deinem Beispiel: deineDomain/1/test
Dann ignoriert CMSms die 1 und sucht nur nach einer Seite mit dem Alias test.

Die Frage ist aber wie Dein Script an die 1 rankommt.
Entweder du leitest via .htaccess z.B. so um (habs noch nicht getestet, erscheint mir aber logisch - bin aber nicht so der Profi in rewriterules):

Code: Select all


RewriteCond %{REQUEST_URI} ^([0-9]+)?/?(.*)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ index.php?page=%2&variablenName=%1 [QSA]

Also anstatt einfach alles an die Variable page zu übergeben, wird nur der Teil, der nach einer eventuellen Ziffer kommt, übergeben.
Die Ziffer selbst wird an Deine Variable übergeben. So oder so ähnlich. Müsste man mal ausprobieren.

Oder Du prüfst in Deinem Script selber den Query String.
So wie es CMSms ja bei der Suche nach dem Alias eigentlich auch tut.
Dürften im Prinzip nur kleine Änderungen an Deinem Script sein.
owr_bgld

Re: mod_rewrite und variablen einlesen

Post by owr_bgld »

ahhhh - scheint logisch zu sein. Ok ich werd mich mal entweder am WE oder nächste Woche drüber trauen. Denn inzwischen hab ich ja den Rest hingekriegt  ;D und muss mich nur mehr mit der fancybox rumschlagen. Aber das ist eine andere Geschichte. Ich geb dann Bescheid.
owr_bgld

Re: mod_rewrite und variablen einlesen

Post by owr_bgld »

So hatte endlich die Zeit und Muße, es zu testen. Funktioniert leider nicht, da es mir den Rest dadurch zerschießt.

Ich werde es demnächst am Modulentwickeln versuchen - hab zwar nicht viel Ahnung davon, aber das einzige das ich für die Datenbank selber brauchen kann sind Templates und der Rest ist mit Parametern zu schaffen, oder ich überleg mir die auch in die Datenbank zu setzen.

Aber das ist eine andere Geschichte ...
Post Reply

Return to “Stammtisch”