it-swarm.com.de

Wie wird das Sperren von Inhalten in benutzerdefinierten Komponenten gehandhabt?

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 ein Schlosssymbol im Backend daneben 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 verwenden, um diesen Inhalt zu manipulieren, 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 (bestimmte Spalten), etwas hinzufügen?

7
Isidro Baquero

Sie sind korrekt, müssen jedoch nicht zu JTable wechseln, wenn Sie dem Joomla-Weg folgen und JControllerForm als Basis für Ihren View-Controller verwenden, z.

class MycomponentControllerMycontent extends JControllerForm {}

und Verwenden von JModelAdmin als Basis für Ihre Komponenten Model, z.

class MycomponentModelMycontent extends JModelAdmin {}

Durch das Erweitern von JControllerForm erhalten Sie eine integrierte edit() - Methode, mit der Sie Ihr Modell und Ihre Tabelle einrichten können. Außerdem wird der Zugriff auf den betreffenden Datensatz überprüft und überprüft, ob die Tabelle Auscheckvorgänge unterstützt (von) überprüfen, ob eine Spalte checked_out existiert). In diesem Fall wird versucht, den Datensatz über das Modell zu checkout().

Durch die Erweiterung von JModelAdmin erben Sie die Methoden getItem(), checkIn() und checkOut(). Wie bereits erwähnt, ruft das Modell checkout() ( auf, das es von JModelForm) erbt, und stellt sicher, dass zusätzlich zu In der Spalte checked_out in Ihrer Tabelle befindet sich auch eine Spalte mit dem Namen checked_out_time.

Zu diesem Zeitpunkt passiert eines von zwei Dingen, wenn eine dieser Spalten nicht existiert: JModelForm fälscht sie und gibt true zurück (zeigt an, dass die Arbeit erledigt ist). Andernfalls werden die aktuellen Benutzer abgerufen, und es wird zunächst geprüft, ob der Checkout bereits an einen anderen Benutzer ausgecheckt wurde. An dieser Stelle ruft if finally die JTable -Implementierung von checkOut() auf (falls Sie sie nicht mit Ihrer eigenen Tabellendefinition überschrieben haben, die in J3 normalerweise nicht erforderlich ist).

JTable führt genau die gleichen Spaltenprüfungen durch. Wenn alles in Ordnung ist (d. h. eine gültige ID hat), werden die Spalten checked_out und checked_out_time für den bearbeiteten Datensatz aktualisiert.

Als Randnotiz: Wenn Sie edit() ein Item, getItem() aufrufen, lädt es den Datensatz über ein JTable (dh es führt eine getTable() gefolgt von load($pk). (An diesem Punkt löst JTable auch Ihr onBeforeLoad und onAfterLoad aus Ereignisse für Plugins

Der Datensatz wird an Ihre Version von JModelAdmin zurückgegeben, die ihn in ein Basisobjekt stdClass konvertiert (früher war es ein JObject). Wenn der Datensatz (now-Objekt) eine Spalte/ein Attribut params enthält, konvertiert er dies in ein JRegistry -Objekt für den einfachen Zugriff.

Auf diese Weise erhalten Sie viele nützliche Dinge kostenlos über Joomla. :)

3
Craig

Sie sind in Ihren Annahmen richtig. Sie müssen die Tabelle mit der zugehörigen Logik einrichten, um das zu erreichen, was Sie tun möchten.

Während ich Joomla 3+ lerne, benutze ich Component Creator , 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 kann ohne die Komplexität der üblichen Komponenten leicht nachvollzogen werden.

2
GDP