Computed Field - Summe aus Feldern von referenzierter Node berechnen

am 07.10.2012 - 18:46 Uhr in
Hallo,
ich bin gerade dabei, etwas für unsere Verbandsseite einzurichten, komme aber aufgrund meiner eher bescheidenen php Kenntnisse nicht weiter. Die Seite läuft unter Drupal 6.
Nun zu meinem Problem:
Unsere Mitgliedsvereine sollen sogenannte Startkarten für ihre Sportler bestellen können. Dafür gibt es zwei Contenttypen „Startkarte“ und „Sportler“. Für die Sportler gibt es zwei Gebührenkategorien, welche vom Alter abhängig sind. Hierfür habe ich unter dem Content „Sportler“ ein Computed Field angelegt, welches auf Grundlage des Geburtstages die Preiskategorie errechnet (Alter <= 23 => 5 Euro, sonst 10 Euro Lizenzgebühr).
Der Contenttyp „Startkarten“ enthält ein Beitragsreferenzfeld (unbegrenzte Einträge möglich), welcher auf die Sportler verweist. Es können also alle Sportler, für die eine Startkarte benötigt wird ausgewählt werden.
Jetzt möchte ich ein Computed Field bei „Startkarten“ anlegen, welches mir die Summe der Lizenzgebühren der ausgewählten Sportler ausrechnet. Allerdings habe ich trotz intensiver Recherche keine Ahnung, wie ich das hinbekommen kann.
Ich hoffe, ich konnte mein Problem einigermaßen verständlich rüber bringen…
Kann mir jemand helfen?
Vielen Dank schon einmal!
Viele Grüße
- Anmelden oder Registrieren um Kommentare zu schreiben
Wie meinst du das?Ein Verein
am 07.10.2012 - 20:56 Uhr
Wie meinst du das?
Ein Verein erstellt einen Node vom Typ "Startkarte" ... bei der Noderstellung wählt er über das Ref-Feld die "Sportler" aus. Wann sollen denn die Preise angezeigt werden? Nachdem der Node "Startkarte" gespeichert wurde oder schon vorm Speichern?
Ja genau!
am 07.10.2012 - 21:20 Uhr
So ist der Ablauf. Der Gesamtpreis soll nach dem Speichern in das Feld geschrieben werden. Ich habe geplant dieses Feld dann per Mail über Rules an den Ersteller zu schicken - also quasi eine Bestätigung inkl. der per Vorkasse zu zählenden Gebühren.
Du kannst mit Hilfe von
am 07.10.2012 - 21:38 Uhr
Du kannst mit Hilfe von node_load($nid); (und den NIDs aus dem Ref-Feld) die einzelnen Ref-Nodes laden, die entsprechende Gebühren-Felder abfragen und einfach per PHP summieren (im Computed Field).
Danke, jetzt habe ich einen
am 08.10.2012 - 08:21 Uhr
Danke, jetzt habe ich einen Ansatzpunkt. Mal sehen wie weit ich komme...
Eine Frage aber noch vorab - wäre es da nicht eigentlich auch sinnvoller, wenn ich das Computed Field aus Sportler (zur Berechnung der Beitragsklassen) entferne und diese Berechnung mit im Content Startkarte durchführen lasse? Eigentlich würde da doch ein Computed Field in Startkarte ausreichen mit dem Code, der erst die Beitragsklassen aus dem jeweiligen Geburtsdatum der ausgewählten Sportler ausrechnet und diese dann summiert. Kann man das in einem Feld machen oder habe ich da einen Denkfehler?
Vielen Dank!
Vielleicht kann mir ja jemand
am 09.10.2012 - 12:08 Uhr
Vielleicht kann mir ja jemand weiterhelfen - ich habe jetzt ein wenig rum probiert aber komme auf Grund meiner bescheidenen Kenntnisse nicht weiter...
Bis jetzt habe ich folgenden Code:
$node_field[0]['value'] = db_result(db_query("SELECT SUM(field_testwert_value) FROM content_type_test"));
Der Content-Typ Test ist dabei mein Sportler und das Feld Testwert enthält die Gebühr. Das Computed Field ist in meinem Content-Typ Startkarte angelegt, welcher das Referenzfeld auf den Sportler (Content-Typ Test) enthält. Die Feldeinträge des Referenzfeldes sind dabei, wie gesagt, unbegrenzt.
Das Computed Field rechnet jetzt logischerweise die Gebühren aller angelegten Sportler zusammen. Soweit so gut - nur leider habe ich keine Ahnung, wie ich die Berechnung nur für die in der Node ausgewählten Sportler hin bekommen. Ich muss gestehen, dafür bin ich irgendwie zu doof und werde auch aus den Anleitungen nicht schlau.
Vielen Dank für eure Hilfe!
frank82
am 10.10.2012 - 00:34 Uhr
$node_field[0]['value'] = db_result(db_query("SELECT SUM(field_testwert_value) FROM content_type_test"));
nach FROM content_type_test würde sich dann eine WHERE-Klausel anbieten, mit der du die Tabelle so filterst, dass nur die Sportler beim Summieren berücksichtigt werden, die du haben willst.
Wie man so eine WHERE-Klausel syntaktisch richtig formuliert, dazu findest du z.B. bei MySQL haufenweise Anleitungen.
Gruß
Berthold
Hallo Berthold, danke, für
am 10.10.2012 - 11:26 Uhr
Hallo Berthold,
danke, für den Tipp.
Ich habe jetzt mal den Code angepasst, stehe aber jetzt vor dem nächsten Problem (den Testcontent habe ich jetzt mal raus geschmissen und den echten Content hinterlegt - also Felder im Code sind entsp. angepasst).
$node_field[0]['value'] = db_result(db_query("SELECT SUM(field_lizenzgeb_value) FROM content_type_sportler WHERE nid=%d",$node->field_sportler_sl[0][nid]));
Jetzt ist mein Problem, dass das Feld "field_sportler_sl[0]" immer die Lizenzgebühr aus der ersten Referenz ausliest. Wie bekomme ich es denn hin, dass hier alle ausgewählten Enträge ausgelesen werden. Ich bekomme das leider nicht hin! Oder ist der Ansatz komplett falsch? Würde mich freuen, wenn noch jemand einen Tipp für mich hätte!
Danke schonmal!!!
also die WHERE Klausel sieht
am 10.10.2012 - 12:16 Uhr
also die WHERE Klausel sieht schon irgendwie merkwürdig aus, was hat da denn das Komma drin verloren und nach dem Komma steht nur ein Wert und keine Relation.
Hier kannst du dir mal WHERE Klauseln anschauen :-)
Es gibt aber auch jede Menge deutsche Seiten, die sich mit SQL beschäftigen.
Gruß
Berthold
Danke! Ich werde mir den Link
am 10.10.2012 - 12:29 Uhr
Danke! Ich werde mir den Link mal anschauen! Ich probiere da jetzt schon ewig dran rum:( Ist eben blöd, wenn einem da die kompletten Grundlagen fehlen...
Viele Grüße
Frank
Kannst Du das nicht ebenso
am 10.10.2012 - 12:40 Uhr
Kannst Du das nicht ebenso mittels Views und Views-Aggregation (zu finden unter Extras) erreichen? Da gibt es die Möglichkeit über bestimmte Felder im View zu summieren. Dann mußt Du das nicht selbst codieren.
Beste Grüße
Werner
Hallo Werner, ja das wäre
am 10.10.2012 - 12:49 Uhr
Hallo Werner,
ja das wäre theoretisch möglich, würde mir aber meiner Ansicht nach nichts nutzen, da der Besteller eine Mail per Rules erhalten soll, in der dann der zu zahlende Betrag drin steht. Aber das dürfte ja nur gehen, wenn der Wert in die DB geschrieben wird oder sehe ich das falsch?
Gruß Frank
Dann füge ein computed field
am 10.10.2012 - 12:57 Uhr
Dann füge ein computed field ein, in dem Du den View über views_embed_view aufrufst und damit speicherst.
Beste Grüße
Werner
Das klingt ja ganz gut, bloß
am 10.10.2012 - 13:08 Uhr
Das klingt ja ganz gut, bloß muss ich da mal schauen, wie ich den view am besten filtere - der Nutzer kann ja beliebig oft bestellen und die view dürfte dann ja bloß die letzte Bestellung anzeigen und das entsprechende Feld übernehmen... Muss ich wirklich mal probieren, der Ansatz klingt auf jeden Fall vielversprechend!
Habe nochmal gelesen und
am 10.10.2012 - 13:43 Uhr
Habe nochmal gelesen und scheinbar rechnet views_calc nicht mit referenzierten Feldern.
Du solltest ja auch die
am 10.10.2012 - 14:59 Uhr
Du solltest ja auch die Aggregation nehmen, die arbeitet mit den Ergebnissen.
Beste Grüße
Werner
Hallo Werner, ich habe das
am 12.10.2012 - 08:30 Uhr
Hallo Werner,
ich habe das jetzt mal mit views und dem Computed Field versucht. Die Berechnung in Views klappt auch und ich kann die ganze View im Computed Field einbinden. Jetzt bräuchte ich aber noch einen Tipp, wie ich nur das Ergebnisfeld der View mit dem Computed Field ansprechen und in der DB speichern kann.
Vielen Dank!
Gruß Frank