Как мне перехватить событие Save в редакторе страниц Sitecore?

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

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

ПРИМЕЧАНИЕ. Я хочу, чтобы это было INLINE редактирование в редакторе страниц. Кажется, что это очень простая функция, отсутствующая в Sitecore. Я мог бы, конечно, увидеть, используя запись флажка также для поля флажка (Что за сумасшедшее понятие?!?!). Единственными встроенными опциями для редактирования являются текстовое поле или редактор RichText. Я что-то упускаю из виду?

3 ответа

Решение

Хорошо... после некоторой помощи от поддержки Sitecore, я наконец получил ответ на этот вопрос. Чтобы редактор страниц мог получать новые значения для полей, необходимо вызвать функцию javascript Sitecore.WebEdit.setFieldValue(). Это создает скрытое поле ввода, которое затем читает PageEditor при нажатии кнопки "Сохранить" или "Сохранить / закрыть".

//RenderItem is the item in question, DropListField is the string name of
//the target Droplist field we want rendered
string itemID = RenderItem.ID.ToShortID().ToString();
string fieldID = RenderItem.Fields[DropListField].ID.ToShortID().ToString();
string language = RenderItem.Language.ToString();
string version = RenderItem.Version.ToString();
string revision = RenderItem[FieldIDs.Revision].Replace("-", string.Empty);

ddlList.Attributes.Add("onchange", string.Format("var ddl = getElementById('{5}');var itemURI = new Sitecore.ItemUri('{0}','{1}','{2}','{3}');Sitecore.WebEdit.setFieldValue(itemURI,'{4}',ddl.options[ddl.selectedIndex].value);",itemID,language,version,revision,fieldID,ddlList.ClientID));

Итак, в основном мы просто добавляем обработчик onchange на стороне клиента для DropDownList, который вызывает эту функцию Sitecore js. Примечание: я считаю, что это требует Sitecore 6.2.

Вы также можете использовать редактор полей, чтобы вызвать всплывающее окно для редактирования необходимой информации. Скажем, например, вы делаете:

<sc:EditFrame runat="server" Buttons="MyThing">
<!-- any html, or other controls -->
</sc:EditFrame>

Поэтому, когда кто-то в режиме PageEditor (Edit) наводит курсор мыши на HTML, который вы поместили в EditFrame, он получит всплывающее меню. В этом меню вы можете отобразить любое количество команд, обычно это будет опция "Редактировать", которая затем открывает диалоговое окно, где вы можете редактировать любые поля, которые вы хотите, из любого элемента контента в дереве.

Как вы настраиваете доступные опции? Через свойство Buttons он должен указывать на папку в основной базе данных в папке /sitecore/content/Applications/WebEdit/Edit Frame Buttons (см. Пример по умолчанию). Там же вы можете указать, какие поля редактировать. В приведенном выше фрагменте Sitecore ожидает найти папку с именем MyThing.

Откуда он знает, из какого элемента редактировать поля? Если вы ничего не указали, это будет Context.Item, если вам нужно что-то еще, используйте свойство источника данных элемента управления editFrame и установите для него, например, некоторый идентификатор.

Когда мне нужно создать пользовательский элемент управления, я использую его в обычном режиме, а затем просто использую sc:Text (или что-то еще), пока пользователь находится в режиме редактирования. Таким образом, я получаю все добро Sitecore без хлопот. Один из способов сделать это - использовать Multiview, который выглядит примерно так:

<MultiView>
  <View id=NormalView>
    <MyAwesomeCustomControl />
  </View>
  <View id=EditView>
    <sc:Text />
  </View>
</MultiView>

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

Другие вопросы по тегам