[gelöst] URL-Parameter von hook_nodeapi() abfragen
am 28.07.2009 - 20:50 Uhr in
Hallo,
ich hänge hier an einem Problem fest.
Folgende Situation: Ich erstelle derzeit ein eigenes Modul, das einen eigenen Content Type mit sich bringt. Dieser Content Type hat neben den Standard-Feldern Title und Body noch ein weiteres Feld (Token), das mit einem ca. 20 stelligen, zufallsgenerierten Token gefüllt ist.
Ich möchte, dass Nodes vom entsprechenden Content Type nur dann geöffnet werden können, wenn der Token in der URL übergeben wurde.
Beispiel:
http://www.url.de/node/5 führt zu einer Fehlerseite, während
http://www.url.de/node/5/18259891281085821 zur korrekten Seite führt.
Ich hätte mir das jetzt so vorgestellt: Ich überschreibe die hook_nodeapi() - Funktion, und zwar, wenn $op = load ist. Das ist dann, wenn die Daten aus der Datenbank abgefragt wurden und ich eigene Daten ergänzen könnte.
Jetzt würde ich gerne prüfen, ob der per URL übergebene Token mit dem in der Datenbank hinterlegten übereinstimmt. Mein Problem nur: Wie komme ich an den per URL übergebenen Token? Was ich auch nicht unbedingt machen möchte ist, den kompletten Request-String zu nehmen und zu prüfen, ob irgendwo der korrekte Token vorkommt. Ich würde gerne direkt den per URL übergebenen Token abfragen, nur habe ich keine Ahnung wie.
Ich hoffe, ihr könnt mir weiterhelfen.
Viele Grüße
Sebastian
- Anmelden oder Registrieren um Kommentare zu schreiben
Re: URL-Parameter von hook_nodeapi() abfragen
am 29.07.2009 - 02:57 Uhr
Ich überschreibe die hook_nodeapi() - Funktion, und zwar, wenn $op = load ist.
Das ist ein denkbar schlechter Zeitpunkt. Es gibt viele Gründe, einen Node zu laden, ohne ihn anzeigen zu wollen. Besser ist
hook_nodeapi($op = 'alter')
. Ungefähr so:<?php
/**
* Implementation of hook_nodeapi().
*/
function foo_nodeapi($node, $op, $a3 = NULL, $a4 = NULL) {
global $user;
// TODO: Name deines Inhaltstyps an die Variable $type zuweisen
// TODO: Token für Benutzer $user an die Variable $token zuweisen
switch ($op) {
case 'alter':
if ($node->type == $type && arg(0) == 'node' && arg(1) == $node->nid) {
if (arg(2) != $token) {
// TODO: mittels drupal_goto(), auf Fehlerseite weiterleiten
}
}
break;
// TODO: weitere Werte von $op abarbeiten
}
}
?>
Da
hook_nodeapi
aber für Inhaltstypen gedacht ist, die nicht von deinem Mopul definiert wurden, solltest du den Code eigentlich inhook_view
unterbringen. Dann kannst du dir auch die Weiterleitung mittelsdrupal_goto
sparen und einfach perdrupal_set_header
den HTTP-Status setzen und in$node->content
die Fehlemeldung für den Benutzer reinpacken.--
Hat funktioniert, vielen
am 29.07.2009 - 06:34 Uhr
Hat funktioniert, vielen Dank!
Noch eine kleine Ergänzung: Wenn ich nun möchte, dass nach dem Erstellen eines Nodes mit dem oben erklärten Content Type zur URL http://www.url.de/node/1/1297512087214 weitergeleitet werden soll und nicht nur zu .../node/1, kann ich dann einfach hook_update() und hook_insert() nutzen, und hier ans Ende ein drupal_goto() setzen oder gibt's hierfür einen eleganteren Weg?
Viele Grüße
Sebastian
$form_state['redirect']
am 29.07.2009 - 08:43 Uhr
... dass nach dem Erstellen eines Nodes mit dem oben erklärten Content Type zur URL http://www.url.de/node/1/1297512087214 weitergeleitet werden soll ...
hook_update
undhook_insert
werden aufgrufen bevorhook_nodeapi($op = 'update')
bzw.hook_nodeapi($op = 'insert')
aufgerufen werden. Wenn du in die Hooks also eindrupal_goto
einbaust, dann nimmst du anderen Modulen die Möglichkeit, auf update- und insert-Ereignisse deines Nodetyps zu reagieren.Außerdem werden o.g. Hooks von
node_save
ausgeführt und es kann ja auch sein das du irgendwann programatisch (nicht durch Eingabe der Daten auf dem Add/Edit-Formular) Nodes dieses Typs speichern möchtest. Es wäre ärgerlich, in solchen Fällen immer direkt irgendwo hin weitergeleitet zu werden.Füge in
hook_form_alter
einen zusätzlichen Submit Handler hinzu. Im Submit Handler sagst du dann<?php
$form_state['redirect'] = "node/$nid/$token";
?>
--
Klasse, vielen Dank für die
am 29.07.2009 - 08:44 Uhr
Klasse, vielen Dank für die schnelle Antwort. Werde ich heute Abend gleich mal ausprobieren.
Viele Grüße
Sebastian
Hat geklappt, besten Dank!
am 30.07.2009 - 12:33 Uhr
Hat geklappt, besten Dank!