Получить значение поля _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.