[gelöst] Webform als Block in Node - woher die NID in webform_options_form_alter ?
am 10.04.2015 - 09:36 Uhr in
Hallo,
wenn man eine Webform als Block in verschiedene Content-Nodes einbaut, wie kommt man an die Node-ID des Contents ran, wenn man mit
webform_options_form_alter(&$form, &$form_state, $form_id)
die Webform für die Nodes modifizieren will?
In den Parametern findet sich nur die Webform(-Block)-ID - und die ist ja immer dieselbe.
Das:
<?php
$nid = substr(strrchr($_GET['q'], "/"), 1);
?>Beim ersten Aufruf der Form ist noch $_GET['q'] z.B. 'node/99',
ab dem nächsten Schritt aber => 'system/ajax'
Michael
- Anmelden oder Registrieren um Kommentare zu schreiben

arg()-Funktion nutzen
am 10.04.2015 - 09:56 Uhr
Das funktioniert meistens mit arg(). Siehe z.B. diesen Kommentar von stBorchert: http://www.drupalcenter.de/node/22920#comment-81066
Das geht eben leider nicht,
am 10.04.2015 - 10:34 Uhr
wie ich oben schon beschrieben hatte:
Es ist eine Multistep-Webform, deren Schritte per AJAX aktualisiert werden.
D.h. ab Schritt 2 steht in $_GET['q'] nicht mehr 'node/99' sondern 'system/ajax' - und das liefert auch arg(0) bzw. arg(1) !
Und da die webform_options_form_alter(&$form, &$form_state, $form_id) bei jedem Schritt aufgerufen wird, habe ich ab
<?phpif($form_state['webform']['page_num']==2) {
...
}
?>
Zwischenspeicher der Formular-Daten nutzen
am 10.04.2015 - 11:14 Uhr
OK, dann würde ich mir mal die Formular-Daten anschauen (z.B. mit dvm($form) mit aus dem devel.module), ob die schon etwas sinnvolles transportieren. Wenn nicht, könnte man man die Node-ID dort einbringen (speichern). Dort würde ich anfangen, um hier eine Lösung zu entwickeln. Vllt. weiß jemand anderes ad hoc schon eine fertige Lösung dafür.
daran hatte ich auch schon gedacht,
am 10.04.2015 - 12:32 Uhr
hat nur etwas länger gedauert, es einzubauen und zu testen.
UND ES GEHT !
Also eine hidden-field-Komponente 'content_nid' in die Webform einbauen, und dann kann ich in webform_options_form_alter(&$form, &$form_state, $form_id):
<?phpif(arg(0) == 'node') {
// in das Feld schreiben:
$content_NID = arg(1);
$form['submitted']['content_nid']['#default_value'] = $content_NID;
} else {
// sonst auslesen:
$content_NID = $form_state['storage']['submitted'][<ComponentID>];
}
?>
Nur nicht die is_numeric(arg(1)) Bedingung vergessen
am 10.04.2015 - 12:59 Uhr
Insbesondere, wenn die Node-ID wieter verarbeitet werden soll z.B. mit node_load.
genau das mache ich ja,
am 10.04.2015 - 13:28 Uhr
also node_load($content_NID), weil ich in den Webform-Steps die Inhalte brauche - und bis jetzt hat das noch keine Probleme gemacht, auch mit gesetztem URL-Alias nicht.
In welchen Fällen kann denn das wichtig sein, arg(1) was anderes als numeric sein?
Die Webform ist ja ohnehin nur in ContentType-Nodes eingebaut, und in webform_options_form_alter(&$form, &$form_state, $form_id) frage ich natürlich ab
if(isset($form['#node']) && $form['#node']->title == 'My MultiStep Form') {...
}
Zur Sicherheit
am 10.04.2015 - 13:39 Uhr
Neben einer möglichen Fehlerquelle (aber abhängig vom Einsatz des Scripts) ist insbesondere die URL eine Benutzer-Eingabe, über die man z.B. SQL-Injection-Angriffe starten könnte. Es ist einfach besser Daten zu überprüfen bevor man sie weiter verarbeitet.
Ergänzung: Mag sein, daß es in diesem Fall abwägig ist, daß Dein Code ausgeführt wird bei "Fehleingaben", aber manchmal übersieht man eben auch die Ausnahme. So entstehen wahrscheinlich die meisten Sicherheitslücken.
OK, überzeugt
am 10.04.2015 - 14:03 Uhr
vielen Dank nochmal, Michael