Wie wird das Sperren von Inhalten in benutzerdefinierten Komponenten behandelt?

7

Der com_content des Standardkerns verfügt über ein integriertes System, das beim Bearbeiten eines bestimmten Artikels durch einen Benutzer "gesperrt" wird, sodass kein anderer Benutzer ihn gleichzeitig bearbeiten kann. Wenn der Benutzer das Fenster schließt oder die Sitzung ablaufen lässt, ohne den Artikel ordnungsgemäß zu schließen (z. B. durch Klicken auf "Speichern" oder "Abbrechen"), wird dieser Inhalt "überprüft" und im Backend daneben wird ein Schlosssymbol angezeigt. was ein Superadmin freischalten muss.

Meine Frage ist : Wie wird das zu einer benutzerdefinierten Komponente hinzugefügt, die über eigene Inhaltstabellen verfügt? Soweit ich feststellen konnte, scheint es mir, dass, solange Sie JTable zum Bearbeiten dieses Inhalts verwenden, dies eine integrierte Funktion für Methoden in dieser Klasse ist ... ist das richtig? Oder muss ich etwas anderes wie JTableContent verwenden? Muss ich den Tabellen, in denen Inhalte gespeichert werden, etwas hinzufügen (bestimmte Spalten)?

Isidro Baquero
quelle

Antworten:

3

Sie haben Recht, müssen aber nicht nach unten gehen JTable, wenn Sie dem Joomla-Weg folgen und JControllerFormals Grundlage für Ihren Ansichts-Controller verwenden, z

class MycomponentControllerMycontent extends JControllerForm {}

und auf JModelAdminder Grundlage Ihrer Komponenten Modell z

class MycomponentModelMycontent extends JModelAdmin {}

Durch Erweitern erhalten JControllerFormSie eine integrierte edit()Methode, mit der Sie Ihr Modell und Ihre Tabelle für Sie einrichten und den Zugriff auf den betreffenden Datensatz sowie die Unterstützung von Checkouts durch die Tabelle überprüfen können (indem überprüft wird, ob eine Spalte checked_outvorhanden ist). Wenn dies der Fall ist, wird versucht, checkout()die Aufzeichnung über das Modell durchzuführen.

Durch die Erweiterung JModelAdmin erben Sie es getItem(), checkIn()und checkOut()Methoden. Wie bereits erwähnt, ruft das Modell auf checkout()(von dem es erbtJModelForm ) und stellt sicher, dass in checked_outIhrer Tabelle neben der Spalte auch eine aufgerufen wird checked_out_time.

Zu diesem Zeitpunkt passiert eines von zwei Dingen, wenn eine dieser Spalten nicht vorhanden ist, JModelFormfälscht sie und kehrt zurück true(zeigt an, dass die Arbeit erledigt ist). Andernfalls werden die aktuellen Benutzer erfasst und anschließend versucht, zunächst zu überprüfen, ob sie bereits für einen anderen Benutzer ausgecheckt wurden. Zu diesem Zeitpunkt wird endlich die JTableImplementierung von checkOut()aufgerufen (wenn Sie sie nicht mit Ihrer eigenen Tabellendefinition überschrieben haben, die in J3 normalerweise nicht erforderlich ist).

JTableführt genau die gleichen Spaltenprüfungen durch, und wenn alles in Ordnung ist (dh eine gültige ID hat), werden die Spalten checked_outund checked_out_timeder zu bearbeitende Datensatz aktualisiert .

Als Randnotiz: Wenn edit()ein Element getItem()aufgerufen wird, wird der Datensatz über a geladenJTable (dh es wird ein getTable()gefolgt von ausgeführt) load($pk). (An diesem Punkt werden JTableauch Ihre Ereignisse onBeforeLoad und onAfterLoad für Plugins ausgelöst, was sehr hilfreich ist.)

Der Datensatz wird an Ihre Version von zurückgegeben JModelAdmin, die ihn in ein Basisobjekt konvertiert stdClass(es war früher ein JObjectfrüheres Objekt ). Wenn der Datensatz (jetzt Objekt) eine paramsSpalte / ein Attribut enthält, konvertiert er diese für einen JRegistryeinfachen Zugriff in ein Objekt.

Auf Joomla-Weise erhalten Sie viele kostenlose Dinge kostenlos. :) :)

Craig
quelle
Woha! Vielen Dank cppl! Das war eine sehr detaillierte und klare Antwort, nur der Ausgangspunkt, den ich brauchte, um zu wissen, dass ich auf festem Boden stehe. Sehr geschätzt!
Isidro Baquero
2

Sie haben Recht mit Ihren Annahmen. Sie müssen die Tabelle mit der zugehörigen Logik einrichten, um das zu erreichen, was Sie versuchen.

Während ich Joomla 3+ lerne, habe ich Component Creator verwendet , um eine extrem einfache Komponente mit einer einzigen Tabelle und nur der Joomla-Funktion zu erstellen , die ich lernen möchte . Der generierte Code ist sehr gut und ohne die Komplexität der üblichen installierten Komponenten leicht zu befolgen.

BIP
quelle
Danke für die schnelle Antwort. Ich fand dies für Joomla 1.5, nicht sicher, ob es sich für 3.3 zu stark geändert hat ... docs.joomla.org/J1.5:Using_the_JTable_class#Checkout.2FCheckin Und übrigens verwende ich auch CC :)
Isidro Baquero
Das scheint ungefähr dasselbe zu sein, also würde ich damit rennen. Es ist eines dieser Dinge, die "einfach funktionieren", daher bin ich mit den Feinheiten nicht vertraut.
BIP