a4j:command button: backing bean property not updated in modalpanel
cazfr Dec 29, 2010 2:39 AMHi,
I have a page with rich:datatable, with on each row a button to edit current row. The idea is that when user click, a modalpopup appears to let user change values and ercord them in backing bean. Everything works fine when I post from a simple panel, but when i put the code in a modal panel, the backing bean properties are not updated.
Can someone help ?
Here's the page
<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:a4j="http://richfaces.org/a4j" xmlns:rich="http://richfaces.org/rich" xmlns:f="http://java.sun.com/jsf/core" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:c="http://java.sun.com/jsp/jstl/core"> <style> .active-row { background-color: #FFEBDA; } </style> <script type="text/javascript"> var row; </script> <rich:message/> <rich:panel id="tablePanel"> <h:form> <rich:dataTable value="#{MainBean.users}" onRowMouseOver="this.style.backgroundColor='#B5CEFD'" onRowMouseOut="this.style.backgroundColor='#{org.richfaces.SKIN.tableBackgroundColor}'" onRowClick="this.style.backgroundColor='#F1F1F1'" var="user" rows="20" rowKeyVar="row" id="table" > <f:facet name="header"> <h:outputText value="Utilisateurs" /> </f:facet> <rich:column> <f:facet name="header"> <h:outputText value="login" /> </f:facet> <h:outputText value="#{user.email}" id="login" /> </rich:column> <rich:column> <f:facet name="header"> <h:outputText value="Prénom" /> </f:facet> <h:outputText value="#{user.firstname}" id="firstname" /> </rich:column> <rich:column> <f:facet name="header"> <h:outputText value="Nom" /> </f:facet> <h:outputText value="#{user.lastname}" id="lastname" /> </rich:column> <rich:column> <f:facet name="header"> <h:outputText value="Admin." /> </f:facet> <h:outputText value="#{user.admin}" id="admin"/> </rich:column> <rich:column> <f:facet name="header"> Actions </f:facet> <a4j:commandLink id="editlink" ajaxSingle="true" action="#{MainBean.setEditMode}" oncomplete="#{rich:component('editCreateUser')}.show()" reRender="editCreateUserForm" > <h:graphicImage style="border:0;" url="/images/icons/edit.gif" /> </a4j:commandLink> <rich:toolTip for="editlink" value="Edit" /> </rich:column> <f:facet name="footer"> <rich:datascroller renderIfSinglePage="false" maxPages="5" /> </f:facet> </rich:dataTable> </h:form> <a4j:commandButton id="newbtn" reRender="editCreateUserForm" value="Nouveau" ajaxSingle="true" oncomplete="#{rich:component('editCreateUser')}.show()" action="#{MainBean.setInsertMode}" style="width:85px" /> </rich:panel> <rich:modalPanel id="editCreateUser"> <f:facet name="header">Informations générales</f:facet> <a4j:form id="editCreateUserForm" > <a4j:region> <h:panelGrid columns="2" width="350" > <h:outputText value="Login" /> <h:inputText value="#{MainBean.selectedUser.email}" disabled="#{MainBean.editMode}"/> <h:outputText value="Prénom" /> <h:inputText value="#{MainBean.selectedUser.firstname}" /> <h:outputText value="Nom" /> <h:inputText value="#{MainBean.selectedUser.lastname}" /> <h:outputText value="Admin" /> <h:selectBooleanCheckbox value="#{MainBean.selectedUser.admin}" /> </h:panelGrid> <h:panelGrid id="crud_panel" columns="3"> <a4j:commandButton id="validbtn" disabled="#{MainBean.editMode}" ajaxSingle="true" reRender="tablePanel,editCreateUserForm" value="Créer" actionListener="#{MainBean.storeUser}" style="width:85px"/> <a4j:commandButton id="editbtn" disabled="#{!MainBean.editMode}" ajaxSingle="true" reRender="tablePanel,editCreateUserForm,editbtn" value="Modifier" actionListener="#{MainBean.editUser}" style="width:85px"/> <rich:componentControl for="editCreateUser" attachTo="validbtn,editbtn" operation="hide" event="onclick"/> </h:panelGrid> </a4j:region> </a4j:form> </rich:modalPanel> </ui:composition>
And the backing bean:
@ManagedBean(name="MainBean") @SessionScoped public class MainBean { private User currentUser; private boolean init; //private List<User> users; @ManagedProperty(value="#{userService}") private UserService service; private User selectedUser; private DataModel<User> userDataModel; private boolean editMode; public User getCurrentUser() { return currentUser; } public void setCurrentUser(User currentUser) { this.currentUser = currentUser; } public UserService getService() { return service; } public void setService(UserService service) { this.service = service; } public User getSelectedUser() { return selectedUser; } public void setSelectedUser(User selectedUser) { this.selectedUser = selectedUser; } public DataModel<User> getDataModel() { return userDataModel; } public void setDataModel(DataModel<User> dataModel) { this.userDataModel = dataModel; } public boolean getEditMode() { return editMode; } public void setEditMode() { this.selectedUser = (User) userDataModel.getRowData(); editMode = true; } public MainBean() { HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true); currentUser = (User) session.getAttribute("currentUser"); setInsertMode(); init = false; } private void updateDataModel() { userDataModel = new ListDataModel<User>(); List<User> users = service.getUserDao().getAll(); userDataModel.setWrappedData(users); } public DataModel<User> getUsers() { if (!init) { updateDataModel(); init = true; } return userDataModel; } public void editUser() { service.updateUser(selectedUser); } public void storeUser() { service.createUser( selectedUser.getEmail(), selectedUser.getPassword(), selectedUser.getFirstname(), selectedUser.getLastname(), selectedUser.isAdmin() ); updateDataModel(); } public void setInsertMode(){ this.selectedUser = new User(); editMode = false; } }
Thanks !