sexta-feira, 1 de julho de 2011

Notes/XPages - Listar campos do Custom Control ou XPages atual

<Bom, a um tempo atrás tive que pegar todos os campos de dada página através de um Server-Side Javascript. Normalmente, podemos usar um getComponent("nomeDoComponent"), mas quando queremos pegar de forma geral todos os campos da página, não há um método getAllComponents.
Então criei um código recursivo que retorna uma List de components. Sendo que essa lista já contem os components, não é necessário usar getComponent.
Bem, vamos ao código:

function pegarCamposPagina(viewRoot:javax.faces.component.UIViewRoot){
    var listaCampos:java.util.ArrayList = new java.util.ArrayList();

    function iterate(component:javax.faces.component.UIComponent){
        //testa de qual tipo é o component
        if(component instanceof com.ibm.xsp.component.xp.XspInputText ||
 component instanceof com.ibm.xsp.component.xp.XspInputRichText ||
 component instanceof com.ibm.xsp.component.xp.XspInputTextarea ||
 component instanceof com.ibm.xsp.component.xp.XspInputCheckbox ||
 component instanceof com.ibm.xsp.component.xp.XspInputRadio ||
 component instanceof com.ibm.xsp.component.xp.XspSelectManyCheckbox ||
 component instanceof com.ibm.xsp.component.xp.XspSelectOneRadio ||
 component instanceof com.ibm.xsp.component.xp.XspSelectOneMenu){
            listaCampos.add(component);
        }

        //testa se o component atual tem filhos
        if(component.getChildCount() > 0){
            var lista:java.util.List = component.getChildren();
            for(var i:int=0; i<lista.size(); i++){
                iterate(lista.get(i));
            }
        }
        return null;
    }
    iterate(viewRoot);

    return listaCampos;
}

Para usar esse script, pode-se criar uma Server-Side JavaScript Library e importar na página, ou simplesmente jogar no evento. Deve-se chamar esse metodo da seguinte forma:
pegarCamposPagina(getView())

O método getView() retorna a viewRoot da página. Então enviamos para o método e ele faz chamadas recursivas até listar todos os componentes. Caso queira-se apenas os campos de uma certa table ou panel, por exemplo, é necessário passar o getComponent("nomeDoComponente") para o método. Ele também funcionará.

Um comentário: