Переопределение содержимого компонента SDL Tridion с помощью обработчиков событий

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

// Call to Subscribe the events
EventSystem.Subscribe<Component, SaveEventArgs>(ComponentSaveInitiatedHandler,
                                                EventPhases.Initiated); 

private void ComponentSaveInitiatedHandler(Component component, 
                                          SaveEventArgs args, EventPhases phases)
{
    if (component.Schema.Title == "XYZ")
    {
        ItemFields Fields = new ItemFields(component.Content, component.Schema);
        SingleLineTextField textField = (SingleLineTextField)Fields["size"];
        textField.Value = "blabla...";
    }
}

person user1528297    schedule 17.07.2012    source источник


Ответы (1)


Вам необходимо обновить свойство Content строкой XML следующим образом:

ItemFields Fields = new ItemFields(component.Content, component.Schema);
SingleLineTextField textField = (SingleLineTextField)Fields["size"];
textField.Value = "blabla...";
component.Content = Fields.ToXml();
person Quirijn    schedule 17.07.2012
comment
причина этого в том, что коллекция ItemFields является так называемой отдельной коллекцией, поэтому внесение изменений в нее не приводит к непосредственному обновлению компонента. - person Bart Koopman; 17.07.2012
comment
В устаревших API вы могли работать с отдельной коллекцией, а затем использовать ее для повторной установки соответствующего свойства коллекции в «родительском» объекте. Это похоже на эквивалентный подход с использованием основного сервиса, верно? - person Dominic Cronin; 18.07.2012
comment
Если вы имеете в виду TOM, я не думаю, что тогда коллекция полей была отделена. Что-то вроде «Component.Fields(heading).Value(1) = Test: Component.Save (True)» будет работать. Ах, золотые дни.. - person Quirijn; 19.07.2012