Foros del Web » Programación para mayores de 30 ;) » Java »

Problema al usar PartialTriggers y AutoSubmit en un formulario entre dos campos.

Estas en el tema de Problema al usar PartialTriggers y AutoSubmit en un formulario entre dos campos. en el foro de Java en Foros del Web. Hola! disculpad si esta no es la sección adecuada para plantear mi duda. Intentaré ser conciso. Plantearé lo que quiero hacer y me gustaría saber ...
  #1 (permalink)  
Antiguo 13/05/2008, 03:12
Avatar de Llave  
Fecha de Ingreso: abril-2005
Ubicación: Galicia
Mensajes: 52
Antigüedad: 19 años
Puntos: 1
De acuerdo Problema al usar PartialTriggers y AutoSubmit en un form entre dos campos. (SOLVED)

Hola! disculpad si esta no es la sección adecuada para plantear mi duda.

Intentaré ser conciso. Plantearé lo que quiero hacer y me gustaría saber si es posible, de no serlo... si alguien me pudiese orientar sobre una alternativa sería genial.

Veamos.
Estoy utilizando clases JAVA y Trinidad para JSF.
En una plantilla JSP debo mostrar diversos campos de unas construcciones. Estas se cargan de una lista que me da el Bean, esta lista la muestro mediante una tabla, contenida en un formulario en el JSF.
Cada una de las construcciones muestra datos editables, de forma que, si modifico uno de esos campos, otros campos se recalcularán.

Os mostraré el ejemplo con el que estoy trabajando, una vez consiga lo que quiero aquí, ya lo usaré para el proyecto con el que estoy trabajando.

Supongamos que tengo 3 construcciones A,B,C y para cada una de ellas tengo tres campos editables CANTIDAD, dias/unidad, unidades/dia.

Si modifico el contenido de dias/unidad, automáticamente, cuando me mueva de campo se actualizará unidades/día. Esto lo sé hacer. El problema, es que quiero que, si modifico unidades/día, se me actualice días/unidad. Y ahí es donde no consigo que funcione.

Para hacer esto, tengo una clase con getters y setters para los dos métodos que me dan ese cálculo.

No sé si me estaré liando demasiado, disculpad si es así, me gustaría que no hubiera dudas en cuando a lo que quiero lograr.
Un dibujo de ejemplo de los campos podría ser algo como esto:


Y el código que estoy usando en JSP es el siguiente

Código PHP:
<tr:table id="constructionTable" value="#{Bean.constructionList}" var="construction">
<!-- 
CANTIDAD -->
    <
tr:column>
        <
f:facet name="header">
            <
tr:outputText value="Cantidad"/>
        </
f:facet>
        <
tr:inputText id="amount" 
        
columns="8"
        
value="#{construction.constructionClass.numUnits}" required="true">
        <
f:convertNumber type="number" pattern="0.00" />
        </
tr:inputText>
    </
tr:column>

<!-- 
DIAS/UNIDAD -->
    <
tr:column>
        <
f:facet name="header">
            <
tr:outputText value="Dias/unidad"/>
        </
f:facet>
        <
tr:inputText id="daysperunit" 
        
columns="5"
        
partialTriggers="unitsperday"
        
autoSubmit="true"
        
value="#{construction.constructionClass.operDaysPerUnit}" required="true">
        </
tr:inputText>
    </
tr:column>

<!-- 
UNIDADES/DIA -->
    <
tr:column>
        <
f:facet name="header">
            <
tr:outputText value="Unidades/dia"/>
        </
f:facet>
        <
tr:inputText id="unitsperday" 
            
columns="5"
            
autoSubmit="true"
            
partialTriggers="daysperunit"
            
value="#{construction.constructionClass.operUnitsPerDay}" required="true">
        </
tr:inputText>
    </
tr:column>
</
tr:table
El caso es que para lograr esta "actualización de campos", los inputText que deben "modificar" otros campos deben reenviar el formulario. Es por ello que les puse:
autoSubmit="true"
Así, si modifico el valor de ese campo me aseguro el envío del formulario. Y luego, en el inputText que debo recargar por que ha sufrido cambios le añado el
partialTriggers=" id del que causó el origen del evento".

