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.