2012-05-05 13 views
11

Piszę rozszerzenie do polecenia "Zapisz", gdzie zasadniczo chcę sprawdzić poprawność niektórych pól i przedstawić okienko podręczne pozwalające redaktorowi na wybranie danego słowa kluczowego lub innych wartości na podstawie bieżącej daty, wydania # i kilka innych atrybutów.Uzyskaj wartość _current_ pola w Edytorze komponentów? (Tridion 2011 SP1)

Myślałem, że robię duże postępy, dopóki w końcu nie zorientowałem się, że $display.getItem() zwraca przedmiot, ponieważ jest przechowywane w CM, a nie aktualne wartości, które redaktor mógł zmienić.

Czy istnieje wbudowana metoda uzyskania tej informacji? Czy muszę parsować DOM, aby to rozgryźć?

Jest to kod Obecnie mam

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); 
    } 
} 

To działa - pojawia się wartość „NEWFIELD” - ale jest to wartość pozycja miał kiedy został załadowany, a nie prąd wartość.

Co ciekawe, item.getTitle() pokazuje aktualną wartość pola Tytuł, więc mam nadzieję, że może istnieć sposób osiągnięcia tego również w polach niestandardowych.

Odpowiedz

9

Nie wiem, czy to jest właściwy sposób, ale można wystrzelić zdarzenie "collectdata" na przedmiocie - które zaktualizuje dane o tym, co zostało wprowadzone na ekranie edycji do tej pory.

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

Podejście Petera kopiuje wartości z kontrolek w kodzie HTML do pliku XML elementu. Jest to świetne podejście, jeśli nie masz nic przeciwko aktualizacji elementu, ponieważ pozwala on po prostu manipulować XML zamiast HTML.

Ale jeśli nie chcesz, aby element był jeszcze zaktualizowany, nie masz wyboru, ale musisz znaleźć odpowiednie kontrolki w kodzie HTML i odczytać wartość z tego miejsca.

Napisałem tę małą funkcję pomocniczą dla niej:

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); 
    } 
} 

Dzięki tej funkcji w miejscu, można po prostu spojrzeć na sterowanie danym polu jego nazwa. Kiedy masz kontrolę, możesz łatwo uzyskać z niej wartości.

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] 
} 

Zauważ, że moje podejście wymaga więcej kodu niż droga Piotra i dotyka sporo API niepublicznych.

+0

Zauważam, że FieldBuilder nie jest dostępny w XM (UI). Czy istnieje coś podobnego/tak użytecznego, dostępne w OOTB? –

+0

Obiekt FieldBuilder tworzy formularz do edycji komponentu w wyskakującym oknie. Ponieważ nowy interfejs użytkownika XPM nie ma takiej postaci, ale zamiast tego pozwala edytować zawartość w zwykłej witrynie internetowej, FieldBuilder nie ma sensu w tym kontekście. Możesz uzyskać informacje o wybranym polu z '$ display.getView() ._ getSelectedFieldData()'. –

Powiązane problemy