Estou utilizando o VRaptor juntamente com Ext JS e preciso preencher os formlários com requisições AJAX.
O problema disso é que o retorno utilizando JSON me traz apenas o nome do atributo, enquanto que no formulário eu preciso setar o nome do campo com o padrão [objeto].[atributo], para que assim eu possa receber o objeto montado no construtor do método.
Existe alguma forma dos atributos que serão serializados no JSON serem nomeados com o padrão [objeto].[atributo]?
se vc vai fazer algo genérico, vai ser algo do tipo:
function processaJSON(json, base) {
if (base) { base = base + "."; }
for(campo in json) {
if (<campo é um objeto>)
processaJSON(json[campo], base + campo);
else
<adiciona o input chamado base + campo>
}
}
json = // o json
processaJSON(json);
vc vai ter que sobrescrever a classe do vraptor que serializa JSON (XStreamJSONSerializer) pra poder configurar o XStream (sobrescrevendo o método getXStream)
no XStream vc vai ter que adicionar um Converter que vai fazer isso que vc quer…
não é nem um pouco fácil… é bem mais fácil fazer via javascript…
qual o problema de fazer isso por javascript? não vai ficar lento… vai levar praticamente o mesmo tempo que leva pra montar o form na mão…
ou vc tá usando alguma biblioteca JS que já espera o JSON do jeito que vc falou?
de qqer forma, eu posso te mandar um código javascript que converte o json q o vraptor gera num json do jeito q vc quer, que acha?
geralmente as bibliotecas JS dão a possibilidade de vc tratar o resultado da url… vc sabe quais são as options possíveis pra passar nesse this.form.load?
Segundo a documentação são as seguintes:
[b]
* url : String
The url for the action (defaults to the form’s url.)
* method : String
The form method to use (defaults to the form’s method, or POST if not defined)
* params : String/Object
The params to pass (defaults to the form's baseParams, or none if not defined)
Parameters are encoded as standard HTTP parameters using Ext.urlEncode.
* headers : Object
Request headers to set for the action (defaults to the form's default headers)
* success : Function
The callback that will be invoked after a successful response (see top of submit and load for a description of what constitutes a successful response). The function is passed the following parameters:
o form : Ext.form.BasicForm
The form that requested the action
o action : The Action object which performed the operation.
The action object contains these properties of interest:
+ response
+ result : interrogate for custom postprocessing
+ type
* failure : Function
The callback that will be invoked after a failed transaction attempt. The function is passed the following parameters:
o form : The Ext.form.BasicForm that requested the action.
o action : The Action object which performed the operation.
The action object contains these properties of interest:
+ failureType
+ response
+ result : interrogate for custom postprocessing
+ type
* scope : Object
The scope in which to call the callback functions (The this reference for the callback functions).
* clientValidation : Boolean
Submit Action only. Determines whether a Form's fields are validated in a final call to isValid prior to submission. Set to false to prevent this. If undefined, pre-submission field validation is performed.[/b]
Estou vendo que o Ext JS utiliza muitos padrões para o load de JSON.
Alguns casos ele precisa do SUCCESS, outros não, e por aí vai.
Talves o ideal seria poder serializar diretamente uma String. Tipo, o que vier nela e serializado.
Assim eu poderia criar classes para montagem desses JSON.
O problema é que ele não vai entrar no success. Ta certo que posso tratar no failure, mas ainda acho que o ideal seria poder serializar objetos no padrão do Ext JS.