Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   PHP (https://www.clubdelphi.com/foros/forumdisplay.php?f=15)
-   -   Formulario variable. (https://www.clubdelphi.com/foros/showthread.php?t=43039)

Shadowless 30-04-2007 01:51:53

Formulario variable.
 
Saludos !!!
Estoy intentando crear una base de datos con MySQL introduciendo los datos mediante formularios en PHP.
El problema es que necesito que, dependiendo del valor escogido en una lista desplegable ( por ejemplo el número de miembros de un equipo ) el número de campos en el formulario varíe manteniendo los datos introducidos anteriormente en otros campos.
Esto es posible ? Puedo redirigir el formulario hacia otro manteniendo esos datos o puedo modificar el formulario actual ?
Muchas gracias por adelantado, si no me he explicado muy bien decidmelo por favor. ^_^

lucasarts_18 30-04-2007 03:36:06

Cita:

Empezado por Shadowless
Saludos !!!
El problema es que necesito que, dependiendo del valor escogido en una lista desplegable ( por ejemplo el número de miembros de un equipo ) el número de campos en el formulario varíe manteniendo los datos introducidos anteriormente en otros campos.
Esto es posible ?

Claro que sí, pero debes ser tu mismo el que asigne nuevamente los valores a esos campos, ya que cada vez que haces submit a un formulario los campos se envian al servidor y por lo tanto se limpian automáticamente de los controles

Cita:

Empezado por Shadowless
Puedo redirigir el formulario hacia otro manteniendo esos datos o puedo modificar el formulario actual ?

a ver, si vas a otro formulario, te estás yendo a otra página, de tal forma vas sí o sí a perder los datos, en realidad lo que debes hacer es cargar la misma página asignando los respectivos valores a los campos anteriores, esto se puede hacer....mirate este enlace, puede que te sirva

Hasta Luego .-

dec 30-04-2007 03:38:19

Hola,

Cita:

Empezado por Shadowless
El problema es que necesito que, dependiendo del valor escogido en una lista desplegable ( por ejemplo el número de miembros de un equipo ) el número de campos en el formulario varíe manteniendo los datos introducidos anteriormente en otros campos.
Esto es posible ?

Yo creo que sí que puede hacerse... habrás visto por ahí varios ejemplos, pero, creo que ya no sería PHP sino JavaScript el que tendría que venir en nuestra ayuda. O a lo menos creo que en principio sería lo más razonable.

Cita:

Empezado por Shadowless
Puedo redirigir el formulario hacia otro manteniendo esos datos o puedo modificar el formulario actual ?

No se entiende muy bien el asunto. Supongamos un Script A que termina imprimiendo un formulario A. El Script que ha de hacerse cargo de dicho formulario (indicado en el "action" del formulario) no tiene porqué ser el Script A, podría ser el Script B.

Y nada impide que el Script B imprima otro formulario utilizando o no los datos que le llegasen del formulario del Script A. Vamos, que, en principio, no habría problema en hacer algo así: falta que concretes y te pongas a ello y comentes los problemas que te encuentres.

lucasarts_18 30-04-2007 05:08:56

Ahora que veo metido a javascript en el cuento, me he confundido :confused: , parece que entendí mal el asunto, ahora con la respueta de dec, no sé si nuestro amigo Shadowless está pensanso mantener los valores y cambiar el número de campos del formulario dinamicamente, mmmm de todas maneras coincido con dec :) , está confuso el tema.....

Shadowless 30-04-2007 13:54:14

Hola !!!
Muchas gracias por la ayuda!!! Pero como veo que el tema está un poco confuso voy a intentar especificar más.
El caso es que necesito hacer un formulario para introducir grupos de trabajo en la base de datos. Así que tengo un campo para "título del trabajo", "director" etc.
Sin embargo, para el número de miembros del equipo, no hay un número fijo.
De modo que había pensado en poner una lista desplegable para poder elegir el número de miembros y así organizar otro formulario con la correspondiente cantidad de campos para los nombres.
Lo que no sé hacer es, redirigir o crear este nuevo formulario sin perder la información que hayan introducido en los campos de arriba.
Si se les ocurre otra forma de hacerlo distinto de la lista desplegable se los agradecería mucho tb.

Suerte y gracias !!!

roman 01-05-2007 01:31:46

Cita:

Empezado por Shadowless
Si se les ocurre otra forma de hacerlo distinto de la lista desplegable

A ver qué te parece este ejemplo.

Cada vez que oprimas el botón "Agregar", se agregará un nuevo <input> para un nuevo miembro sin necesidad de cambiar de página. Cuando has puesto todos, mandas los datos como con cualquier otro formulario.

// Saludos

Shadowless 01-05-2007 21:42:54

Muchas gracias por la ayuda !!! Creo que ya he solucionado parte del problema y además he aprendido a manejar mejor los métodos. ^_^
Un último detalle por favor.
Qué propiedad debo usar y dónde, para que los campos que se generen estén alineados en el centro en lugar de la izq ?
Muchas gracias.
Un saludo.

dec 01-05-2007 21:47:04

Hola,

Si te refieres a centrar el texto de los "input" entonces puedes usar algo así:

Código:

<input type="text" style="text-align: center" />
Si lo que quieres es centrar los propios "input" entonces algo como esto:

Código:

<div style="text-align: center">
 <input type="text" />
</div>


semptrion 11-05-2007 03:49:43

Un método un poco gastado pero que funciona
 
Para cargar datos (cuyo número es variable) utilizo la técnica de colocar varias filas de los datos requeridos en blanco.

Más o menos defino lo siguiente:

Una tabla padre (la de los datos del grupo)

Una tabla de hijos (la de los datos de los miembros del grupo)

Por costumbre, los datos de la tabla padre se colocan en la parte superior del formulario:
Código:

Nombre del grupo: [_______________________]
Título del trabajo: [_______________________]
Director: [___________________v]
etc.

y luego, en cada fila los nombres de los miembros del grupo:
Código:

Nombre                      Campo2              Campo3        Eliminar
-----------------------------------------------------------------------------
[Juan Pérez_____]        [foo__________]        [foo______]    [ ]
[Fulano de Tal___]        [foo__________]        [foo______]    [ ]
[Mengano de cual]        [foo__________]        [foo______]    [ ]
.
.
.

y luego espacios vacíos para colocar otros nombres (nótese que no hay eliminar):
Código:

[______________]        [______________]        [_________]
[______________]        [______________]        [_________]
[______________]        [______________]        [_________]
[______________]        [______________]        [_________]
[______________]        [______________]        [_________]

La cantidad de filas "en blanco" depende de la aplicación del formulario. Algunos serán suficientes con tres, otros con uno, quizá otros con diez. Por ejemplo si lo normal es que sean equipos de diez personas, se colocarán cinco líneas en blanco (de tal manera que en dos grabaciones se alcance el total).

Una vez que se envíe el formulario, al aparecer los datos en pantalla, nuevamente aparecerán la misma cantidad original de líneas en blanco (por si sea un equipo de 14 miembros). Y así sucesivamente.

La lógica de programación será que cada uno de los inputs, selects o buttons de la tabla de hijos tendrá, en el nombre de la variable, una conformación de array asociativo bidimensional donde la primera llave será el id del registro y la segunda el nombre del campo.

Por ejemplo, si ya existen tres registros en la tabla de hijos con los ids 123, 811 y 2314 los inputs tendrán la forma:
Código:

<input name="hijos[123][nombre]" type="text" value="Juan Pérez" />
<input name="hijos[811][nombre]" type="text" value="Fulano de Tal" />
<input name="hijos[2314][nombre]" type="text" value="Mengano de Cual" />

Si fuesen selects, serán:
Código:

<select name="hijos[123][campo2]" >...</select>
<select name="hijos[811][campo2]" >...</select>
<select name="hijos[2314][campo2]" >...</select>

Para los registros nuevos, se utilizarán número negativos descendientes:
Código:

<input name="hijos[-1][nombre]" type="text" value="" />
<input name="hijos[-2][nombre]" type="text" value="" />
<input name="hijos[-3][nombre]" type="text" value="" />
<input name="hijos[-4][nombre]" type="text" value="" />
etc.

Para recuperar los datos en el PHP, se empleará un array asociativo regular.

P.e.
Código PHP:

$hijos $_POST['hijos']; 

y luego se procederá a grabarlos:
Código PHP:

foreach( $hijos as $id => $campo ) {
    
/* Validar los campos del registro */
    
if ( $id && empty( $campo['nombre' ) ) {
        
$error[$id] = 'No se ha colocado el nombre';
    }
    
/* ...y otras validaciones */
    /* si todo está ok, entonces grabaremos o insertaremos, según el id */
    
if ( $id ) {
        
$query 'update miembros set '
            
' nombre=' $campo['nombre']
            . 
', campo2=' $campo['campo2']
            . 
', campo3=' $campo['campo3']
            . 
' where id = ' $id;
        
/* ejecutamos el query, como sea que lo hagamos */
     
} else {
        
$nuevoId generarId'miembros' );
        
// se supone que conocemos el id del grupo $idGrupo
        
$query 'insert into miembros '
             
'( id, idgrupo, nombre, campo2, campo3 ) values ( ' 
            
', ' $nuevoId
            
', ' $idgrupo
            
', ' $campo['nombre']
            . 
', ' $campo['campo2']
            . 
', ' $campo['campo3']
             . 
')';
        
/* ejecutamos el query, como sea que lo hagamos */
    
}


En cuanto al tema de centrear el contenido de un control, sugiero que se utilicen clases css. Por ejemplo,
Código:

<input type="text" class="center" />
Y luego definir en el css:
Código:

.center { text-align: center; }
Así, el control es estructural y el formateo es semántico, dejando la apariencia donde debe estar: en el css.

Espero te sirva.

Saludos

Shadowless 13-05-2007 18:50:04

Muchas gracias por la ayuda !!!
Lamento ho haber contestado antes pero es que no he tenido internet en un tiempo.
Probaré el método que me dices semptrion, que parece interesante, aunque he utilizado el ejemplo de roman y ya he podido resolver un poco el problema.
Una pequeña duda y ya dejo de incordiar.
Cómo puedo introducir una variable de control para limitar el número de campos que se pueden crear mediante un método ?
Muchas gracias de antemano.

dec 13-05-2007 21:11:45

Hola,

Cita:

Empezado por Shadowless
Cómo puedo introducir una variable de control para limitar el número de campos que se pueden crear mediante un método ?

Siguiendo el código fuente de Román podríamos añadir algo como esto:

Código PHP:

<script type='text/javascript'>

/**
 * Máximo número de miembros
 */
MAX_MIEMBROS 4;

/**
 * Número total de miembros
 */
totalMiembros 0;

function 
docLoad()
{
  
/**
   * Guardamos una referencia a la lista de miembros
   */
  
oDivMiembros document.getElementById("miembros");
}

function 
agregarMiembro()
{
  
/**
   * Si el número de campos supera el máximo no continuamos
   */
  
if(totalMiembros >= MAX_MIEMBROS){
    
alert('Superaste el número máximo de miembros');
    return 
false;
  }

  
/**
   * Creamos un objeto input para un nuevo miembro
   */
  
var oInput document.createElement('input');
  
  
/**
   * Asignamos propiedades
   */
  
oInput.type 'text';
  
oInput.name 'miembros[]';

  
/**
   * Insertamos el objeto input en la lista de miembros
   */
  
oDivMiembros.appendChild(oInput);
  
  
/**
   * Incrementamos la variable para el "control" del número de miembros
   */
  
totalMiembros++;

  
/**
   * Ponemos el foco del teclado en el cuadro de texto insertado
   */
  
oInput.focus();
}
</script> 


roman 14-05-2007 06:20:15

A lo apuntado por dec, sólo añadiría que además de la restricción por javascript, deberemos hacer la propia en el script php que reciba los datos. Saltarse el javascript puede ser relativamente fácil, y si la restricción en el límite de elementos es importante para tu sistema, no debes confiar en lo que venga del cliente y hacer tus propias comprobaciones del lado del servidor.

// Saludos


La franja horaria es GMT +2. Ahora son las 13:03:19.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi