jQuery UI - Dialog Modal Form

3 respostas
J

Prezados,

Estou começando a utilizar o jQuery UI em uma aplicação e estou com problema em relação ao componente Dialog Modal Form: http://jqueryui.com/demos/dialog/#modal-form

Eu conseguir fazer todo o processo que o próprio exemplo faz, porém preciso obter esta lista que esta sendo inserida os items para enviar para o controller da aplicação, para obter o valor da lista no Java. Como faço este envio?

Código do exemplo que estou utilizando obtido no próprio site do jQuery UI, somente inserir mais um campo para observar o funcionamento.

<!DOCTYPE html>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
		<link type="text/css" href="css/le-frog/jquery-ui-1.8.18.custom.css" rel="stylesheet" />	
		<script type="text/javascript" src="js/jquery-1.7.1.min.js"></script>
		<script type="text/javascript" src="js/jquery-ui-1.8.18.custom.min.js"></script>
	<style>
		body { font-size: 62.5%; }
		label, input { display:block; }
		input.text { margin-bottom:12px; width:95%; padding: .4em; }
		fieldset { padding:0; border:0; margin-top:25px; }
		h1 { font-size: 1.2em; margin: .6em 0; }
		div#users-contain { width: 350px; margin: 20px 0; }
		div#users-contain table { margin: 1em 0; border-collapse: collapse; width: 100%; }
		div#users-contain table td, div#users-contain table th { border: 1px solid #eee; padding: .6em 10px; text-align: left; }
		.ui-dialog .ui-state-error { padding: .3em; }
		.validateTips { border: 1px solid transparent; padding: 0.3em; }
	</style>
	<script>
	$(function() {
		// a workaround for a flaw in the demo system (http://dev.jqueryui.com/ticket/4375), ignore!
		$( "#dialog:ui-dialog" ).dialog( "destroy" );
		
		var name = $( "#name" ),
			email = $( "#email" ),
			password = $( "#password" ),
			address = $( "#address" ),
			allFields = $( [] ).add( name ).add( email ).add( password ).add( address ),
			tips = $( ".validateTips" );

		function updateTips( t ) {
			tips
				.text( t )
				.addClass( "ui-state-highlight" );
			setTimeout(function() {
				tips.removeClass( "ui-state-highlight", 1500 );
			}, 500 );
		}

		function checkLength( o, n, min, max ) {
			if ( o.val().length > max || o.val().length < min ) {
				o.addClass( "ui-state-error" );
				updateTips( "Length of " + n + " must be between " +
					min + " and " + max + "." );
				return false;
			} else {
				return true;
			}
		}

		function checkRegexp( o, regexp, n ) {
			if ( !( regexp.test( o.val() ) ) ) {
				o.addClass( "ui-state-error" );
				updateTips( n );
				return false;
			} else {
				return true;
			}
		}
		
		$( "#dialog-form" ).dialog({
			autoOpen: false,
			height: 300,
			width: 350,
			modal: true,
			buttons: {
				"Create an account": function() {
					var bValid = true;
					allFields.removeClass( "ui-state-error" );

					bValid = bValid && checkLength( name, "username", 3, 16 );
					bValid = bValid && checkLength( email, "email", 6, 80 );
					bValid = bValid && checkLength( password, "password", 5, 16 );
					bValid = bValid && checkLength( address, "address", 10, 60);

					bValid = bValid && checkRegexp( name, /^[a-z]([0-9a-z_])+$/i, "Username may consist of a-z, 0-9, underscores, begin with a letter." );
					// From jquery.validate.js (by joern), contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
					bValid = bValid && checkRegexp( email, /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i, "eg. [email removido]" );
					bValid = bValid && checkRegexp( password, /^([0-9a-zA-Z])+$/, "Password field only allow : a-z 0-9" );

					if ( bValid ) {
						$( "#users tbody" ).append( "<tr>" +
							"<td>" + name.val() + "</td>" + 
							"<td>" + email.val() + "</td>" + 
							"<td>" + password.val() + "</td>" +
							"<td>" + address.val() + "</td>" +
						"</tr>" ); 
						$( this ).dialog( "close" );
					}
				},
				Cancel: function() {
					$( this ).dialog( "close" );
				}
			},
			close: function() {
				allFields.val( "" ).removeClass( "ui-state-error" );
			}
		});

		$( "#create-user" )
			.button()
			.click(function() {
				$( "#dialog-form" ).dialog( "open" );
			});
	});
	</script>
</head>
<body>

<div class="demo">

