Menu

Cambiar controlador de forma dinamica

2015-11-11
2015-12-02
  • Luis Matamoros

    Luis Matamoros - 2015-11-11

    Hola, tengo un controlador en controllers.xml de la siguiente manera:
    <controller name="ControladorEntidadFSM">
    <subcontroller controller="SubControladorListadoFSM" image="search.gif" mode="list"/>
    <subcontroller controller="SubControladorDetalleFSM" image="search.gif" mode="detail"/>
    </controller>

    <controller name="SubControladorDetalleFSM"> 
        <!-- las acciones se agregan dinamicamente en tiempo de ejecucion -->
    </controller>
    
    <controller name="SubControladorListadoFSM">
        <!-- las acciones se agregan dinamicamente en tiempo de ejecucion -->
    </controller>
    
    Las acciones se agregan de forma dinamica. Estas acciones se muestran en un boton al estilo drop-down button.
    
    Este controlador lo puedo aplicar a un modulo sin problemas, pero el problema es cuando quiero utilizar las acciones del controlador en una coleccion dentro de otro modulo:
    
    Ejemplo: Vencimientos tiene el controlador y funciona correctamente. Pero cuando tengo Vencimientos dentro de otra entidad quisiera que vencimientos mantenga las acciones del controlador:
    @OneToMany(fetch=FetchType.LAZY)
    @JoinColumn(name="PLANILLA_ID")
    private Set<Vencimientos> vencimientos;
    
    Soy nuevo en OpenXava y quisiera un apoyo, la version de OX que utilizo es la 5.3
    
    Gracias
    
     
  • Javier Paniza

    Javier Paniza - 2015-11-13

    Hola Luis:

    Para añadir acciones a la colección has de usar @DetailAction, @ListAction y @RowAction.
    Échale un ojo a la documentación.


    Ayuda a otros en este foro como yo te ayudo a ti.

     
  • Luis Matamoros

    Luis Matamoros - 2015-11-13

    Gracias Javier por tu pronta respuesta, he revisado la documentacion que me indicas y me sirve para acciones definidas en controllers.xml, en mi caso las acciones del controlador no estan definidas en el xml, el controlador esta vacio y las acciones las agrego de forma dinamica, en tiempo de ejecucion.

    <controller name="SubControladorDetalleFSM">

    </controller>

    No puedo hacer lo siguiente

    @OneToMany(fetch=FetchType.LAZY)
    @JoinColumn(name="PLANILLA_ID")
    @ListActions({
        @ListAction("SubControladorDetalleFSM.solicitar"),
        @ListAction("SubControladorDetalleFSM.verificar")
      })
      private Set<Vencimientos> vencimientos;
    

    Me da el error: No existe la accion solicitar en el controlador SubControladorDetalleFSM

     
  • Javier Paniza

    Javier Paniza - 2015-11-16

    Hola Luis:

    el controlador esta vacio y las acciones las agrego de forma dinamica, en tiempo de ejecucion

    ¿Y cómo hace eso?

    Para estar disponibles las acciones han de estar definidas en algún controlador. Las puedes definir como ocultas o definir en un contralador que no esté asociado a ningún módulo, pero tienen que estar. Después puedes usar el nombre de esas acciones para añadirlas por código, así:

    addActions("MiControlador.miAccion");
    removeACtion("MiControlador.miOtraAccion");
    

    Ayuda a otros en este foro como yo te ayudo a ti.

     
  • Luis Matamoros

    Luis Matamoros - 2015-11-27

    Hola Javier:

    Te explico como hago para crear el controlador vacio y llenarlo en tiempo de ejecucion:

    controller.xml:

    <controller name="ControladorEntidadFSM">
    <subcontroller controller="SubControladorListadoFSM" image="search.gif" mode="list"/>
    <subcontroller controller="SubControladorDetalleFSM" image="search.gif" mode="detail"/>
    </controller>

    <controller name="SubControladorDetalleFSM">

    </controller>

    <controller name="SubControladorListadoFSM">

    </controller>

    Luego atraves de codigo llenar los subcontroladores:

    public MetaAction crearOXMetaAction(AccionFSM accion, String subControlador){
    MetaAction metaAction = new MetaAction();

        metaAction.setKeystroke("");
        metaAction.setName(accion.getAccionOX());
        //metaAction.setMetaController(MetaControllers.getMetaController(subControlador));
        metaAction.setConfirm(true);
        metaAction.setClassName(accion.getAccionListadoOXClass());
        metaAction.setByDefault(MetaAction.ALMOST_NEVER);
        metaAction.setLabel("");
        metaAction.setMode("list");
        metaAction.setHidden(true);
        metaAction.setTakesLong(true);
    
        MetaSet metaSet = new MetaSet();    
        metaSet.setPropertyName("accionID");
        metaSet.setValue(accion.getId().toString());
    
        metaAction._addMetaSet(metaSet);
    
        MetaControllers.getMetaController(subControlador).addMetaAction(metaAction);
    
        return metaAction;
    }
    
    llamar al procedimiento para llenar las acciones del controlador
    public static final String CONTROLADOR_CONTENEDOR = "SubControladorListadoFSM";
    
    if (ManagerFSM.getInstancia().isAccionPermitidaUsuario(accion)) {
                    getManager().addSimpleMetaAction(ManagerFSM.getInstancia().crearOXMetaAction(accion,FSMCargarAccionesListadoAccion.CONTROLADOR_CONTENEDOR));
                    if (subVista != null)
                        getView().getSubview(subVista).addListAction(FSMCargarAccionesListadoAccion.CONTROLADOR_CONTENEDOR 
                                                                      + "." + accion.getAccionOX().toString());
                }
    
                De momento he logrado poblar las acciones de forma horizontal, y me funciona perfectamente, pero me gustaria mostralas de forma horizontal.
    
                En la vista de un modulo me funciona correctamente, pero cuando los quiero poner en una coleccion es que no funciona, de momento lo dejaré asi de forma horizontales las acciones.
    
                Adjunto la imagen de lo que quiero pero en una coleccion.
    
     
  • Javier Paniza

    Javier Paniza - 2015-11-30

    Hola Luis:

    Al hacerlo así estás modificando la meta información de la aplicación, la cual es compartida por todos los módulos, usuarios, sesiones, etc. No sé si es eso lo que pretendes.

    La metainformación está pensada para ser un reflejo directo de los xml, después tienes APIs para cambiar las acciones en tiempo de ejecución como add/removeAction o setControllers que puedes usar desde las acciones.

    los quiero poner en una coleccion

    Para eso tienes métodos en la clave View, como addListAction o addDetailAction.

    Dime cual es tu objetivo, por qué necesitas hace eso y te daré algunas sugerencias.


    Ayuda a otros en este foro como yo te ayudo a ti.

     
    • Luis Matamoros

      Luis Matamoros - 2015-11-30

      Hola Javier,

      Gracias por responder,

      Dime cual es tu objetivo, por qué necesitas hace eso y te daré algunas sugerencias.

      Las acciones serán agregadas por un usuario, es decir el usuario va poder registrar las acciones desde la aplicacion, indicando cual es el modulo al que pertenece cada accion, para un determinado modulo, por ese motivo no las puedo dejar fijas en el .xml.

      Luego de la tabla donde se guardan las acciones tomo dichas acciones para pintarlas en el modulo correspondiente, todo me funciona bien, lo unico que en una coleccion no las he logrado poner de forma vertical, sino horizontal, por el momento resuelvo asi porque las acciones son pocas, pero si las acciones fuesen muchas no se verá muy bien.

       

      Last edit: Luis Matamoros 2015-11-30
  • Javier Paniza

    Javier Paniza - 2015-12-02

    Hola Luis:

    Si los cambios van a ser globales te puede funcionar. Lo menús desplegables se gestionan mediante MetaSubcontrollers.


    Ayuda a otros en este foro como yo te ayudo a ti.

     

Log in to post a comment.