2012-05-05 14 views
11

Sto scrivendo un'estensione del comando "Salva", in cui fondamentalmente voglio convalidare determinati campi e presentare un popup che consente all'editor di selezionare una determinata parola chiave o altri valori in base alla data corrente, una Release # e alcuni altri attributi.Ottieni il valore _current_ di un campo in Component Editor? (Tridion 2011 SP1)

Ho pensato che stavo facendo buoni progressi fino a quando ho finalmente capito che $display.getItem() restituisce l'elemento come è memorizzato in CM, non i valori correnti che l'editor potrebbe aver modificato.

Esiste un metodo integrato per ottenere queste informazioni? O devo analizzare il DOM per capirlo?

Questo è il codice ho attualmente

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

Si sta lavorando - ho il valore di "NewField" - ma questo è il valore della voce aveva quando è stato caricato, non l'attuale Valore.

È interessante notare che item.getTitle() mostra il valore corrente del campo Titolo, quindi spero che ci possa essere un modo per ottenere questo anche per i campi personalizzati.

risposta

9

Non so se questo è il modo corretto per farlo, ma è possibile attivare l'evento "collectdata" sull'elemento - che aggiornerà i suoi dati con quello che è stato inserito nella schermata di modifica fino a quel momento.

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

L'approccio di Peter copia i valori dai controlli nell'HTML nell'elemento XML dell'oggetto. Questo è un ottimo approccio se non ti interessa l'elemento in fase di aggiornamento, dal momento che ti permette semplicemente di manipolare l'XML al posto dell'HTML.

Ma se non si desidera che l'elemento sia ancora aggiornato, non si ha altra scelta che trovare il/i controllo/i corretto/i nell'HTML e leggere il valore da lì.

Ho scritto questa piccola funzione di supporto per esso:

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

Con questa funzione in atto si può semplicemente guardare in alto il controllo di un campo dato il suo nome. Quando hai il controllo puoi ottenere facilmente i valori da esso.

Si noti che il mio approccio richiede molto più codice di quello di Peter e tocca alcune API non pubbliche.

+0

Ho notato che FieldBuilder non sembra essere disponibile in XM (UI). C'è qualcosa di simile/così utile OOTB disponibile? –

+0

L'oggetto FieldBuilder crea il modulo per la modifica di un componente in una finestra popup. Dal momento che la nuova interfaccia utente XPM non ha una tale forma, ma ti consente invece di modificare il contenuto nel tuo normale sito web, il FieldBuilder non ha senso in questo contesto. È possibile ottenere informazioni sul campo selezionato da '$ display.getView() ._ getSelectedFieldData()'. –

Problemi correlati