Ver Mensaje Individual
  #3  
Antiguo 11-05-2007
semptrion semptrion is offline
Miembro
 
Registrado: abr 2007
Posts: 112
Reputación: 20
semptrion Va por buen camino
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

Última edición por semptrion fecha: 11-05-2007 a las 03:56:35.
Responder Con Cita