In rules einen Update-Befehl auf Datenbank absetzen
![](http://www.drupalcenter.de/files/noavatar_mini.gif)
am 30.11.2009 - 16:12 Uhr in
Hallo ihr,
ich bräuchte mal eure Hilfe bei einem für mich größeren Problem:
Ich habe in Drupal 2 Inhaltstypen:
Projekt mit Nummer, Beschreibung und Status (aktiv, in Planung, abgeschlossen) und
Task (mit Nummer, Ref. zum Projekt, Beschreibung und auch Status (wie oben).
Den Status im Task kann man bei der Eingabe nicht selber setzen - der wird über Prepopulate automatisch eingetragen. Das funktioniert also schon mal super.
Jetzt habe ich aber das Problem, dass sich der Projektstatus ja ändern kann (von in Planung z.B. auf aktiv) --> und diese Änderung soll dann automatisch auf die zugehörigen Tasks übertragen werden.
Ich dachte, dass ich das mit Rules und einem benutzerdefinierten PHP-code lösen könnte. Bei mir scheitert es jetzt aber an der korrekten Umsetzung des PHP-codes. Mein bisheriger Versuch sieht folgendermaßen aus:
<?php
$var_status = [node:field_status-raw]; //dies ist der Status nach dem Speichern im Projekt
$var_projektid = [node:nid]; // dies ist die Projektnummer, ueber die Projekt und Tasks verbunden sind
$sql = "
SELECT n.nid
FROM {node} AS n
INNER JOIN {content_field_projektbezug} AS c ON n.nid = c.vid // Innerjoin korrekt ueber n.nid und c.vid?
INNER JOIN (content_typ_tasks} AS d ON n.nid = d.vid // geht der Join auf mehrere Tabellen, da Textfeld hier contenttyp?
WHERE c.field_anfragebezug_nid = $var_projektid
";
$result = db_query($sql);
// Wie pruefe ich nun hier, ob $result > 0 ist, also Werte enthaelt? Dann 'break'
// Wenn groesser 0, dann eine foreach-Schleife durch $result und dabei den Status (feld field_ueberwachungbezug_value) auf $var_status setzen
while ($record = db_fetch_array($result)) {
?>
Tja, und da verlassen sie mich. Habe den bisherigen Code aus einer alten Anfrage - aber wie ich jezt hier korrekt weiter mache, weiß ich einfach nicht ...
Könnt ihr mir weiterhelfen? Ist der Ansatz so überhaupt sinnvoll - oder würdet ihr das anders machen?
Viele Grüße und Dank
- Anmelden oder Registrieren um Kommentare zu schreiben
Gibt es einen besonderen
am 30.11.2009 - 18:57 Uhr
Gibt es einen besonderen Grund, dass du den Status nicht beim Projekt lässt sondern doppelt einträgst?
Ja, z.B. zum einen für die
am 30.11.2009 - 20:35 Uhr
Ja, z.B. zum einen für die direkte Übersicht in den Tasks, wie der Stand des Projektes ist.
Außerdem - noch viel wichtiger - für Filterfunktionen.
Wenn ein Projekt abgeschlossen ist, dann sind auch die Tasks abgeschlossen - und sollen aus der Liste der aktiven Tasks ausgeblendet werden können.
Viele Grüße und nen schönen Abend
OK, ich versuche mich
am 01.12.2009 - 11:01 Uhr
OK, ich versuche mich verständlicher auszudrücken :-)
Deine Tasks haben eine Referenz zum Projekt, richtig? Warum können sie dann nicht auch eine Referenz zum Projektstatus haben statt einen eigenen Status, den du entsprechend ändern musst.
Hallo luzer, das verstehe
am 01.12.2009 - 11:25 Uhr
Hallo luzer,
das verstehe ich jetzt nicht genau.
Also, ich habe in meinen Tasks ein cck-Feld vom Typ nodereference. Hier wähle ich beim Anlegen des Task das zugehörige Projekt aus (nodereference liefert mir eine Liste). Diese Verbindung ist starr und wird, wie gesagt, beim Anlegen des Task definiert.
Beim ersten Speichern des Task hole ich mir dann über das Modul Rules auch den aktuellen Status aus dem gerade referenzierten Projekt und trage ihn in das während des Editierens verborgene Feld Status des Task ein.
Das funktioniert soweit prima. Wie aber soll ich eine "dynamische" Referenz auf den Status des übergeordneten Projets setzen? Geht das?
Viele Grüße
Machst Du Dir hier nicht
am 01.12.2009 - 11:38 Uhr
Machst Du Dir hier nicht vielzuviel Aufwand...?
Meiner Meinung nach besteht hier doch ein Unterschied zwischen dem Projekt-Status und dem Task-Status: die beiden haben NICHTS miteinander zu tun.
Aber: Wenn Du in Deiner Übersicht Tasks aus abgeschlossenen Projekten nicht mehr sehen willst, dann musst Du nach dem Projekt-Status filtern, und nicht nach dem Task-status
Ein offenes, wie auch ein abgeschlossenes Projekt kann doch offene und abgeschlossene Tasks enthalten. Über VIEWS kann man Filter auf beide Stati setzen.
lg leda
***************************************************
"Du liebst es, Du brauchst es oder Du gibst es weg"
Hallo leda, danke auch für
am 01.12.2009 - 11:50 Uhr
Hallo leda, danke auch für deine Rückmeldung.
Das Beispiel ist nur eines von vielen, wo ich diese Funktion bräuchte - so z.B. auch zur Anpassung von Zuständigkeiten (userreference), was dann auch gleich noch Auswirkungen auf die Sichtbarkeit per permissions hat.
Aber noch mal zu dem konkreten Beispiel:
Natürlich hat jeder Task auch einen eigenen Status. Es wird hier so sein, dass der Projektstatus im Task später ausgeblendet wird.
Es ist aber laut Workflow hier nicht erlaubt, dass ein abgeschlossenes Projekt noch offene Tasks hat - deshalb auch der Übertrag zur Sichtbarmachung.
Abgeschlossene Projekte und die damit verbundenen Tasks sollen in einem separatem View (so eine Art Archiv) "verschoben" werden. Dafür brauche ich den Projektstatus in beiden Inhaltstypen.
Viele Grüße
Kai
Den Workflow hoffe ich
am 01.12.2009 - 12:01 Uhr
Den Workflow hoffe ich verstanden zu haben. Aber wenn Du den Tasks den Status des Projekts verpasst, verlierst Du doch die Information, welche Tasks noch nicht abgeschlossen waren.
Lauten denn die Fragestellungen nicht z.B.:
1. Zeige alle Projekte, worin sich noch nicht abgeschlossene Tasks befinden (=View)
2. Zeige alle Tasks, welche sich noch nicht abgeschlossen sind, das Projekt aber schon (=View)
3. Setze den Status aller abgeschlossenen Projekte mit erledigten Tasks auf "Archiv", ev. auch die zugehörigen Tasks (=Cron-Job)
Mit dem von Dir angetönten Automatismus kannst Du darauf warten, dass der erste, der ein Projekt versehentlich abschliesst, kommt, und erwartet, dass auch die (richtigen) Tasks sich wieder "öffnen".
Aber vielleicht habe ich ja tatsächlich Deine Absicht nicht verstanden...
lg leda
***************************************************
"Du liebst es, Du brauchst es oder Du gibst es weg"
Hallo leda, danke für die
am 01.12.2009 - 12:55 Uhr
Hallo leda,
danke für die erneute Rückmeldung.
Wie ich schon geschrieben habe, handelt es sich bei dem Projektstatus nur um ein Beispiel von vielen, für die ich verstehen können muss, wie ich ein Update direkt in der Datenbank ausführe.
Egal was ich nun mit dem Projektstatus im Task mache - ich muss einfach wissen, wie ich diesen vom Projekt übertragen bekomme.
Wir haben hier z.B. auch noch den Fall, dass zwischen verschiedenen Content-Typen (die aber nicht von allen gleichzeitig eingesehen werden dürfen!!) z.B. eine Kunden-Serviceeinstufung dargestellt werden muss.
Ändert ein Hauptverantwortlicher z.B. den Servicestatus von "gering" auf VIP, so muss das in alle vernüpften Inhalte übertragen werden. Da z.B. Mitarbeit X aber nicht das Hauptformular einsehen kann, sondern nur z.B. ein Ticket, muss hier unbedingt der Servicestatus eingeblendet werden ....
Oder, ich ändere im Projekt den zuständigen Mitarbeiter (userreference) und damit die Sichtbarkeit und Editierbarkeit des Projekts, dann muss auch bei den relevanten Tasks der zuständige Mitarbeiter geändert werden. Über nodereference ist nämlich geregelt, dass nur der Autor und der Mitarbeit aus dem userreference-Feld die Inhalte auch sehen und bearbeiten darf.
Wahrscheinlich war es nicht so geschickt, das Posting nur auf das eine Beispiel zu begrenzen, aber ich hoffe, das ich nun den Grund für das genannte Vorgehen besser beschrieben habe.
Viele Grüße
Gelöst: ein Nachmittag mit Lektüre hat die Lösung gebracht
am 01.12.2009 - 19:30 Uhr
Hallo,
ich habe nun schließlich doch noch die Lösung für mein Problem gefunden. Prinzipiell ist es recht einfach, wenn man weiß wie es geht ;-)
<?php
$var_status = '[node:field_status-raw]';
$var_projektid = [node:nid];
$result = db_query("UPDATE {content_type_task} AS n
INNER JOIN {content_field_projektbezug} AS c ON n.vid = c.vid
SET n.field_status_value = '%s'
WHERE c.field_projektbezug_nid = %d
", $var_status, $var_projektid);
return $result;
?>
Das ganze habe ich so im Modul Rules verwendet - und auf diese Weise kann ich nun ganz simple Datenbankupdates durchführen.
Die Variablen am Anfang fülle ich aus dem gerade gespeicherten, übergeordneten Projekt.
Die genannten Tabellen entstehen in dem untergeordneten Inhaltstyp Tasks durch die Verwendung von CCK.
Danke noch mal an alle bezüglich der Rückmeldungen und einen schönen Abend
Nachfrage
am 02.12.2009 - 00:51 Uhr
Jetzt würde mich doch noch aus Neugierde interessieren:
Sind die Werte in Task-Status immer = denen in Projekt-Status oder können sie unterschiedlich sein?
Hi luzer, ja, für das
am 03.12.2009 - 00:06 Uhr
Hi luzer,
ja, für das betroffene Feld: die sind im Projekt und im Task immer gleich!
Viele Grüße
Also dann komme ich doch
am 03.12.2009 - 12:37 Uhr
Also dann komme ich doch nochmal auf meinen ersten Ansatz zurück, falls du wie geschrieben noch andere Bsp dieser Art hast.
Wenn der Status immer gleich ist und der Task über Nodereference mit dem Projekt verknüpft, dann macht es für mich keinen Sinn die Information doppelt in die DB zu schreiben.
Ich würde mir den Status gleich aus dem Projekt anzeigen lassen.
Ungefähr so:
<?php
$projekt_nid = $task_node->field_noderef[0][nid];
$projekt_node = node_load($projekt_nid);
$status = $projekt_node->field_status;
?>
Hi luzer, das ist total
am 04.12.2009 - 21:01 Uhr
Hi luzer,
das ist total cool. Viel eleganter als mein Ansatz. Ich hatte deinen diesbezüglichen Post wohl doch nicht verstanden.
Sag mal, wie performant ist das beim Anzeigen des Task? Merkt man da einen spürbaren Unterschied zur direkten Speicherung in dem node?
Und, wie wird das aktualisiert? Bei der Ansicht des task? Oder nur beim Speichern des task? Oder ist das dann in einem View auch direkt abrufbar?
Viele Grüße und ein schönes Wochenende
Aktualisierung: Wenn du das
am 05.12.2009 - 14:51 Uhr
Aktualisierung: Wenn du das z.B. in eine node-task.tpl.php schreibst, dann immer bei der Ansicht des Task.
Performance Unterschied kann ich mir nicht vorstellen. Die Informationen sind auch bei direkter Speicherung im Node über mehrere Tabellen verteilt.
Direkt im View kannst du das z.B. über Beziehungen darstellen. Hab ich selbst noch nicht ausprobiert aber eigentlich sind über die Nodereference alle Informationen aus dem Projekt vorhanden.
Oder in einem view.tpl.php