<div id="dialog-form" title="Criar Novo Usuario">
	<p >Todos os campos do formulário são obrigatórios.</p>

	&lt;form&gt;
	&lt;fieldset&gt;
		&lt;label for="name"&gt;Nome&lt;/label&gt;
		&lt;input type="text" name="name" id="name" class="text ui-widget-content ui-corner-all" /&gt;
		&lt;label for="email"&gt;Email&lt;/label&gt;
		&lt;input type="text" name="email" id="email" value="" class="text ui-widget-content ui-corner-all" /&gt;
		&lt;label for="password"&gt;Senha&lt;/label&gt;
		&lt;input type="password" name="password" id="password" value="" class="text ui-widget-content ui-corner-all" /&gt;
		&lt;label for="address"&gt;Endereço&lt;/label&gt;
		&lt;input type="text" name="address" id="address" value="" class="text ui-widget-content ui-corner-all" /&gt;
	&lt;/fieldset&gt;
	&lt;/form&gt;
&lt;/div&gt;


&lt;div id="users-contain" class="ui-widget"&gt;
	&lt;h1&gt;Usuários Existentes:&lt;/h1&gt;
	&lt;table id="users" class="ui-widget ui-widget-content"&gt;
		&lt;thead&gt;
			&lt;tr class="ui-widget-header "&gt;
				&lt;th&gt;Nome&lt;/th&gt;
				&lt;th&gt;Email&lt;/th&gt;
				&lt;th&gt;Senha&lt;/th&gt;
				&lt;th&gt;Endereço&lt;/th&gt;
			&lt;/tr&gt;
		&lt;/thead&gt;
		&lt;tbody&gt;
			&lt;tr&gt;
				&lt;td&gt;Firmino&lt;/td&gt;
				&lt;td&gt;[email removido]&lt;/td&gt;
				&lt;td&gt;firmino&lt;/td&gt;
				&lt;td&gt;Rua Major Prezeres&lt;/td&gt;
			&lt;/tr&gt;
		&lt;/tbody&gt;
	&lt;/table&gt;
&lt;/div&gt;
&lt;button id="create-user"&gt;Criar Novo Usuário&lt;/button&gt;

&lt;/div&gt;

	&lt;/body&gt;
&lt;/html&gt;

Desde já agradeço a atenção e ajuda de todos.

3 Respostas

C

jeroqueiroz já passei exatamente pelo problema que você está passando, bom no seu caso acho que o melhor a se fazer é usar ajax.

Dá uma olhada na documentação no site do jquery - http://api.jquery.com/category/ajax/

e adicionar a função ajax que criar para interagir com o controller a função do dialog e a action do form.

Para adicionar a função ao form tu tem duas opções ou adicionar a função diretamente a action

<form action="javascript:sendForm()">
</form>

ou então utilizar a função submit do jquery

<script type="text/javascript">
$("#form").submit(function(){
  alert("enviando");
});
</script>

<form id="form>

</form>

para adicionar os itens a tabela pode utilizar javaScript puro

function adicionarItem(){
  var tr = document.createElement("tr"), td;
    for(i = 0; i < allFields.length; i++){
      td = document.createElement("td");
      td.appendChild(document.createTextNode(allFields[i].value));
      tr.appendChild(td);
  }
}

ou com jquery que dá quase no mesmo

function adicionaItem(){
  var tr = $('tr');
  for (i = 0; allField.length; i++){
    td = $('td');
    td.append(allField[i].val());
    tr.append(td);
  }
}
J

Agradeço sua atenção e resposta, mas nesta parte que você citou eu fiquei com dúvida o que de fato vou enviar, já que estou criando uma tabela na inserção do elementos.

Tenho que relacionar alguma atributo na tela com o utilizado no controller.

&lt;script type="text/javascript"&gt;
$("#form").submit(function(){
  alert("enviando");
});
&lt;/script&gt;

&lt;form id="form&gt;

&lt;/form&gt;

Na parte onde você informou o alert, o que seria enviado.

Viajei nesta parte ai...

Se puder mais esta ajuda agradeço.">

C

Você pode criar um metodo post ou ajax como preferir

$.ajax({ url: "adiciona_cliente", dataType: json, data:{ // aqui tu coloca o nome e os valores dos campos nome:$("#nome").val(); email:$("#email").val(); }, success:function(){ // Aqui tu pode colocar o que fazer depois que confirmar a adição, // exibir uma mensagem ou coisa do tipo. // Está função pode aparecer de forma retardada na tua página // porque vai depender do tempo de resposta do servidor alert("adicionado com sucesso"); } });

pra mais detalhes dá uma olhada na parte de ajax do jquery - http://api.jquery.com/jQuery.ajax/ isso também pode ser feito via o metodo post - http://api.jquery.com/jQuery.post/ e get - http://api.jquery.com/get/, a estrutura destes ultimos dois são bem parecidas entre si mas diferentes do ajax, mas podem fazer a mesma coisa

Criado 18 de abril de 2012
Ultima resposta 18 de abr. de 2012
Respostas 3
Participantes 2