1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Como editar e adicionar registros sem duplicar o formulário no primefaces

Fala Pessoal,

Estou iniciando no primefaces e gostaria de obter uma ajuda... Estou montando uma tela que possui basicamente um datatable para exibir os dados com três botões(novo, editar, excluir) e um único form dentro de um dialog que abre quando clico em algum dos três botões...

Segue o código:

categoria.xhtml

<ui:composition
    template="/WEB-INF/template/template.xhtml"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">



    <ui:define name="titulo">Categoria - Sistema de Vendas</ui:define>

    <ui:define name="tituloTela"><h:outputText value="#{msg['categoria.titulo']}" /></ui:define>

    <ui:define name="conteudo">

        <p:growl id="messages" showSummary="true" showDetail="true" autoUpdate="false" life="3000" /> 
        <!-- ================================= BOTÕES =================================-->

        <h:form id="frmButton" prependId="false">

            <p:commandButton id="btnNovo" actionListener="#{categoriaMB.novo}" oncomplete="PF('dlgSalvar').show()"
                 value="Nova Categoria" icon="icon-add" update="pgSalvar" process="@this" >
                 <p:resetInput target="pgSalvar" />
            </p:commandButton>

            <p:commandButton id="btnEditar" actionListener="#{categoriaMB.editar}" oncomplete="PF('dlgSalvar').show()" 
                value="Editar Categoria" icon="icon-edit" disabled="#{categoriaMB.categoriaSelecionada == null}" />

            <p:commandButton id="btnExcluir" actionListener="#{categoriaMB.novo}" update="messages" value="Excluir Categoria" 
                icon="icon-delete" disabled="#{categoriaMB.categoriaSelecionada == null}">
                   <p:confirm header="Exclusão" message="Deseja realmente excluir esse registro ?" icon="ui-icon-alert" />
            </p:commandButton>

            <p:confirmDialog global="true" showEffect="fade" hideEffect="explode" style="margin: 0 auto;" >
                <div class="alinhar-centro">
                    <p:commandButton value="Sim" type="button" styleClass="ui-confirmdialog-yes" icon="ui-icon-check" />
                    <p:commandButton value="Não" type="button" styleClass="ui-confirmdialog-no"  icon="ui-icon-close" />
                </div>
            </p:confirmDialog>

        </h:form>

        <!-- ================================= FORMULÁRIO DE GRAVAÇÃO =================================-->


        <p:dialog header="Nova Categoria" widgetVar="dlgSalvar" id="dlgSalvar" resizable="false" modal="true" 
            draggable="true" position="center" closable="false">

            <h:form id="frmSalvar" prependId="false">
                <p:messages id="message2" autoUpdate="true" closable="true" />

                <h:panelGrid id="pgSalvar" columns="2" cellspacing="8" styleClass="form-align">

                    <p:outputLabel value="#{msg['global.nome']}:" for="categoria_nome" />
                    <p:inputText value="#{categoriaMB.categoria.nome}" style="width: 180px" id="categoria_nome" 
                        label="Nome" />

                    <p:outputLabel value="#{msg['global.descricao']}:" for="categoria_descricao" />
                    <p:inputText value="#{categoriaMB.categoria.descricao}" style="width: 350px" id="categoria_descricao" 
                        label="Descrição"  />

                </h:panelGrid>

                <p:separator />

                <div class="alinhar-direita">
                    <p:commandButton value="#{msg['form.botao.salvar']}" icon="icon-disk" actionListener="#{categoriaMB.salvar}"  
                         id="btnSalvar" update="frmSalvar, dataTable" 
                        oncomplete="if (!args.validationFailed) PF('dlgSalvar').hide()" />

                    <p:commandButton value="Cancelar" onclick="PF('dlgSalvar').hide()" icon="icon-cancel" id="btnCancelar" 
                        type="button" />
                </div>
            </h:form>

        </p:dialog>

        <!-- ================================= LISTAGEM =================================-->
        <h:form prependId="false">
            <p:dataTable id="dataTable" var="u" value="#{categoriaMB.categorias}" widgetVar="dataTable"
                emptyMessage="#{msg['datatable.norecord']}" paginator="#{msg['datatable.paginator']}" 
                rows="#{msg['datatable.rows']}" paginatorPosition="#{msg['datatable.paginatorPosition']}" 
                paginatorTemplate="#{msg['datatable.paginatorTemplate']}" 
                currentPageReportTemplate="#{msg['datatable.currentPageReportTemplate']}" 
                rowsPerPageTemplate="#{msg['datatable.rowsPerPageTemplate']}" lazy="true"  
                selection="#{categoriaMB.categoriaSelecionada}" selectionMode="#{msg['datatable.selectionMode']}" >

                <p:ajax event="rowSelect" update="btnEditar, btnExcluir" />  

                <p:column headerText="ID" width="30" >
                    <h:outputText value="#{u.id}" />
                </p:column>

                <p:column headerText="#{msg['global.nome']}" width="200">
                    <h:outputText value="#{u.nome}" />
                </p:column>

                <p:column headerText="#{msg['global.descricao']}" styleClass="alinhar-esquerda">
                    <h:outputText value="#{u.descricao}" styleClass="alinhar-esquerda" />
                </p:column>

            </p:dataTable>
        </h:form>

    </ui:define>
