Во-первых, как сказал Стефан в своих комментариях, RichTextItem нигде не найти в XPages. Domino может хранить поля «Rich Text» двумя способами:
- Как классический 'RichTextItem', который обычно использует клиент Notes
- Как Mime/Html, который является совершенно другим форматом, состоящим из Lotus.domino.MimeEntity
Любое поле «RichTextItem», к которому вы обращаетесь/изменяете через XPages и сохраняете, будет преобразовано в Mime. Если вы собираетесь что-то делать с отправкой/обработкой электронной почты, стоит изучить Mime и понять, как все это работает.
Если вы хотите использовать inputRichText со встроенными изображениями, я не думаю, что кто-то сможет предоставить вам пример. Элемент управления inputRichText очень тесно связан с источником данных Domino Document. Решение может быть найдено, но оно будет включать в себя создание вашего собственного типа DataSource, создание DocumentAdapter, создание DocumentAdapterFactory, предоставление его через XspContributor и повторную реализацию многих функций, которые есть в DominoDocument, что само по себе не было тривиальным.
Если вы хотите разрешить только HTML-контент (без встроенных изображений или файлов), вы можете использовать следующее решение в вопросе о переполнении стека, на который ранее был дан ответ. Привязать inputRichText к Bean Этот ответ описывает, как вы можете привязать bean к элемент управления inputRichText с использованием класса MimeMultipart. Я никогда не использовал это решение, поэтому я не могу комментировать его эффективность, однако у него 7 голосов, поэтому оно выглядит хорошо. Вы хотели бы отключить значок панели инструментов редактора для загрузки изображений, чтобы пользователь не думал, что может загружать (потому что они не смогут)
Полагаю, когда вы собираетесь сохранить MimeMultipart в документ, у вас будет 2 варианта.
- Save it as a String
- To save I think you would use the MimeMultipart's getHTML() function to get the HTML as string
- Для загрузки вы можете создать MimeMultipart, используя его статический метод MimeMultipart.fromHTML(yourhtml)
- Save it as a MimeEntity
- To save create a MimeEntity (doc.createMimeEntity()) and on that use setContentFromText(), passing in the getHTML() using a NotesStream see examples in help
- Для загрузки используйте getContentAsText() в сочетании со статическим MimeMultipart.fromHTML(mimeEntity.getContentAsText())
Извините, ни одно из вышеперечисленных не является исчерпывающим, но, по крайней мере, у вас есть некоторые возможности для изучения. Обратите внимание, что вы также должны изучить настройку session.convertMime и то, как она работает — изучение Mime — это весело, не так ли? :)
Альтернатива Альтернативой всему этому является гибридный подход Document DataSource + bean. Привязка источника данных документа к элементу управления inputRichText, а затем привязка компонента к другим элементам управления. Чтобы загрузить данные вашего bean-компонента, вы должны получить доступ к DominoDocument, используя преобразователь переменных. DominoDocument — это класс Java, который является оболочкой для класса lotus.domino.Document. Он делает кучу вещей, таких как отслеживание того, какие поля были изменены и не изменил ли кто-то другой документ с тех пор, как вы его загрузили. Вы можете получить доступ к внутреннему классу, используя функцию DominoDocument getDocument(), но если вы используете этот гибридный подход, не сохраняйте внутренний документ напрямую, всегда сохраняйте его с помощью метода save() DominoDocument.
например если ваш источник данных документа был «document1», сделайте себя частной функцией
private DominoDocument getDominoDocument() {
Object o = ExtLibUtil.resolveVariable(FacesContext.getCurrentInstance(), "document1");
if (o == null) return null;
if (o instanceof DominoDocument) {
return (DominoDocument)o;
} else if (o instanceof DominoDocumentData) {
return ((DominoDocumentData)o).getDocument();
}
}
Затем в какой-то другой функции в вашем bean-компоненте, которую вы можете использовать для загрузки, обратите внимание, что время, когда это вызывается, вероятно, важно (может быть, postOpenDocument?)
public void loadFromDominoDocument() {
DominoDocument ddoc = getDominoDocument();
this.someBeanVar = ddoc.getItemValueString("someBeanVar");
this.anotherBeanVar = ddoc.getItemValueString("anotherBeanVar");
}
и наоборот, у вас будет какая-то другая функция для обновления документа домино со значениями bean.
public void updateDominoDocument() {
DominoDocument ddoc = getDominoDocument();
ddoc.replaceItemValue("someBeanVar",this.someBeanVar);
ddoc.replaceItemValue("anotherBeanVar", this.anotherBeanVar);
}
Примечание. Я еще не делал никаких сохранений, если вы используете эту гибридную модель, обратите внимание, что вы должны делать все сохранения, используя класс «DominoDocument» (либо метод save() в вашем bean-компоненте, либо стандартное действие сохранения документа, которое вызывает метод сохранения()). Это связано с тем, что метод сохранения отслеживает «дату последнего изменения», и если вы сохраняете с использованием базового документа, он будет сохранен один раз нормально, а затем, если вы попытаетесь сохранить с помощью DominoDocument, произойдет сбой, поскольку он будет думать, что Документ был изменен кем-то другим (поскольку дата последнего изменения не соответствует ранее известному значению). К сожалению, ни один из параметров «параллельности» не меняет это поведение.
Вышеупомянутый код является руководством, я написал только из головы, поэтому дайте мне знать, если возникнут какие-либо проблемы с ним, я посмотрю глубже. Уверен, у вас возникнут вопросы! :)
18.05.2015