heinetz: Änderungen verfolgen im CMS

Hallo Forum,

ich habe ein kleines handmade-CMS für einen Kunden entwickelt. Das ganze sieht so aus, dass der über einen RT-Editor(TinyMCE) pflegbare Content der Unterseiten in einer MySQL-Tabelle (content_offline) gespeichert und aus der beim Aufruf der Seiten gelesen wird. Eine Unterseite stellt einen Datensatz dar, im Feld
site_content steht der HTML-Content des Datensatzes/der Unterseite. Damit der editierte Content nach dem MySQL-Update nicht sofort online ist, gibt es neben der MySQL-Tabelle content_offline eine weitere (content_online), die dieselbe Struktur hat. Das CMS liesst also den Content aus der Tabelle content_offline, stellt ihn im RTE dar und beim Speichern wird der Content in content_offline upgedatet. Im die Änderungen dann zu veröffentlichen, wird der Datensatz aus content_offline nach content_online kopiert denn das Frontend stellt den Inhalt aus content_online dar.

So funktioniert's im Prinzip.

Jetzt möchte ich ein "Änderungen verfolgen"-Feature einbauen, stehe ganz am Anfang meiner Planung und würde mich über Anregungen freuen, wie ich das am besten realisiere oder Hinweise darauf ob es fertige Lösungen gibt, auf die man hier zurückgreifen kann.

beste gruesse,
heinetz

  1. Hello,

    Jetzt möchte ich ein "Änderungen verfolgen"-Feature einbauen, stehe ganz am Anfang meiner Planung und würde mich über Anregungen freuen, wie ich das am besten realisiere oder Hinweise darauf ob es fertige Lösungen gibt, auf die man hier zurückgreifen kann.

    Einfache Lösung: Speichere einfach alle Queries in einer eigenen Tabelle.
    Oder: aktiviere das Logging Deines DMBS. Bei MySQL gibt es ein Binary Log.

    Beides führt allerdings zu erheblicher Steigerung der Datenmenge

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
  2. Moin!

    Jetzt möchte ich ein "Änderungen verfolgen"-Feature einbauen, stehe ganz am Anfang meiner Planung und würde mich über Anregungen freuen, wie ich das am besten realisiere oder Hinweise darauf ob es fertige Lösungen gibt, auf die man hier zurückgreifen kann.

    Je nach Datenmenge kannst Du:

    Ausgehend vom Urzustand eines Artikels alle späteren Versionen durch eine Diff-Funktion jagen und dazu neben der Linux/Unix-Version von diff unter vielem anderen auch diese Lösung (Siehe Link von EisFux) benutzen. Zumindest im ersten Fall kannst Du die Unterschiede von Version zu Version speichern und spätere Versionen durch ein wiederholtes patchen herstellen.

    Eine weitere Möglichkeit ist es, ein CVS wie z.B. Git  zu benutzen. Das erfordert aber zusätzlichen Lernaufwand.

    Ist Dir das zu viel Rechenarbeit oder zu viel Programmieraufwand, dann vergib in Deiner Tabelle content_offline zusätzlich eine Versionsnummer (oder speichere gleich den möglichst genauen Zeitpunkt des Speicherns).

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix

  3. Hi,

    erstmal danke für eure Tipps aber ich habe das Gefühl, nochmal genauer meine Situation beschreiben zu müssen.

    Ich habe in zwei MySQL-Tabellen 'content_offline' und 'content_online' die selbe Struktur:

    content_online:
    ---------------
    id |                                        content|
    ----------------------------------------------------
     1 |        <div>blablub<div><br>text text text    |
    ----------------------------------------------------

    content_offline:
    ----------------
    id |                                        content|
    ----------------------------------------------------
     1 |        textneu textne                         |
    ----------------------------------------------------

    Der Wert des Feldes 'content' in der Tabelle 'content_offline' ist immer der geänderte, der mit dem Wert des gleichen Datensatzes in der Tabelle 'content_online' verglichen werden soll. Nachdem der Vergleich stattgefunden hat, wird der Datensatz in der Tabelle 'content_online' mit dem aus der Tabelle 'content_offline' überschrieben. Nun ist der Vergleich nicht mehr möglich aber auch nicht relevant. Im Grunde müssen nur zwei
    Strings verglichen werden. Was in 'content_offline' vorhanden ist und in 'content_online' nicht ist demnach hinzugefügt. Was in 'content_offline' nicht vorhanden ist aber in 'content_online' schon ist also gelöscht worden. Die Ausgabe von 'content_offline' soll entsprechend markiert werden a lá:

    "text <span class="added">textneu</span> <span class="deleted">textalt</span>

    Die Fnktionalitäten, die in irgendwelchen Wikis für diese Aufgabe genutzt werden sind sicher gut. Die Frage, die ich mir stelle ist ob es sinnvoller ist für diese Aufgabenstellung etwas selbst zu entwickeln - wie man das ambesten macht, weiss ich noch nicht - oder ob ich versuchen soll aus den
    vorgeschlagenen fertigen Lösungen die Funktionalität extrahieren soll, die ich benötige.

    beste gruesse,
    heinetz

    1. Hello,

      die "Vermeidung von Divergenz in reduntanten Datenbeständen" erfordert eine Strategie. Die einfachste ist, jedem Datenbestand eine Änderungshistorie zu verpassen.

      Geändert werden darf aber immer nur in einer der Bestandskopien. Wenn alle auf demseleben Stand sind, ist es aber egal, an welcher man die Änderungen durchführt.

      Alle anderen Bestandskopien müssen dann beim nächsetn Abgleich nachfgeführt werden. Dafür muss die Tabelle mit den Historiedatensätzen, also diejenige, die die vollständigen DML-Queries enthält, auf alle anderen Datenbestände angewendet werden. Wenn wieder alle denselben Stand haben, kann wieder ein Kandidat für die nächten Änderungen ausgewürfelt werden.

      Die Führung der DML-Historie führt auch zu einer beliebigen Replay-Chance für jeden Zeitpunkt ab dem AUfsetzpunkt der Tabelle. Sowas macht man z.B. in Buchhaltungssystemen, wenn man Szenarien nachstellen oder Trends ermitteln muss.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de