Berechnung aus Formulardaten und gespeicherten Werten?
am 14.08.2008 - 01:04 Uhr in
Ich möchte folgendes Projekt mit Drupal umsetzen:
Eine Site, die es ermöglicht z. B. verschieden strukturierte Miettarife von Mietwagenfirmen konkret anhand der Mietdauer und der gefahrenen Kilometer direkt zu vergleichen. Einem Besucher steht eine Formularseite zur Verfügung in der er z. B. eingibt, daß er einen Wagen 3 Tage mieten will und 700 km damit fährt. Dann klickt er einen "Vergleichen"-Button und erhält eine Gegenüberstellung der konkreten Kosten bei verschiedenen Mietwagenfirmen. Am Besten sollten die einzelnen Ergebnisse auch noch nach Preis aufsteigend sortiert sein.
Mein theoretischer Ansatz dazu sieht folgendermaßen aus:
In einem speziellen Inhaltstypen werden Tarifdaten der verschiedenen Mietwagenfirmen eingegeben wie z. B. Miete/Tag, inbegriffene Kilometer, Preis/Zusatzkilometer etc. Für jede Mietwagenfirma wird ein separater Node angelegt. So können die Daten bequem gepflegt werden.
Mit Webform wird ein Formular erstellt, in dem die gewünschte Mietdauer und die vorraussichtlich gefahrenen Kilometer eingegeben werden können.
In einem View werden die berechneten Kosten für die im Formular eingegebenen Daten und die im entsprechenden Mietwagenfirma-Node zugrundeliegenden Tarifdaten ausgegeben und entsprechend sortiert.
Ich frage mich nun, ob das Ganze auf diese Art überhaupt zu realisieren ist.
Eine andere Herangehensweise wäre, die Berechnung in Webform selbst mittels "Additional Processing" zu integrieren, dort auch eine Sortierfunktion einzuschließen und die Ergebnisse auf der Redirect-Seite anzuzeigen.
Die dritte Möglichkeit die ich sehe wäre, auf der Redirect-Seite für jede Mietwagenfirma entsprechende "Computed-Fields" mittels CCK anzulegen, die die Berechnung aus den Formular-Daten und den Tarifdaten aus dem entsprechnden Mietwagenfirma-Node ausführen. Nur stellt sich da die Frage, ob und wie die Ergebnisse sortierbar wären.
Ich habe schon mit der zweiten Methode (Webform -> Additional Processing -> Redirect-Seite) herumprobiert, allerdings ohne allzu weit zu kommen. Das liegt wohl vor allem an meinen mangelnden PHP-Kenntnissen und daran, daß ich noch nicht verstanden habe, wie ich die Formulardaten aufrufen kann.
Hat hier jemand schon ähnliche Projekte umgesetzt und kann mir sagen mit welchem Ansatz das realisierbar ist?
Schöne Grüße und im Vorraus vielen Dank.
- Anmelden oder Registrieren um Kommentare zu schreiben
Computetd Field
am 14.08.2008 - 08:30 Uhr
Ich denke das sollte sich mit Compueted Field machen lassen.
Das ist ein sehr flexibles Ding. Dort kannst Du beispielsweise auch
nur die Ausgabe definieren und alle anderen Felder,
auch das was in die DB gehen soll, leer lassen.
So haben wir immer wieder z.B. FunktionsIcons in Tabellen-Views generiert.
Oder Datenbankauswertungen eingefügt.
Beispiel:
Content-type Projekt und verknüpfter Content-Type Leistung.
Projekt hat ein Feld geschätzte Aufwendung. Ein kaluliertes Feld
im Projekt berechnet nun den prozentualen Verbrauch an Leistung, in dem
es alle verknüpften Leistungen addiert und prozentual ausrechnet.
Du musst nur vorsichtig sein mit der Performance...
Viele Grüße,
www.maximago.de
Viele Grüße,
www.maximago.de/technologie/drupal.aspx
Wie auf Formulareingaben zugreifen?
am 14.08.2008 - 14:09 Uhr
Vielen Dank. Das mit Computed Filelds kenne ich so weit. Die Frage ist vielmehr, WIE greife ich auf die Formulareingaben zu bzw. wie übergebe ich die Formulardaten an den Node/Computed Field, das dann letztendlich als Field im View(Tabelle) angezeigt wird?
Meine sehr rudimentären PHP-Kenntnisse reichen da nicht ganz aus.
Wenn ich in Webform mittels
am 15.08.2008 - 10:41 Uhr
Wenn ich in Webform mittels "Additional Processing" einen redirect z. B. auf node/7 mache:
<?php
$node->webform['confirmation'] = 'internal:node/7';
?>
Und in Webforms Settings unter "Advanced Options" 'Full Debug' einstelle, zeigt es mir auf node/7 sämtliche Formvariablen an:
* $form_values are:
Array
(
[submitted] => Array
(
[2] => 10
[1] => 20
)
[details] => Array
(
[email_subject] => none
[email_from_name] => none
[email_from_address] => mail@email.cc
[nid] => 1
[sid] => 74
[is_new] => 1
)
[op] => Submit
[submit] => Submit
[form_token] => 8e829484c1007e0d7f04d10a388d447f
[form_id] => webform_client_form_1
[submitted_tree] => Array
(
[eingabe_1] => 10
[eingabe_2] => 20
)
)
* $_SERVER is:
Array
(
[REDIRECT_STATUS] => 200
[HTTP_HOST] => localhost
[HTTP_USER_AGENT] => Mozilla/5.0 (Windows; U; Windows NT 5.0; de; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16
[HTTP_ACCEPT] => text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
[HTTP_ACCEPT_LANGUAGE] => de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
[HTTP_ACCEPT_ENCODING] => gzip,deflate
[HTTP_ACCEPT_CHARSET] => ISO-8859-1,utf-8;q=0.7,*;q=0.7
[HTTP_KEEP_ALIVE] => 300
[HTTP_CONNECTION] => keep-alive
[HTTP_REFERER] => http://localhost/drupal1/node/1
[HTTP_COOKIE] => SESSe68a5598f27bdd46df5887bf895e93fb=e3ff67fa7dfe38fb0ce9e585e9bd49d8
[CONTENT_TYPE] => multipart/form-data; boundary=---------------------------124641062825585
[CONTENT_LENGTH] => 992
[PATH] => C:\WINNT\system32;C:\WINNT;C:\WINNT\System32\Wbem;D:\PROGRA~1\DISKEE~1\DISKEE~1\
[SystemRoot] => C:\WINNT
[COMSPEC] => C:\WINNT\system32\cmd.exe
[PATHEXT] => .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
[WINDIR] => C:\WINNT
[SERVER_SIGNATURE] => Apache/2.2.4 (Win32) DAV/2 mod_ssl/2.2.4 OpenSSL/0.9.8d mod_autoindex_color PHP/5.2.1 Server at localhost Port 80
[SERVER_SOFTWARE] => Apache/2.2.4 (Win32) DAV/2 mod_ssl/2.2.4 OpenSSL/0.9.8d mod_autoindex_color PHP/5.2.1
[SERVER_NAME] => localhost
[SERVER_ADDR] => 127.0.0.1
[SERVER_PORT] => 80
[REMOTE_ADDR] => 0.0.0.0
[DOCUMENT_ROOT] => D:/Apache/htdocs
[SERVER_ADMIN] => admin@localhost
[SCRIPT_FILENAME] => D:/Apache/htdocs/drupal1/index.php
[REMOTE_PORT] => 0
[REDIRECT_QUERY_STRING] => q=node/1
[REDIRECT_URL] => /drupal1/node/1
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.1
[REQUEST_METHOD] => POST
[QUERY_STRING] => q=node/1
[REQUEST_URI] => /drupal1/node/1
[SCRIPT_NAME] => /drupal1/index.php
[PHP_SELF] => /drupal1/index.php
[REQUEST_TIME] => 1218792203
[argv] => Array
(
[0] => q=node/1
)
[argc] => 1
)
* $_POST is:
Array
(
[submitted] => Array
(
[eingabe_1] => 10
[eingabe_2] => 20
)
[details] => Array
(
[email_subject] => none
[email_from_name] => none
[email_from_address] => mail@email.cc
)
[form_token] => 8e829484c1007e0d7f04d10a388d447f
[form_id] => webform_client_form_1
[op] => Submit
)
Aber wenn ich dann versuche, so z. B. den Wert von 'eingabe_1' anzuzeigen, kommt nix:
<?php
print($_POST['submitted']['eingabe_1']);
?>
Was mache ich da falsch? Kann mir da jemand helfen?
Übergabe und Berechnung der Formulardaten
am 17.08.2008 - 23:26 Uhr
Wie die eingegebenen Werte in den Weiterleitungs-Node übergeben werden und wie man sie dort Anzeigen bzw. berechnen kann habe ich mittlerweile heausgefunden: http://www.drupalcenter.de/handbuch/12212
Nun offenbart sich aber ein ganz anderes Problem:
Ein "Computed Field" kann in einem View gar nicht angezeigt werden. Nach meinem Kenntnisstand liegt der Grund dafür einfach darin, daß ein View grundlegend eine Datenbank-Abfrage erzeugt, das Computed Field ist aber nicht in der Datenbank gespeichert. Natürlich gibt es dabei die Option, das Computed Filed (oder das Ergebnis) in der Datenbank zu speichern.
Aber wenn ich das richtig sehe, würde ich ja von der Formular-Seite zum View weiterleiten. Dabei wird der Node, in dem das Computed Field ist, aber gar nicht geladen. Also wird die gewünschte Berechnung gar nicht ausgeführt und es würde falls überhaupt, der alte, gespeicherte Wert im View angezeigt.
Hat da jemand eine Idee, wie das zu bewerkstelligen ist ohne Seitenweise Code zu brauchen?
Korrektur
am 31.08.2008 - 01:26 Uhr
Hier eine Korrektur bzw. 'Update' zu meinem vorigen Statement:
Ein "Computed Field" kann in einem View gar nicht angezeigt werden. Nach meinem Kenntnisstand liegt der Grund dafür einfach darin, daß ein View grundlegend eine Datenbank-Abfrage erzeugt, das Computed Field ist aber nicht in der Datenbank gespeichert.