Changes between Initial Version and Version 1 of WF/UtilizacaodeAjaxemprocessos


Ignore:
Timestamp:
07/24/07 15:01:39 (17 years ago)
Author:
trac
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • WF/UtilizacaodeAjaxemprocessos

    v1 v1  
     1A utilização de Ajax em processos de Workflow requer a utilização de alguns padrões. 
     2  
     3 
     4O código que será executado pelo Ajax deverá estar contido no método de uma classe (ou seja, não será possível executar funções "soltas"). 
     5 
     6 
     7 
     8O arquivo que contém a classe deverá estar localizado na área "code" (que é o mesmo diretório do arquivo shared.php) do processo. O nome deverá seguir o formato: class.ajax.nome_classe.inc.php, por exemplo, supondo que irei chamar, por Ajax, a classe validacao, então o nome do arquivo que contém a classe deverá ser: class.ajax.validacao.inc.php 
     9 
     10 
     11 
     12Quando a classe for instanciada, seu construtor será chamado sem parâmetros. 
     13 
     14 
     15 
     16NotemplatedoprocessoqueutilizaráAjax,énecessárioincluirabiblioteca!JavaScriptquepermitesuautilização.Paraisto,foidesenvolvidoumplugindoSmartyqueinsereosarquivosnecessários(garantindoquenãosejamincluídosmaisdeumavez).Parafazerinserçãodosarquivos!JavaScript,consulte:[wiki:WF_InicializaçãodoAjax] 
     17 
     18 
     19 
     20 
     21A especificação de qual classe e método será chamado, é feita através do método addVirtualRequest da classe !NanoController (!JavaScript). Este método aceita três parâmetros, são eles (em ordem): 
     22 
     23  um identificador da chamada Ajax. 
     24 
     25  um objeto !JavaScript com os atributos: 
     26 
     27:  action: contendo o nome da classe que será chamada 
     28 
     29:  mode: o nome do método da classe que será chamado 
     30 
     31  um ojeto !JavaScript contendo eventuais parâmetros para a chamada (este parâmetro é opcional) 
     32 
     33 
     34 
     35No caso dos dois últimos parâmetros, é possível fazer a definição dos objetos ''in loco''. 
     36 
     37 
     38 
     39== Exemplo de utilização == 
     40 
     41Classe PHP no arquivo class.ajax.minhas_strings.inc.php 
     42 
     43{{{ 
     44 
     45class minhas_strings() 
     46 
     47{ 
     48 
     49        var $nome; 
     50 
     51        function minhas_strings() 
     52 
     53        { 
     54 
     55                $this->nome = "Mundo"; 
     56 
     57        } 
     58 
     59         
     60 
     61        function saudacao() 
     62 
     63        { 
     64 
     65                return "Olá " . $this->nome; 
     66 
     67        } 
     68 
     69         
     70 
     71        function adeus() 
     72 
     73        { 
     74 
     75                return "Adeus " . $this->nome . " cruel"; 
     76 
     77        } 
     78 
     79         
     80 
     81        function saudacaoEspecial($params) 
     82 
     83        { 
     84 
     85                return $params['cumprimento'] . " " . $this->nome; 
     86 
     87        } 
     88 
     89} 
     90 
     91}}} 
     92 
     93 
     94 
     95No meu arquivo de templates, eu posso fazer uma chamada para um método da classe Ajax da seguinte forma: 
     96 
     97{{{ 
     98 
     99{wf_ajax_init} 
     100 
     101 
     102 
     103<s c r i p t language="j a v a s c r i p t"> 
     104 
     105{literal} 
     106 
     107var nc = new NanoController(); 
     108 
     109nc.setWfUrl(); 
     110 
     111nc.setSuccessHandler(exibirResultado); 
     112 
     113nc.addVirtualRequest('chamada_1', 
     114 
     115        { 
     116 
     117                action : 'minhas_strings', 
     118 
     119                mode   : 'saudacao' 
     120 
     121        }); 
     122 
     123nc.sendRequest(); 
     124 
     125 
     126 
     127function exibirResultado(dados) 
     128 
     129{ 
     130 
     131        /* irá exibir um alerta com a string "Olá Mundo" */ 
     132 
     133        alert(dados['chamada_1']['data']); 
     134 
     135} 
     136 
     137{/literal} 
     138 
     139</s c r i p t> 
     140 
     141}}} 
     142 
     143 
     144 
     145A tag Smarty {{literal}} indica que o smarty não irá tentar interpetrar as chaves como sendo seus delimitadores. 
     146 
     147 
     148 
     149Com a biblioteca de Ajax utilizada, que é a !NanoAjax, é possível fazer várias chamadas a métodos em uma única chamada Ajax. Sendo assim, o exemplo abaixo chama dois métodos da classe "minhas_strings" (as chamadas não precisam ficar restritas a apenas uma classe). 
     150 
     151{{{ 
     152 
     153{wf_ajax_init} 
     154 
     155 
     156 
     157<s c r i p t language="j a v a s c r i p t"> 
     158 
     159{literal} 
     160 
     161var nc = new NanoController(); 
     162 
     163nc.setWfUrl(); 
     164 
     165nc.setSuccessHandler(exibirResultado); 
     166 
     167nc.addVirtualRequest('chamada_1', 
     168 
     169        { 
     170 
     171                action : 'minhas_strings', 
     172 
     173                mode   : 'saudacao' 
     174 
     175        }); 
     176 
     177 
     178 
     179nc.addVirtualRequest('chamada_2', 
     180 
     181        { 
     182 
     183                action : 'minhas_strings', 
     184 
     185                mode   : 'adeus' 
     186 
     187        }); 
     188 
     189nc.sendRequest(); 
     190 
     191 
     192 
     193function exibirResultado(dados) 
     194 
     195{ 
     196 
     197        /* irá exibir um alerta com a string "Olá Mundo" */ 
     198 
     199        alert(dados['chamada_1']['data']); 
     200 
     201 
     202 
     203        /* irá exibir um alerta com a string "Adeus Mundo cruel" */ 
     204 
     205        alert(dados['chamada_2']['data']); 
     206 
     207} 
     208 
     209{/literal} 
     210 
     211</s c r i p t> 
     212 
     213}}} 
     214 
     215 
     216 
     217Também é possível chamar um método passando um ou mais parâmetros. Um exemplo que passa um parâmetro pode ser visto abaixo: 
     218 
     219 
     220 
     221{{{ 
     222 
     223{wf_ajax_init} 
     224 
     225 
     226 
     227<s c r i p t language="j a v a s c r i p t"> 
     228 
     229{literal} 
     230 
     231var nc = new NanoController(); 
     232 
     233nc.setWfUrl(); 
     234 
     235nc.setSuccessHandler(exibirResultado); 
     236 
     237nc.addVirtualRequest('chamada_especial', 
     238 
     239        { 
     240 
     241                action : 'minhas_strings', 
     242 
     243                mode   : 'saudacaoEspecial' 
     244 
     245        }, 
     246 
     247        { 
     248 
     249                cumprimento: 'Oi' 
     250 
     251        }); 
     252 
     253nc.sendRequest(); 
     254 
     255 
     256 
     257function exibirResultado(dados) 
     258 
     259{ 
     260 
     261        /* irá exibir um alerta com a string "Oi Mundo" */ 
     262 
     263        alert(dados['chamada_especial']['data']); 
     264 
     265} 
     266 
     267{/literal} 
     268 
     269</s c r i p t> 
     270 
     271}}} 
     272 
     273 
     274 
     275Uma outra coisa que pode ser feita, é a utilização de um handler próprio no caso de um erro na chamada Ajax. Exemplo: 
     276 
     277{{{ 
     278 
     279{wf_ajax_init} 
     280 
     281 
     282 
     283<s c r i p t language="j a v a s c r i p t"> 
     284 
     285{literal} 
     286 
     287var nc = new NanoController(); 
     288 
     289nc.setWfUrl(); 
     290 
     291nc.setSuccessHandler(exibirResultado); 
     292 
     293nc.setExceptionHandler(tratarErro); 
     294 
     295nc.addVirtualRequest('vai_dar_erro', 
     296 
     297        { 
     298 
     299                action : 'minhas_strings', 
     300 
     301                mode   : 'metodo_inexistente' 
     302 
     303        }, 
     304 
     305        { 
     306 
     307                cumprimento: 'Oi' 
     308 
     309        }); 
     310 
     311nc.sendRequest(); 
     312 
     313 
     314 
     315/* esta função não será chamada pois ocorrerá um erro devido à não existência do método "metodo_inexistente" da classe "minhas_strings" */ 
     316 
     317function exibirResultado(dados) 
     318 
     319{ 
     320 
     321        alert(dados['vai_dar_erro']['data']); 
     322 
     323} 
     324 
     325 
     326 
     327/* função que trata erros na chamada Ajax */ 
     328 
     329function tratarErro(dados) 
     330 
     331{ 
     332 
     333        /* aqui o meu erro será tratado */ 
     334 
     335        alert("Houve um erro neste procedimento.\nPor favor, contacte o administrador"); 
     336 
     337} 
     338 
     339{/literal} 
     340 
     341</s c r i p t> 
     342 
     343}}}