2012-05-05 6 views
11

Ich schreibe eine Erweiterung des "Speichern" -Befehls, wo ich im Grunde bestimmte Felder validieren und ein Popup anzeigen möchte, das dem Editor erlaubt, ein bestimmtes Schlüsselwort oder andere Werte basierend auf dem aktuellen Datum, einem Release, auszuwählen # und einige andere Attribute.Erhalten Sie den _current_ Wert eines Feldes im Komponenteneditor? (Tridion 2011 SP1)

Ich dachte, ich mache gute Fortschritte, bis ich endlich herausgefunden habe, dass $display.getItem() das Element zurückgibt, wie in CM gespeichert ist, nicht die aktuellen Werte, die der Editor möglicherweise geändert hat.

Gibt es eine integrierte Methode, um diese Informationen zu erhalten? Oder muss ich das DOM parsen, um es herauszufinden?

Dies ist der Code, den ich zur Zeit

haben
var item = $display.getItem(); 
if (item.getItemType() == "tcm:16") { 
    if (item.getSchema().getStaticTitle() == "Test Schema") { 
     var content = $xml.getNewXmlDocument(item.getContent()); 
     var fieldXml = $xml.getInnerText(content, "//*[local-name()='NewField']"); 
     alert(fieldXml); 
    } 
} 

Es funktioniert - ich den Wert von „NewField“ - aber das ist der Wert, den Punkt hatte, wenn er geladen wurde, nicht die Strom Wert. Interessanter

zeigt item.getTitle() den aktuellen Wert des Titelfeldes, so dass ich hoffe, es kann ein Weg sein, diese auch für benutzerdefinierte Felder zu erreichen.

Antwort

9

Ich weiß nicht, ob dies der richtige Weg ist, aber Sie könnten das "Collectdata" -Ereignis auf dem Objekt auslösen - das wird seine Daten mit dem aktualisieren, was bisher auf dem Bearbeitungsbildschirm eingegeben wurde.

var item = $display.getView().getItem(); 
item.fireEvent("collectdata"); 
$log.message(item.getXml()); 
3

Peters Ansatz kopiert die Werte aus den Steuerelementen im HTML in das XML des Elements. Dies ist ein großartiger Ansatz Wenn Sie nichts dagegen haben, das Element aktualisiert wird, da es Ihnen ermöglicht, einfach die XML anstelle der HTML zu manipulieren.

Aber wenn Sie nicht möchten, dass das Element noch aktualisiert wird, haben Sie keine andere Wahl, als die richtigen Steuerelemente im HTML zu finden und den Wert von dort zu lesen.

schrieb ich diese kleine Hilfsfunktion für sie:

function getControlForFieldName(name) 
{ 
    var fieldBuilder = $display.getView().properties.controls.fieldBuilder; 
    var fieldsContainer = fieldBuilder.properties.input; 
    var fieldsNode = fieldsContainer.getElement(); 
    var fieldContainer = $dom.getFirstElementChild(fieldsNode); 
    while (fieldContainer) 
    { 
     var labelNode = $dom.getFirstElementChild(fieldContainer); 
     var fieldNode = $dom.getNextElementSibling(labelNode); 
     var control = fieldNode.control; 
     if (control.getFieldName() == name) 
     { 
      return control; 
     } 
     fieldContainer = $dom.getNextElementSibling(fieldContainer); 
    } 
} 

Mit dieser Funktion im Ort, den Sie einfach die Steuerung für ein Feld seinen Namen gegeben nachschlagen kann. Wenn Sie das Steuerelement haben, können Sie die Werte davon leicht abrufen.

var fieldControl = getControlForFieldName('Body'); 
if (fieldControl) 
{ 
    var values = fieldControl.getValues(); 
    // values is an array, since it caters for multi-value fields 
    // if this is a single-value field, get the value from values[0] 
} 

Beachten Sie, dass mein Ansatz Art und Weise mehr Code als Peters erfordert und berührt eine ganze Reihe von nicht-öffentlichen APIs.

+0

Ich beachte, dass der FieldBuilder in XM (UI) nicht verfügbar zu sein scheint. Gibt es etwas ähnliches/so nützliches verfügbares OOTB? –

+0

Das FieldBuilder-Objekt erstellt das Formular zum Bearbeiten einer Komponente in einem Popup-Fenster. Da die neue XPM-Benutzeroberfläche keine solche Form hat, Sie aber stattdessen den Inhalt Ihrer regulären Website bearbeiten können, ist der FieldBuilder in diesem Kontext nicht sinnvoll. Sie können Informationen über das ausgewählte Feld von '$ display.getView() ._ getSelectedFieldData()' erhalten. –

Verwandte Themen