Si tengo el autosubmit en DIAS/UNIDAD y el partialTriggers en UNIDADES/DIA va perfecto. Siempre que modifico DIAS/UNIDAD, UNIDADES/DIA se recalcula tal y como deseo.
Pero... en cuando añado el autoSubmit a UNIDADES/DIA y el PartialTriggers a DIAS/UNIDAD me ocurre lo siguiente:

- En ocasiones me actualiza los valores funcionando bien y en otras ocasiones me "restaura los valores" manteniendo el mismo valor que tenía antes del cambio.
He mirado por qué era esto y es debido a que... cuando se realiza el reenvío del formulario, si el SETTER que se realiza primero es el del campo que he modificado, todo funciona bien, se recalculan los campos y obtengo el resultado esperado. Pero si el SETTER que se realiza primero es el del otro campo, el que se recalcula es el campo que quiero modificar y se pierde el dato que quería modificar.

¿Alguien sabe como podría solucionarlo? Gracias.

PD: Este problema ya lo tuve en otra ocasion, sólo que, entonces no tenía una lista y pude utilizar un par de métodos en el Bean para "salir del paso". En este caso, al tener la lista, el Bean me sirve de poco y... no querría modificar los métodos de la clase que tengo en el modelo, para no hacerlos dependientes de la interfaz.

Un saludo.

Última edición por Llave; 15/05/2008 a las 04:02 Razón: Añadir "solved"
  #2 (permalink)  
Antiguo 15/05/2008, 03:58
Avatar de Llave  
Fecha de Ingreso: abril-2005
Ubicación: Galicia
Mensajes: 52
Antigüedad: 19 años
Puntos: 1
De acuerdo Re: Problema al usar PartialTriggers y AutoSubmit en un formulario entre dos campos.

Ya hallé una solución.

Lo que hice fue "clonar" la clase del modelo en el Bean de este JSP.
Lo hice así para que a la hora de llamar a los setters y getters, llamo a los de mi clase "clonada".

Esta clase "clonada" contiene dos variables privadas que guardarán una copia de la clase original del modelo y una clase "copia" que será sobre la que realizaré los setter y getters desde el JSP.

No sé si me expliqué bien, la idea es hacer los setters hacia la clase clonada, esta, en sus setters lo primero que hace es comprobar si el valor que me lleva por parámetro y el de la clase original es el mismo, si es así, no hago nada, en caso contrario guardo el valor en la clase "copia".

Al final, cuando las ediciones sobre el JSP acaben y pulsen la tecla "guardar". Hago un volcado de la clase copia sobre la clase original y esta la sobreescribo sobre el modelo.

Código PHP:

// Clase Clone de Construction. Haremos los setters sobre esta clase para comprobar qué campos cambian realmente.
public class ConstructionClone implements Construction
{
 
// Aquí vendrían los getter y los setters de los métodos del modelo. Pondré 2 a modo de ejemplo.
    /// getter of _numUnits. 
    
public int getNumUnits() { return _copy.getNumUnits(); }

    
/// setter of _numUnits
    
public void setNumUnits(int val)
    {
        
int originalVal _original.getNumUnits(); 
        if (
val != originalVal)
        {
            
// Es distinto al original, luego hay cambios en este parámetro. Llamo al setter de la copia.
            
_copy.setNumUnits(val);
        }
        
// En caso de ser igual al original no hago nada, ya que entiendo que no se modifica el valor.
    
}
    
    
/// Este método recupera del original los datos (eliminando los que tengamos en la copia actual)
    
public void restoreFromOriginal() { //TODO: Pendiente... }

    /// Este método realiza el volcado de la copia al original ("save"). Usar con cuidado.
    
public void copyToOriginal() { //TODO: Pendiente... }

//----------------- Private zone --------------
    
private Construction _original = new Construction();
    private 
Construction _copy = new Construction();

Más o menos la idea es esa. A mi me ha servido :)

Última edición por Llave; 15/05/2008 a las 04:03
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:34.