Benutzereingaben Manipulieren
am 22.01.2009 - 17:31 Uhr in
Ciao,
Ich habe ein Node Modul, mit mehreren selbstdefinierten eingabefeldern. Nach dem Submit möchte ich nun die eingegebenen Daten zusammensetzen und parsen, bevor die hooks: validate, update oder insert ausgeführt werden.
Konkret habe ich ein JavaScript/DHTML Widget, um mehrere Daten einzutragen. Die Daten welche der Benutzer damit zusammenklickt, müssen nach dem Absenden per PHP Script für die validierung und die Datenbank insert's aufbereitet werden.
Aktuell habe ich das Problem gelöst, indem ich in den entsprechenden hooks die Daten jeweils neu parse. Dieser Lösungsansatz gefällt mir nicht, da die entsprechende Funktion unnötigerweise 3x aufgerufen wird.
Ein anderer Lösungsansatz, welcher mir auch nicht gefällt, wäre über den hook_nodeapi. Hier müsste ich den Code nur einmal ausführen, jedoch habe ich anschliessend die gesamte Funktionalität mehr oder weniger in der hook_nodeapi() Funktion.
Überschreibe ich $node im hook_nodeapi sind die Änderungen in den entsprechenden hooks wieder weg. Jedenfalls bei Drupal 5.
Beispiel:
<?php
function test_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
$node->foo = "test";
}
function test_validate($node){
drupal_set_message("Foo ist: " . $node->foo);
}
?>
Kann mir jemand einen Tipp geben wie ich das schöner lösen kann?
Möglicherweise macht es sinn das Eingabefeld als CCK Modul umzusetzen. Somit habe ich den Vorteil der Wiederverwendbarkeit...
Lg
Joshua
- Anmelden oder Registrieren um Kommentare zu schreiben
<?php // Let modules
am 24.01.2009 - 11:49 Uhr
<?php
// Let modules modify the node before it is saved to the database.
node_invoke_nodeapi($node, 'presave');
?
Bin mir aber nicht sicher ob wirklich hook_presave aufgerufen wird, nein, versuche es halt mit hook_nodeapi
HALT.
jetzt ist mir dein Problem bewusst.
hook_validate, wird generell vor jeder Submit funktion aufgerufen, Grund sollte ja klar sein.
Deswegen kommt dann auch nichts an, in hook_validate, was ist denn generell das Ziel?
Ja cck Module sind natürlich noch besser
--------------
Blog www.freeblogger.org: Deutscher IRC-Channel: irc.freenode.net #drupal.de ... Jabber-me: dwehner@im.calug.deXING
Ciao "dereine" Danke für
am 24.01.2009 - 14:02 Uhr
Ciao "dereine"
Danke für Deine Antwort.
Also ich beschreibe mal etwas ausführlicher was ich beabsichtige:
Ich habe ein Node Modul veranstaltungen. (Ich weiss es gibt ein events modul. Das entspricht aber in vielerlei Hinsicht nicht meinen Anforderungen.)
Im hook_form binde ich HTML Code mit einem eigenen Eingabefeld ein:
<?php
$form['date_markup'] = array(
'#type' => 'markup',
'#value' => "mein HTML Formular",
'#weight' => 10
);
?>
Dieser HTML Code beinhaltet eingabefelder zur Datumsauswahl (Start und Enddatum), und zwei felder für die Uhrzeit (Start Ende). Zusätzlich zwei Checkboxen für Mehrtägige veranstaltungen und Ganztägige veranstaltungen.
Ist die Checkbox Ganztägig ausgewählt, werden die eingabefelder für die Uhrzeit auf display:none gesetzt. Wird die Checkbox Mehrtägig deaktiviert, wird das eingabefeld mit dem Enddatum und Uhrzeit auf display:none gesetzt.
Liegen zwischen Start und Enddatum mehrere Tage, kann für diese einzeln die Start und End Uhrzeit entsprechend angepasst werden. Einzelne Tage dazwischen können auch per Checkbox ausgenommen werden.
Und so schaut es dann aus:
Das eingabefeld wird also den eingaben entsprechend per Javascript erweitert. Die erste validierung geschieht auch bereits per Javascript.
Wird das Formular nun abgesendet, habe ich eine unbestimmte Anzahl Eingabefelder, welche ich nun mit PHP zu einem Array zusammenfüge. Der Array schaut dann in etwa so aus:
// Eine mehrtägige veranstaltung mit der Checkbox Ganztägig ausgewählt
array(
array(
'begin' => '2009-01-24 00:00',
'end' => '2009-02-15 23:59'
)
)
// Eine mehrtägige veranstaltung (Einzelne Tage ausgeschlossen)
array(
array(
'begin' => '2009-01-24 14:00',
'end' => '2009-01-24 18:00'
)
array(
'begin' => '2009-01-25 14:30',
'end' => '2009-01-25 18:30'
)
array(
'begin' => '2009-01-26 00:00',
'end' => '2009-01-26 23:59',
'disabled' => true
)
array(
'begin' => '2009-01-27 08:00',
'end' => '2009-01-27 14:00'
)
)
Diesen Array brauche ich nun:
Da es nun offenbar keinen hook gibt, welcher mir ermöglicht, nach jedem submit diesen Array zu erzeugen, muss ich diesen bei jedem hook neu erzeugen (Performance). Oder den Umweg über den hook_nodeapi machen.
Ich fürchte, das ich mit einem CCK Modul vor dem selben Problem stehen.
Ich hoffe, nun ist einigermassen klar, was ich beabsichtige.
Lg
Joshua
und was ist wenn du das
am 24.01.2009 - 20:47 Uhr
und was ist wenn du das formular erstmal per formapi baust
und dann per #theme ausgibtst?
ich glaube reines html zu schreiben ist halt einfach nicht das ware in drupal
--------------
Blog www.freeblogger.org: Deutscher IRC-Channel: irc.freenode.net #drupal.de ... Jabber-me: dwehner@im.calug.deXING
Ich weiss, ist nicht ganz
am 26.01.2009 - 12:12 Uhr
Ich weiss, ist nicht ganz Drupal like. Ich möchte/kann aber nicht darüber Diskutieren. Die Darstellung und die Funktionalität entspricht den mir gestellten Anforderungen.
Es gibt ja noch andere Szenarien, wo das selbe Problem auftreten könnte:
Wenn ich beispielsweise zwei Textfelder habe: foo und bar. Das Textfeld "bar" darf jedoch nur von Bestimmten Personengruppen ausgefüllt werden (#access).
Hat die Person nun kein Zugriff auf das Feld: bar, soll das Feld mit der Eingabe aus foo gefüllt werden. Beim Editieren wird die ursprüngliche Eingabe verwendet (Könnte von einem Berechtigten Benutzer auf einen anderen Wert gesetzt worden sein).
Also ist die #default_value für das Feld bar je nach Berechtigung entweder $node->foo oder $node->bar. Der entsprechende Wert müsste in diesem Fall für die hooks form, validate, insert und update jedes mal neu gesetzt werden.
<?php if(!user_access('edit bar field') && !$node->bar) $node->bar = $node->foo; ?>