[gelöst] Webform als Block in Node - woher die NID in webform_options_form_alter ?

am 10.04.2015 - 10: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 - 10:56 Uhr
Das funktioniert meistens mit arg(). Siehe z.B. diesen Kommentar von stBorchert: http://www.drupalcenter.de/node/22920#comment-81066
# DrupalCenter-Moderator # Mitglied im Drupal e.V. # https://www.drupal.org/u/c-logemann
# CTO der Nodegard GmbH: CMS Security & Availability Operations / Wir unterstützen IT-Abteilungen, Agenturen, Freiberufler:innen
Das geht eben leider nicht,
am 10.04.2015 - 11: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
<?php
if($form_state['webform']['page_num']==2) {
...
}
?>
Zwischenspeicher der Formular-Daten nutzen
am 10.04.2015 - 12: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.
# DrupalCenter-Moderator # Mitglied im Drupal e.V. # https://www.drupal.org/u/c-logemann
# CTO der Nodegard GmbH: CMS Security & Availability Operations / Wir unterstützen IT-Abteilungen, Agenturen, Freiberufler:innen
daran hatte ich auch schon gedacht,
am 10.04.2015 - 13: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):
<?php
if(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 - 13:59 Uhr
Insbesondere, wenn die Node-ID wieter verarbeitet werden soll z.B. mit node_load.
# DrupalCenter-Moderator # Mitglied im Drupal e.V. # https://www.drupal.org/u/c-logemann
# CTO der Nodegard GmbH: CMS Security & Availability Operations / Wir unterstützen IT-Abteilungen, Agenturen, Freiberufler:innen
genau das mache ich ja,
am 10.04.2015 - 14: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 - 14: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.
# DrupalCenter-Moderator # Mitglied im Drupal e.V. # https://www.drupal.org/u/c-logemann
# CTO der Nodegard GmbH: CMS Security & Availability Operations / Wir unterstützen IT-Abteilungen, Agenturen, Freiberufler:innen
OK, überzeugt
am 10.04.2015 - 15:03 Uhr
vielen Dank nochmal, Michael