Prevenindo Form Submit com GlideAjax Async

Neste artigo vamos falar sobre como implementar uma validação de alguma regra de negocio e se necessário prevenir form submit com GlideAjax Async no Client Script para validar caso hajam dependências.

Muitas vezes precisamos implementar validações mais complexas em algum formulário, requerendo o uso de uma chamada Ajax para decidir se aquela operação de save/update deve ser permitida ou não. E a solução para este cenário apesar de simples não é tão óbvia!

Caso você não esteja familiarizado com chamadas GlideAjax, confira o artigo abaixo antes de prosseguir!

Para conseguirmos implementar essa solução, vamos falar um pouco do objeto “g_scratchpad”!

Esse objeto permite compartilhar informações entre server e client de forma persistente. É uma ferramenta bastante útil e não acredito que seja muito conhecida/utilizada! Não vou entrar muito a fundo nele agora, mas deixa um comentário se vocês quiserem mais conhecer mais detalhes sobre o g_scratchpad.

Temos o seguinte Client Script, do tipo onSubmit:

function onSubmit() {
  	// Capturamos a operação executada, por exemplo insert, update etc
	var actionName = g_form.getActionName();
	// Checa no g_scratchpad se o atributo isFormValid está setado como verdadeiro
	// Se sim, ele retorna true para o onSubmit, e o form será atualizado.
	if (g_scratchpad.isFormValid){
		return true;
	}
	// Chamada da nossa validação Ajax, que definirá se o form poderá ser submetido ou não
	var ga = new GlideAjax('MyUtils');
    ga.addParam('sysparm_name', 'testAjax');
    ga.getXMLAnswer(meuCallback);

	// Retorna falso por padrão, pois somente com a aprovação do Ajax que o submit deverá feito 
	return false;
	
	// Callback da chamada Ajax
    function meuCallback(answer) {
        // Aqui voce valida a condição de sucesso para o submit.
		if (answer == 'no') {
			// O segredo está nesse scratchpad, que é validado na linha 6
			g_scratchpad.isFormValid = true;
			// Re-submetemos o form com a mesma action original. 
			g_form.submit(actionName);			
		}
    }
}

A solução então funciona da seguinte forma: A primeira validação do valor do scratchpad (linha 6) sempre será false uma vez que a chamada Ajax ainda não foi completada, então logo de cara cancelamos o submit (linha 15).

Em paralelo, a chamada Ajax está em execução e aguardamos a chamada do callback meuCallback para tratar o retorno. Uma vez que o callback é executado, fazemos as validações necessárias para definir se aquele g_form pode ser submitido ou não (linha 20).

Se o form for aprovado para submissão, nós setamos o atributo g_scratchpad.isFormValid com o valor true e re-resubmetemos o mesmo form. Agora a grande sacada é, com a resubmissão, este mesmo script será executado desde o início, porém quando ele chegar na linha 6 teremos:

// Agora na segunda vez, este valor foi definido como true, então ele entrará no if e o return 
// do onSubmit agora será verdadeiro, fazendo com que a submissão seja completada.
if (g_scratchpad.isFormValid){
	return true;
}

Bacana né?

Espero que tenham gostado e até a proxima.

Leave a Reply

Your email address will not be published. Required fields are marked *