</ui:composition>

categoriaBean.java

package br.com.vendas.managedbean;

import java.io.Serializable;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import org.apache.log4j.Logger;
import org.primefaces.model.LazyDataModel;

import br.com.vendas.entity.Categoria;
import br.com.vendas.facade.CategoriaFacade;
import br.com.vendas.util.JSFUtil;
import br.com.vendas.util.LazyDataModelGenerico;

import com.ocpsoft.pretty.faces.annotation.URLMapping;

@ManagedBean(name = "categoriaMB")
@ViewScoped
@URLMapping(id = "categoriaMB", pattern = "/manutencao/categoria", viewId = "/view/categoria.xhtml")
public class CategoriaBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private static final Logger logger = Logger.getLogger(CategoriaBean.class);

    private Categoria categoria;
    private Categoria categoriaSelecionada;
    private LazyDataModelGenerico<Categoria> categorias;
    private CategoriaFacade facade;

    @PostConstruct
    public void init() {

        try {
            facade = CategoriaFacade.getInstance();

            if (categorias == null) {
                categorias = new LazyDataModelGenerico<Categoria>(facade);
            }
        } catch (Exception e) {
            logger.error("Erro ao listar categorias: " + e.getMessage());
            JSFUtil.addMessageI18n("categoria.listar.erro", "error");
        }
    }

    public void novo() {
        categoria = new Categoria();
    }

    public void editar() {

        categoria = categoriaSelecionada;
        if (categoriaSelecionada != null) {
            //logger.info("Categoria selecionada: " + categoriaSelecionada.getNome());
        } else {
            JSFUtil.addMessageI18n("global.salvar.erro", "error");
        }

    }

    public void salvar() {
        try {
            // limpa a categoria selecionada
            //categoriaSelecionada = null;

            // salvar o registro no banco de dados
            facade.salvar(categoria);

            // exibe a mensagem de confirmação
            JSFUtil.addMessageI18n("global.salvar.sucesso", "info");

            // log
            logger.info("Categoria salva com sucesso!");
        } catch (Exception e) {
            JSFUtil.addMessageI18n("global.salvar.erro", "error");
            logger.error("Erro ao salvar categoria:" + e.getMessage());
        }
    }

    public Categoria getCategoria() {
        return categoria;
    }

    public void setCategoria(Categoria categoria) {
        this.categoria = categoria;
    }

    public LazyDataModel<Categoria> getCategorias() {
        return categorias;
    }

    public Categoria getCategoriaSelecionada() {
        return categoriaSelecionada;
    }

    public void setCategoriaSelecionada(Categoria categoria) {
        this.categoriaSelecionada = categoria;
    }
}

O problema é que os campos do form já estão vinculados ao categoriaMB.categoria, mas quando seleciono um registro o primefaces joga ele dentro do categoriaMB.categoriaSelecionada... Uma solução para esse problema seria criar dois formulários um para a criação de registros onde estaria vinculado o categoriaMB.categoria nos campos e o outro para edição de registros onde categoriaMB.categoriaSelecionada estaria vinculado.

Mas eu não quero duplicar o código... Então, alguém tem alguma idéia de como posso fazer para adicionar e editar registro usando o mesmo formulário ?

Valeu pessoal!

Segue imagens:

Image and video hosting by TinyPic

Image and video hosting by TinyPic

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

2 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags primefaces select ou faça a sua própria pergunta.