Sicherstellen, dass meine erweiterten Listen immer "aktuelle" Daten anzeigen?

8

Wenn Sie einen Data Extender für eine CME-Liste erstellen, z. B. um eine Spalte für das Schema hinzuzufügen, wie in dieses Beispiel - es funktioniert alles gut und schön, wenn Sie Aktionen ausführen, die ein Neuladen der Liste erzwingen.

Einige Aktionen erzwingen jedoch kein Neuladen der Liste (wie das Bearbeiten einer Komponente in einem Ordner, dann Speichern und Schließen) und es sieht so aus, als ob Anguilla die Daten für das Element lädt, das sich mit einem anderen Mechanismus geändert hat die Daten für den betreffenden Artikel (was Sinn macht).

Wenn ich möchte, dass meine erweiterte Listenansicht ordnungsgemäß funktioniert und auch meine zusätzlichen Attribute immer dann geladen werden, wenn sich ein bestimmtes Element ändert (und nicht nur, wenn die Listenansicht neu geladen wird), was muss ich noch tun?

    
Nuno Linhares 03.04.2012, 14:27
quelle

4 Antworten

13

Ich habe herausgefunden, wie Anguilla sich darum kümmert. Wenn Sie einen Data Extender implementieren, erweitern Sie die Informationen zu den in der Liste angezeigten Elementen, was bedeutet, dass Sie die Daten (Modell) hinter dem betreffenden Element erweitern.

Jedes Item in Tridion hat seine eigene Klasse im Anguilla Framework, zum Beispiel hat eine Komponente ihre eigene Tridion.ContentManager.Component Javascript "Klasse".

Nachdem wir dies gesagt haben und zu dem Beispiel zurückkehren, das den Schemanamen der Komponente zeigt, erweitern wir das Modell nicht wirklich, da diese Information bereits in der Komponente verfügbar ist. Wir müssen jedoch die Methoden überschreiben, die für die Anzeige von Informationen in den Listen, in denen sich das Element befindet, verwendet werden, in diesem Fall eine Komponente.

Wenn wir also mit einem Data Extender arbeiten, müssen wir nicht nur die Datenerweiterung definieren, wenn wir eine vollständige Implementierung dieser Funktionalität wünschen:

%Vor%

Aber wir müssen auch definieren, welche Spalte wir hinzufügen:

%Vor%

Sobald wir dies haben, zeigt die GUI die Spalte an, die wir gerade hinzugefügt haben: "Zusätzliche Informationen"

Nun, jetzt müssen wir die Aktualisierung der Liste erreichen, wenn das Objekt bearbeitet / ausgecheckt wird und in, etc ...

Dafür müssen wir das Modell erweitern und ein paar Methoden in dem Objekt implementieren, das wir erweitern. In diesem Beispiel erweitere ich das Page-Objekt. Wenn also eine Seite bearbeitet wird, wird die Zeile in der Liste, die aktualisiert werden soll, zusammen mit den restlichen Zellen in der Tabelle aktualisiert.

Um das Modell zu erweitern, müssen wir definieren, welche Typen wir erweitern, in diesem Beispiel werde ich die Klasse "Page" als Beispiel verwenden. Zuerst müssen Sie die Modellerweiterung in der Konfigurationsdatei Ihres Editors definieren:

%Vor%

und

%Vor%

Wie Sie sehen können, erweitere ich die Seite mit der Klasse "Com.Tridion.PS.Extensions.UI.PSPage", die in der Javascript-Datei "/Scripts/PSPage.js" definiert ist.

Die einzige Methode, die die Zeilenaktualisierung behandelt, ist die folgende:

%Vor%

Wie Sie sehen, implementiere ich das Attribut "ExtendedInfo", das in meiner zusätzlichen Spalte angezeigt wird.

Beim Hinzufügen einer Spalte zu unseren Listen gibt es mehr als nur das Hinzufügen eines Daten-Extenders. Ich werde einen Beitrag in meinen Blog hier schreiben ein voll funktionierendes Beispiel.

Ich hoffe, es macht Sinn.

    
Jaime Santos Alcón 05.04.2012, 14:15
quelle
6

Nun, Jaime hat korrekt beschrieben, wie CME geänderte Einträge in Listen aktualisiert. Aber ich möchte hinzufügen, einige zusätzliche Informationen darüber, wie List-Steuerelemente, Domänenmodell Liste und Elemente miteinander interagieren. Dies könnte Ihnen beim Aufbau Ihrer eigenen Erweiterung mit ähnlichen Funktionen helfen.

Die meisten Listenelemente des Domänenmodells erben von Tridion.ContentManager.ListTcmItems class. In dem Moment, wenn ein Listenelement, basierend auf der erwähnten Klasse, geladen wird, wird es in der Listenregistrierung registriert (und nicht registriert, wenn die Liste entladen wird). Dadurch kann Model registrierte Listen als Quelle statischer Daten für Elemente verwenden und geänderte Elementdaten in diesen Listen aktualisieren.

Element statische Daten aktualisieren

Zum Beispiel haben wir ListCategories geladen und es gibt nur eine Kategorie in der Liste:

%Vor%

Das getXml() gibt ein XML wie (vereinfacht) zurück:

%Vor%

Wenn Sie danach versuchen, statische Daten für die Kategorie "Keys" zu erhalten, ist diese bereits festgelegt:

%Vor%

