[RESOLVIDO] VRaptor - Usar o mesmo formulario para cadastrar e alterar

2 respostas
P

Fala galera boa, continuo aqui com meu pequeno sistema de loja. Estou idealizando uma pagina para cada tabela do banco, ao inves de varias paginas para cada funçao (cadastrar,alterar,remover,listar). O primeiro passo já foi dado que foi unir o cadastro com a listagem. Agora eu pergunto pra vocês, como poderia colocar a alteraçao na mesma pagina do cadastro? Atualmente tenho duas páginas separadas o formulario para o cadastro, e o edita para a alteração. A chamada para a alteração está na listagem que é chamada no formulário. Meu código a seguir:

ProdutosController

@Get("/produtos/novo")
	public void formulario(){
		this.result.include("produtoList",this.lista());
	}

	@Get("/produtos/{id}")
	public Produto edita(Long id){
		this.result.include("categorias",cdao.listaTudo());
		return pdao.carregaProduto(id);	
	}

	@Post("/produtos")
	public void adiciona(Produto produto){
		validator.validate(produto);
		validator.onErrorUsePageOf(this).formulario();
		
		pdao.salva(produto);
		result.redirectTo(this).formulario();
	}

	@Put("/produtos/{produto.id}")
	public void altera(Produto produto){
		validator.validate(produto);
		validator.onErrorUsePageOf(this).edita(produto.getId());
		
		pdao.altera(produto);
		result.redirectTo(this).lista();
	}

Agradeço a ajuda desde já :slight_smile:

2 Respostas

Rafael_Guerreiro

Isso é uma coisa que eu gosto muito de fazer. Assim a manutenção é bem mínima.

Primeiro passo: arrumar as actions (os formulários serão parecidos, certo?):

@Get("/produtos/novo")  
public void form(){  
    this.result.include("produtoList",this.lista()); // Por que você adiciona essa lista aqui? Existe alguma combo, ou coisa parecida?
}  
  
@Get("/produtos/{id}")  
public void form(Long id){  // Mesmo nome... Assim ele abre a mesma jsp.
    this.result.include("categorias",cdao.listaTudo()); // Por que essa lista aqui? Esse form não usa uma lista de produtos? 
    this.result.include("obj", pdao.carregaProduto(id)); // Lembra de colocar um input hidden com o id desse produto.
}  
  
@Post("/produtos")  
public void saveOrUpdate(Produto produto){ // Como o formulário é o mesmo, você manda os dois para .  
    validator.validate(produto);  
    validator.onErrorUsePageOf(this).formulario();  
      
    pdao.saveOrUpdate(produto); // Use o método saveOrUpdate do Hibernate, ele se vira para você...
    result.redirectTo(this).formulario();  
}

O ideal é você usar padrões independentemente do nome das classes: Chamar de obj, ou object, list ou objs ou objects. Assim, você pode aproveitar uma jsp para várias actions iguais.

P

Obrigado mais uma vez pela ajuda, Rafael. Vamos lá.

eu listo todos os produtos logo abaixo do formulario de cadastro. Isso é provisório, depois pretendo colocar em outra pagina.

aqui existia uma combobox para categoria, mas já retirei isso. Desculpe pelo código desatualizado.

Fiz tudo que você disse, e deu certo, mais uma vez obrigado :slight_smile:

Criado 22 de outubro de 2012
Ultima resposta 22 de out. de 2012
Respostas 2
Participantes 2