2012-05-05 9 views
11

Escribo una extensión del comando "Guardar", donde básicamente quiero validar ciertos campos y presentar una ventana emergente que permite al editor seleccionar una palabra clave determinada u otros valores basados ​​en la fecha actual, una Versión # y algunos otros atributos.¿Obtiene el valor de _current_ de un campo en el Editor de componentes? (Tridion 2011 SP1)

Pensé que estaba haciendo un buen progreso hasta que finalmente descubrí que $display.getItem() devuelve el artículo tal como está almacenado en CM, no los valores actuales que el editor puede haber cambiado.

¿Existe un método incorporado para obtener esta información? ¿O necesito analizar el DOM para resolverlo?

Este es el código actualmente tengo

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

Se está trabajando - consigo el valor de "NewField" -, pero este es el valor del elemento tenía cuando estaba cargada, no la corriente valor.

Curiosamente, item.getTitle() muestra el valor actual del campo Título, así que espero que haya una forma de lograr esto para los campos personalizados también.

Respuesta

9

No sé si esta es la manera correcta de hacerlo, pero podría disparar el evento "collectdata" en el elemento, que actualizará sus datos con lo que se ha ingresado en la pantalla de edición hasta el momento.

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

El enfoque de Peter copia los valores de los controles en el HTML en el XML del artículo. Este es un gran enfoque si no le importa que el elemento se actualice, ya que le permite simplemente manipular el XML en lugar del HTML.

Pero si no desea que el elemento se actualice aún, no tiene más remedio que encontrar los controles correctos en el HTML y leer el valor desde allí.

que redactó esta función auxiliar pequeño para ella:

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 esta función en su lugar sólo tiene que buscar el control para un campo dado su nombre. Cuando tienes el control, puedes obtener los valores fácilmente.

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

Tenga en cuenta que mi enfoque requiere mucho más código que Peter y toca bastantes API no públicas.

+0

Noto que el FieldBuilder no parece estar disponible en XM (UI). ¿Hay algo similar/tan útil disponible OOTB? –

+0

El objeto FieldBuilder crea el formulario para editar un Componente en una ventana emergente. Dado que la nueva interfaz de usuario de XPM no tiene dicha forma, pero en su lugar le permite editar el contenido en su sitio web habitual, FieldBuilder no tiene sentido en este contexto. Puede obtener información sobre el campo seleccionado de '$ display.getView() ._ getSelectedFieldData()'. –

Cuestiones relacionadas