Startseite
  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche
Startseite › Forum › Drupalcenter.de › Allgemeines zu Drupal ›

In rules einen Update-Befehl auf Datenbank absetzen

Eingetragen von vistree (238)
am 30.11.2009 - 16:12 Uhr in
  • Allgemeines zu Drupal
  • Drupal 6.x

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

‹ [gelöst] Mit eigenem Formular den handelnden Benutzer ermitteln Anmeldung mit IE8 funktioniert nicht - aber nur bei mir ›
  • Anmelden oder Registrieren um Kommentare zu schreiben

Gibt es einen besonderen

Eingetragen von netzkoop (1820)
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?

  • Anmelden oder Registrieren um Kommentare zu schreiben

Ja, z.B. zum einen für die

Eingetragen von vistree (238)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

OK, ich versuche mich

Eingetragen von netzkoop (1820)
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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hallo luzer, das verstehe

Eingetragen von vistree (238)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Machst Du Dir hier nicht

Eingetragen von leda.ch (977)
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"

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hallo leda, danke auch für

Eingetragen von vistree (238)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Den Workflow hoffe ich

Eingetragen von leda.ch (977)
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"

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hallo leda, danke für die

Eingetragen von vistree (238)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Gelöst: ein Nachmittag mit Lektüre hat die Lösung gebracht

Eingetragen von vistree (238)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Nachfrage

Eingetragen von netzkoop (1820)
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?

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hi luzer, ja, für das

Eingetragen von vistree (238)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Also dann komme ich doch

Eingetragen von netzkoop (1820)
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;
?>

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hi luzer, das ist total

Eingetragen von vistree (238)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Aktualisierung: Wenn du das

Eingetragen von netzkoop (1820)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Benutzeranmeldung

  • Registrieren
  • Neues Passwort anfordern

Aktive Forenthemen

  • für drupal11 ein Slider Modul
  • [gelöst] W3CSS Paragraphs Views
  • Drupal 11 neu aufsetzen und Bereiche aus 10 importieren
  • Wie erlaubt man neuen Benutzern auf die Resetseite zugreifen zu dürfen.
  • [gelöst] Anzeigeformat Text mit Bild in einem Artikel, Drupal 11
  • Social Media Buttons um Insteragram erweitern
  • Nach Installation der neuesten D10-Version kein Zugriff auf Website
  • Composer nach Umzug
  • [gelöst] Taxonomie Begriffe zeigt nicht alle Nodes an
  • Drupal 11 + Experience Builder (Canvas) + Layout Builder
  • Welche KI verwendet ihr?
  • Update Manger läst sich nicht Installieren
Weiter

Neue Kommentare

  • melde mich mal wieder, da ich
    vor 1 Woche 2 Tagen
  • Hey danke
    vor 1 Woche 3 Tagen
  • Update: jetzt gibt's ein
    vor 1 Woche 4 Tagen
  • Hallo, im Prinzip habe ich
    vor 2 Wochen 1 Tag
  • Da scheint die Terminologie
    vor 2 Wochen 1 Tag
  • Kannst doch auch alles direkt
    vor 2 Wochen 5 Tagen
  • In der entsprechenden View
    vor 2 Wochen 5 Tagen
  • Dazu müsstest Du vermutlich
    vor 2 Wochen 5 Tagen
  • gelöst
    vor 5 Wochen 2 Tagen
  • Ja natürlich. Dass ist etwas,
    vor 5 Wochen 3 Tagen

Statistik

Beiträge im Forum: 250233
Registrierte User: 20451

Neue User:

  • Mroppoofpaync
  • 4aficiona2
  • AppBuilder

» Alle User anzeigen

User nach Punkten sortiert:
wla9461
stBorchert6003
quiptime4972
Tobias Bähr4019
bv3924
ronald3857
md3717
Thoor3678
Alexander Langer3416
Exterior2903
» User nach Punkten
Zur Zeit sind 0 User und 14 Gäste online.

Hauptmenü

  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche

Quicklinks I

  • Infos
  • Drupal Showcase
  • Installation
  • Update
  • Forum
  • Team
  • Verhaltensregeln

Quicklinks II

  • Drupal Jobs
  • FAQ
  • Drupal-Kochbuch
  • Best Practice - Drupal Sites - Guidelines
  • Drupal How To's

Quicklinks III

  • Tipps & Tricks
  • Drupal Theme System
  • Theme Handbuch
  • Leitfaden zur Entwicklung von Modulen

RSS & Twitter

  • Drupal Planet deutsch
  • RSS Feed News
  • RSS Feed Planet
  • Twitter Drupalcenter
Drupalcenter Team | Impressum & Datenschutz | Kontakt
Angetrieben von Drupal | Drupal is a registered trademark of Dries Buytaert.
Drupal Initiative - Drupal Association