Grails commands databinding alternativa 7
<!DOCTYPE html>
<html>
<head>
<meta name="layout" content="adminlte">
<t:assetsLabelText/>
<t:assetsOnOff/>
</head>
<body>
%{--BodyHeader--}%
<header id="Header" class="page-head">
<content tag="3">active</content>
<content tag="3.1">active</content>
<h2 class="page-title">
${message(code: 'preferences.bodyheader.title')}
</h2>
<t:breadcrumbs
data="${['Configuración': createLink(action: 'preferences'), 'Preferencias': createLink(action: 'preferences')]}"/>
<div class="page-bar toolbarBox">
<g:if test="${!layout_nosecondarymenu}">
<div class="btn-toolbar">
<ul id="toolbar-nav" class="nav nav-pills pull-right collapse navbar-collapse">
</ul>
</div>
</g:if>
</div>
</header>
<g:formRemote name="form-preferences" url="[action: 'updatePreferences']" update="form-preferences-body"
class="form-horizontal" role="form">
<div class="box box-primary">
<div class="box-header with-border">
<h3 class="box-title">Preferencias</h3>
</div>
<div class="box-body" id="form-preferences-body">
<g:render template="form_preferences" model="[preferences: preferences]"/>
</div>
<div class="box-footer">
%{--Actualizar--}%
<g:actionSubmit value="enviar" action="updatePreferences"></g:actionSubmit>
</div>
</div>
</g:formRemote>
</body>
</html>
<g:hasErrors bean="${preferences}">
<div class="alert alert-danger">
<g:renderErrors bean="${preferences}" as="list"/>
</div>
</g:hasErrors>
<t:notHasErrors bean="${preferences}">
<t:alert type="success" title="Correcto" text="Se actualizó correctamente el panel!!!"/>
</t:notHasErrors>
<g:hiddenField name="membresia.id" value="${preferences.membresia.id}"/>
%{-- Idioma --}%
<div class="form-group ${hasErrors(bean: preferences, field: 'idioma', 'has-error')} has-feedback">
<label for="idioma.id" class="control-label col-lg-3">
<t:labelText required="true" label="Idioma de preferencia" tooltip="idioma.tooltip" error="${hasErrors(bean: preferences, field: 'idioma', 'true')}"/>
</label>
<div class="col-lg-4 ">
<g:select name="idioma.id" from="${us.incorpora.sigrem.Lenguaje.list()}" optionKey="id"
noSelection="[null:message(code: 'idioma.notselected.label')]"
optionValue="nombre" value="${preferences?.idioma?.id}" />
</div>
</div>
class SocioController {
def preferences() {
def membresia = GrailsUtils.currentUser.membresia
PanelPreferences preferences = new PanelPreferences(membresia: membresia, idioma: membresia.idioma)
render view: "preferences", model: [preferences: preferences]
}
def updatePreferences(PanelPreferences preferences) {
if (preferences.hasErrors()) {
render template: "/socio/form_preferences", model: [preferences: preferences]
return
}
socioService.savePreferences(preferences)
render template: "/socio/form_preferences", model: [preferences: preferences]
}
}
@Validateable
class PanelPreferences {
Membresia membresia
Lenguaje idioma
static constraints = {
idioma nullable: false
}
}
Una alternativa que aún no se ha explorado, es programar los paneles con ajax para evitar que se pierdan los datos de cada panel y así hacer menos complicado el proceso.
Incluso esta alternativa podría ser la solución a paneles modales con tabs:
TODO: alternativa incompleta