dr.colossos: verschachtelte, voneinander abhaengige Daten updaten

Hi,

ich bin dabei mittels PHP ein Projektstruktur (Projekt->Teilprojekte->Aufgaben) darzustellen, und bearbeitbar zu machen.

Dazu hab ich mein Datenmodell aus der DB in PHP eingelesen, und am Bildschirm wird es mittels HTML-Formularen dargestellt.

Updates an dieser Struktur moechte ich gerne mittels AJAX machen, und Aenderungen sofort zurueck an die Ausgabe schicken.

Ein Beispiel:

Der User setzt ein Aufgabe der bisher den Status "geplant" hatte auf "aktiv". Folglich muessen alle uebergeordneten Vorgaene auch "aktiv" werden, sofern sie es noch nicht sind. Also Event abfangen, mittels AJAX ans PHP-Backend schicken, dort das PHP-Modell updaten, und Aenderungen zurueck schicken und Anzeige updaten.

Nun lassen sich noch dutzende andere Szenarien mit einem sehr aehnlichen Ablauf nennen (Start-/Enddatum updaten, Prioritaeten, etc.) die nicht nur beim aktuellen Vorgang Aenderungen bewirken, sondern sich ueber die ganze Struktur fortpflanzen koennen.

Was ich suche ist nun eine Moeglichkeit, diese Aenderungen "mit zu loggen", dammit ich nachher weiss, wo ich was updaten muss.

Eine Moeglichkeit waere, in jeder setter-Methode eine Zeile hinzuzufuegen, die mitlogged "Member X von Vorgang Y upgedated". Is nicht so fein, da ich wie oben erwaehnt reichlich Faelle/setter abzudecken habe.

Eine andere Moeglichkeit waere eine update-methode zu schreiben, welchen der  Membername und der neue Wert uebergeben wird, so muesste ich nur an dieser Stelle das logging machen.

Im Grunde genommen braeuchte ich ein globales Observer-Objekt, das alle Aenderungen erfasst, aber mir fehlt noch die zuendende Idee wie ich das am besten mache.

Hat jemand eine bessere Idee oder eine Meinung?
Danke

  1. Meine Ideen zum

    * Client:
    Einfach den Ajax-Request mit dem Event rausschicken und als Antwort vom Server eine Liste mit allen Änderungen erhalten, und die Änderungen dann dynamisch übernehmen. Die Datenstruktur beim Client kann dadurch "dumm" gehalten werden und übernimmt nur alles, was vom Server kommt.

    * Server:
    In der Datenstruktur sehe ich eine unnötige Redundanz. Das Projekt könnte die Status-Eigenschaft bei Bedarf ebenso aus den Attributen der untergeordneten Aufgaben berechnen.

    1. Hi,

      ja, beim client bin ich ganz deiner Meinung, der is dumm und hat zu fressen was er kriegt.

      Beim Server geb ich dir nur zum Teil recht.
      Klar, der Vorgang auf hoechster Instanz kann das alles erschliessen, aber deswegen weiss er auch nicht was sich geaendert hat. Aber genau das ist es was mich interessiert.
      Ich will nicht die ganze Anzeige neuladen, sondern nur die Teile, die sich geaendert haben. Nur leider reichen da eben nicht die Aenderungen aus, die der User direkt iniziert hat, sondern auch diejenigen, die indirekt aus der Aenderung hervor gehen.

      Weiters Beispiel. Vorgang A ist Vorgaenger von Vorgang B. Der User "verschiebt" nun Vorgang A zeitlich nach "hinten", wodurch auch Vorgang B nach hinten verschoben werden muss.

      Der User hat nur ein Datum geaendert, aber es kann ggf. ein ganzer Rattenschwanz an Aenderungen folgen, die ich irgendwie registrieren muss ... aber wie ...

      Ein Vorher-Nachher-Vergleich waere auch moeglich, aber bei grossen Vorgaengen zu teuer. Ein weiterer Ansatz waere alle Member, die im Moment einfach primitive Typen sind (string, int etc.) in Objekte zu wrappen (z.B. Klasse "Member"), der eine setter Methode hat.
      Wenn immer ein Member geaendert wird, krieg ich das in der Member-Klasse mit ... aber Wrapper machen das System ja auch nicht gerade schneller ...

      1. Der Server erhält die Änderung, berechnet alle Folge-Änderungen und schickt diese als Liste von Änderungen zurück zum Client, der diese Liste abarbeitet und die Darstellung im jeweiligen HTML-Element anpasst.

        Serverseitig könnte das Überwachen bzw. Protokollieren von Änderungen am Datenmodell durch ein passendes Entwurfsmuster umgesetzt werden, z.B.

        http://de.wikipedia.org/wiki/Stellvertreter_%28Entwurfsmuster%29

        1. http://de.wikipedia.org/wiki/Stellvertreter_%28Entwurfsmuster%29

          Mmmh,

          das entspricht dem was ich unter "eine update-methode" meinte. Sollte "eine einzige" heissen, ueber die alle setter drueberlaufen. Bei mir is es halt im Objekt selber, anstatt noch ein eigenes Objekt davor zu schalten ... letzteres waere wohl vernuenftiger.

          Danke!

          Ich Schau auch mal die Design-Patterns durch ...

          Noch andere Ideen?