Получить значение поля _current_ в редакторе компонентов? (Tridion 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() показывает текущее значение поля Title, поэтому я надеюсь, что для пользовательских полей может быть и способ.

Ответ 1

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

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

Ответ 2

Питер подходит, копирует значения из элементов управления в 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.