Получить _current_ значение поля в редакторе компонентов? (Тридион 2011 SP1)

Я пишу расширение для команды «Сохранить», где в основном я хочу проверить определенные поля и представить всплывающее окно, позволяющее редактору выбрать данное ключевое слово или другие значения на основе текущей даты, номера выпуска и некоторых других атрибутов.

Я думал, что делаю хороший прогресс, пока, наконец, не понял, что $display.getItem() возвращает элемент, который хранится в CM, а не текущие значения, которые редактор мог изменить.

Есть ли встроенный метод получения этой информации? Или мне нужно разобрать DOM, чтобы понять это?

Это код, который у меня сейчас есть

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

Это работает - я получаю значение "NewField" - но это значение элемента имелось при загрузке, а не текущее значение.

Интересно, что item.getTitle() показывает текущее значение поля Заголовок, поэтому я надеюсь, что это можно сделать и для настраиваемых полей.


person Nuno Linhares    schedule 05.05.2012    source источник


Ответы (2)


Я не знаю, является ли это правильным способом сделать это, но вы можете запустить событие «collectdata» для элемента, которое обновит его данные с тем, что было введено на экране редактирования до сих пор.

var item = $display.getView().getItem();
item.fireEvent("collectdata");
$log.message(item.getXml());
person Peter Kjaer    schedule 07.05.2012

Подход Питера копирует значения из элементов управления в HTML в XML элемента. Это отличный подход, если вы не возражаете против обновления элемента, поскольку он позволяет вам просто манипулировать XML вместо HTML.

Но если вы пока не хотите, чтобы элемент обновлялся, у вас нет другого выбора, кроме как найти правильный элемент управления в HTML и прочитать оттуда значение.

Я написал для него эту маленькую вспомогательную функцию:

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

С помощью этой функции вы можете просто найти элемент управления для поля по его имени. Когда у вас есть контроль, вы можете легко получить от него значения.

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

Обратите внимание, что мой подход требует гораздо больше кода, чем подход Питера, и затрагивает довольно много непубличных API.

person Frank van Puffelen    schedule 07.05.2012
comment
Я отмечаю, что FieldBuilder не доступен в XM (пользовательский интерфейс). Есть ли что-нибудь подобное/настолько полезное в OOTB? - person Dylan .. Mark Saunders; 19.12.2012
comment
Объект FieldBuilder строит форму для редактирования Компонента во всплывающем окне. Поскольку новый пользовательский интерфейс XPM не имеет такой формы, а вместо этого позволяет редактировать содержимое вашего обычного веб-сайта, FieldBuilder в этом контексте не имеет смысла. Вы можете получить информацию о выбранном поле от $display.getView()._getSelectedFieldData(). - person Frank van Puffelen; 19.12.2012