Das ist möglich, weil $models.getItem call zwei Dinge tut: Es wird ein existierendes (oder ein neues) Domänenmodellobjekt zurückgeben und die Methode $models.updateItemData aufrufen. Dieser Methodenaufruf durchläuft alle registrierten Listen in der Listenregistrierung und für alle Listen, deren TimeStamp, der größer ist als der Zeitstempel des letzten Updates von Item, list.updateItemData mit dem Modellobjekt aufruft.

Die Methode updateItemData überprüft, ob das übergebene Element in der Liste enthalten ist. Ist dies der Fall, wird das Element mit den statischen Daten aktualisiert, die in der Liste verfügbar sind.

Aktualisieren von Daten geänderter Elemente in der Liste

Wenn ein Domänenmodellelement geändert wird (aktualisiert, entfernt, neu erstellt), wird eine dieser Methoden aufgerufen:

  • $models.itemUpdated
  • $models.itemRemoved

Diese Methoden durchlaufen die Lists in Lists Registry und rufen list.itemUpdated (oder list.itemRemoved ) auf. Diese Methoden überprüfen, ob sie übergeben wurden. Item ist in ihrer Liste enthalten, und wenn dies der Fall ist, werden sie die List-XML aus den Item-Daten aktualisieren.

Zu diesem Zweck gibt es eine Methode getListItemXmlNode in der Klasse Tridion.ContentManager.Item . Diese Methode erstellt den List xml-Knoten basierend auf dem Array von Attributen, die von der Methode getListItemXmlAttributes für das Element bereitgestellt werden. Das hat Jaime in seiner Antwort erwähnt.

Wenn das Listen-XML aktualisiert wurde, wird eines dieser Ereignisse für das Listenobjekt ausgelöst:

  • itemadd
  • itemupdate
  • itemremove

Wenn Sie diese Ereignisse auf einem List -Objekt in Ihrer Ansicht abhören, können Sie Ihr List-Control zeitnah aktualisieren.

Wenn Sie möchten, dass dieser Mechanismus mit Ihrer Erweiterung funktioniert, halten Sie sich an diese Regeln:

  • Wenn Sie ein neues Listenobjekt des Domänenmodells erstellen, sollte es die Klasse Tridion.ContentManager.ListTcmItems erben oder die Methoden getId() , itemUpdated(item) , itemsUpdated(item) , itemRemoved(item) und updateItemData(item)
  • implementieren
  • Wenn Sie Änderungen im List-Steuerelement sehen möchten - hängen Sie Handler an entsprechende Ereignisse im Listenobjekt des Domänenmodells an und aktualisieren Sie Ihr List-Steuerelement
  • Wenn Sie ein neues Domänenmodellelement erstellen, sollte es die Klasse Tridion.ContentManager.Item erben und Sie sollten die Methode getListItemXmlAttributes verbessern, um das korrekte Array von Attributen für die Liste
  • zurückzugeben
Boris Ponomarenko 11.04.2012 11:33
quelle
2

Der CME wird tatsächlich die Elemente in der Liste nach dem Speichern dynamisch aktualisieren, ohne zum Server zu gehen.

Dazu ruft es eine Methode mit dem Namen "getListItemXml" auf, die das XML-Aktualisierungselement für die Liste zurückgibt. Anschließend wird dieses Element aktualisiert oder hinzugefügt, wodurch das Element in der Listenansicht aktualisiert oder hinzugefügt wird.

getListItemXml ist eine Methode der verschiedenen Model-Objekte.

Wie nutzen Sie das aus? Ich bin mir nicht sicher.

Vielleicht könnten Sie die Methode (oder vielleicht getListItemXmlAttributes) mit Ihren eigenen überschreiben, um die zusätzlichen Daten hinzuzufügen?

Es wird auch ein "itemupdate" -Event ausgelöst, wenn ein Element in der Liste aktualisiert wird. Sie können sich darauf einlassen, indem Sie Folgendes tun:

%Vor%

Ich nehme an, Sie könnten damit den Listeneintrag für den Artikel nachträglich aktualisieren. Stellen Sie sicher, dass Sie removeEventHandler auch irgendwann aufrufen.

Nichts davon ist offensichtlich optimal. Aber ich kenne keinen Erweiterungspunkt, der dieses spezielle Problem lösen könnte.

    
Peter Kjaer 04.04.2012 08:31
quelle
0

Ich denke, ich würde (versuchen) dies zu implementieren, indem ich die Elemente in einem Ordner regelmäßig überwache und diese Liste aktualisiere, nachdem dieser Abfragemechanismus eine Änderung in diesem Ordner entdeckt hat.

Zum Beispiel würde ich ein Javascript Timeout oder ein Intervall schreiben, das im Hintergrund läuft und die Elemente im aktuellen Ordner überprüft. Wenn es eine Änderung feststellt, löst es die Aktualisierung der Liste aus.

Alternativ können Sie auch versuchen, die Aktion, die Ihre Liste geändert hat (z. B. die Erstellung eines neuen Elements), möglicherweise mithilfe eines Ereignissystems abzufangen und Ihre Liste entsprechend zu aktualisieren. Ich denke nicht, dass dies viel anders ist als der erste Ansatz, da ich denke, dass es immer noch ein gewisses Maß an Polling von der GUI-Seite impliziert.

    
Mihai Cădariu 03.04.2012 15:59
quelle

Tags und Links