¿Cómo ...
¿Cómo evitar que se pueda modificar cierto campo en una vista?
Al actualizar en una vista, por defecto todos los campos (excepto la clave) son modificables.
Pero podemos declarar cualquier propiedad de la vista de solo lectura, de esta forma:
<vista nombre="UnMiembroSoloLectura">
<vista-propiedad propiedad="nombre" solo-lectura="true"/>
</vista>
O, si estamos usando OX3:
@ReadOnly(forViews="UnMiembroSoloLectura")
private String nombre;
¿Cómo usar una vista diferente para crear y para actualizar?
Obviamente, tenemos que definir un vista para crear y otra para actualizar, así:
<componente ... >
...
<vista nombre="Crear">
...
</vista>
<vista nombre="Actualizar">
...
</vista>
</componente>
O, si usamos OX3:
@Views({
@View(name="Crear", members=" .... "),
@View(name="Actualizar", members=" ... ")
})
public class MiEntidad { ...
Ahora hemos de refinar la acción
new para escoger la vista
Crear y la accion de búsqueda para escoger la vista
Actualizar. Primero, definamos nuestro propio controlador, en
controladores.xml, así:
<controlador nombre="MiTipico">
<accion nombre="new"
clase="com.miempresa.miaplicacion.acciones.MiAccionNuevo"
imagen="images/new.gif" on-init="true"
atajo-de-teclado="F2">
<usa-objeto nombre="xava_view"/>
</accion>
<accion nombre="search"
por-defecto="si-posible" oculta="true"
clase="com.miempresa.miaplicacion.acciones.MiAccionBuscar"
atajo-de-teclado="F8">
<usa-objeto nombre="xava_view"/>
</accion>
</controlador>
Y ahora asignamos este controlador a nuestro módulo, y definimos la acción de búsqueda para el módulo. Escribimos nuestro módulo de esta manera en
aplicacion.xml:
<modulo nombre="MiModulo">
<var-entorno nombre="XAVA_SEARCH_ACTION" valor="MiTipico.search"/>
<modelo nombre="MiComponente"/>
<controlador nombre="MiTipico"/>
</modulo>
Y ahora solo queda refinar la lógica de nuestras acciones. Para MiAccionBuscar podemos escribir:
public class MiAccionBuscar extends SearchByViewKeyAction {
public void execute() throws Exception {
getView().setViewName("Actualizar");
super.execute();
}
}
Y para
MiAccionNuevo:
public class MiAccionNuevo extends NewAction {
public void execute() throws Exception {
getView().setViewName("Crear");
super.execute();
}
}
¿Cómo desactivar una propiedad para actualizar pero no para crear?
Hemos de refinar la acción
new y la accion de búsqueda. Primero, definamos nuestro propio controlador, en
controladores.xml, así:
<controlador nombre="MiTipico">
<accion nombre="new"
clase="com.miempresa.miaplicacion.acciones.MiAccionNuevo"
imagen="images/new.gif" on-init="true"
atajo-de-teclado="F2">
<usa-objeto nombre="xava_view"/>
</accion>
<accion nombre="search"
por-defecto="si-posible" oculta="true"
clase="com.miempresa.miaplicacion.acciones.MiAccionBuscar"
atajo-de-teclado="F8">
<usa-objeto nombre="xava_view"/>
</accion>
</controlador>
Y ahora asignamos este controlador a nuestro módulo, y definimos la acción de búsqueda para el módulo. Escribimos nuestro módulo de esta manera en
aplicacion.xml:
<modulo nombre="MiModulo">
<var-entorno nombre="XAVA_SEARCH_ACTION" valor="MiTipico.search"/>
<modelo nombre="MiComponente"/>
<controlador nombre="MiTipico"/>
</modulo>
Y ahora solo queda refinar la lógica de nuestras acciones. Para MiAccionBuscar podemos escribir:
public class MiAccionBuscar extends SearchByViewKeyAction {
public void execute() throws Exception {
super.execute();
getView().setEditable("mipropiedad", false);
}
}
Y para
MiAccionNuevo:
public class MiAccionNuevo extends NewAction {
public void execute() throws Exception {
super.execute();
getView().setEditable("mipropiedad", true);
}
}
¿Cómo acceder a una propiedad del modelo que no se muestra en la vista?
Desde la vista solo podemos obtener la información visualizada. Pero es posible, usando la clase
MapFacade acceder directamente al modelo.
Podemos escribir en nuestra vista un código parecido a este:
public class MiAccion extends ViewBaseAction {
public void execute() throws Exception {
Factura factura = (Factura) MapFacade.findEntity(getModelName(), getView().getKeyValues());
BigDecimal descuentoEspecial = factura.getDescuentoEspecial(); // Descuento especial no se muestra en la vista
...
}
...
De esta manera podemos acceder a la propiedad
descuentoEspecial aunque no este visualizada en la vista actual.