У вас может быть GSP, который ведет себя по-разному. Прежде всего, GSP будет отображаться в редактируемом состоянии. В этом состоянии пользователь может выполнять некоторые изменения в некоторых частях GSP. После этого GSP будет отображаться в состоянии предварительного просмотра, где пользователь может проверить изменения, которые он сделал на предыдущем шаге (ничто не может быть отредактировано в этом состоянии). Наконец, GSP будет отображаться как PDF (с использованием плагина Grails Rendering).
Обратите внимание, что пользователь не будет редактировать сам GSP. Вы должны разрешить ему редактировать, например, HTML-элементы в виде текстовых областей. В этом случае мы используем редактор WYSWYG. Этот редактор позволяет пользователю помещать текст как жирный, курсив и т. Д.
Поэтому самым важным шагом этого решения является отличать два состояния в одном и том же GSP. Для этого вы можете использовать логическую переменную (например, редактирование). Эта переменная, если она истинна, отобразит GSP с элементами, которые позволят ему выполнить изменения в документе. Для другой стороны, если переменная редактирования является ложной, GSP будет отображаться только с текстами, не допуская какого-либо редактирования.
Пользователь может установить или снять флажки (чтобы показать или скрыть часть документа) и записать или изменить тексты в элементах текстовых областей.
Ниже я покажу, как это решение работает.
ГСП
ГСП шаблон ГСП и называется _quote.gsp
Часть кода ниже показывает использование переменной редактирования. Обратите внимание, что если edit = true, тогда создается текстовое поле, и пользователь может редактировать текст. Существует стандартный текст, который можно изменить.
Переменная post сохраняет то, что пользователь сделал после этапа редактирования. Мы используем сериализацию JQuery для получения всех параметров и передачи их контроллеру Grails.
<p>
<g:if test="${editing}">
<pgs:textArea html="true" autosize="true" name="fraseInicial" rows="2" cols="80">
${post?.fraseInicial?post.fraseInicial:"Conforme sua solicitação, a empresa tem a satisfação de informar-lhe os métodos e preços."}
</pgs:textArea>
</g:if>
<g:else>
${post.fraseInicial}
</g:else>
</p>
PGS: TEXTAREA является специфическим TagLib этой системы и используется для отображения редактора WYSWYG, вы можете заменить его на простой TextArea HTML элемент.
Пример с флажком:
<g:if test="${editing || post.temPrazoAnalise}">
<h1>
Teste teste
</h1>
<g:if test="${editing}"><g:checkBox name="temPrazoAnalise" value="${!post?true:post?.temPrazoAnalise == null?false:true}"/></g:if>
<g:if test="${editing || post.temPrazoAnalise}">
<p>Teste teste teste </p>
</g:if>
</g:if>
Контроллер
previewQuote() вызывается из вызова AJAX, который сериализует (с помощью JQuery) все параметры ГСП.
Действие назад() позволяет пользователю вернуться в состояние редактирования из состояния предварительного просмотра. Вот почему мы установили session ["paramsReport"] = params внутри previewQuote(). Таким образом можно использовать session ["paramsReport"] внутри back() и восстановить значения, измененные пользователем.
def editQuote() {
def quote = Quote.get(params.id)
render(template: "/quote/report/quote", model: [editing:true, quote:quote])
}
def previewQuote() {
Quote quote = Quote.get(params.id)
session["paramsReport"] = params
render(template: "/quote/report/quote", model: [quote:quote, post:params])
}
def back() {
def quote = Quote.get(params.id)
if (session["paramsReport"]) {
render(template: "/quote/report/quote", model: [editing:true, post:session["paramsReport"], quote:quote])
}
}
def generateQuote() {
Quote quote = Quote.get(params.id)
def f = new File(grailsApplication.mainContext.servletContext.getRealPath("/app/temp/${quote.code}.pdf"))
if (f.exists())
f.delete()
f.withOutputStream { os ->
pdfRenderingService.render([template: '/quote/report/quote', model: [quote:this, post:session["paramsReport"], pdf:true]], os)
}
}
Это решение было разработано Wanderson-Сантоса (https://stackoverflow.com/users/128857/wanderson-santos) и меня.
Надеюсь, вы понимаете общую идею решения. Я понимаю, что это может быть немного сложным при первом взгляде. Во всяком случае, это решение, которое обеспечивает гибкость для такого рода требований (то есть позволяет пользователю настраивать отчет до создания PDF-файла).
Знаете ли вы какой-нибудь HTML-редактор, который прост в использовании для обычного пользователя и может быть интегрирован на какую-нибудь страницу gsp в Grails? – FrancescoDS