Recuperar datos de un form

30 views
Skip to first unread message

Bruno Moscardini

unread,
Nov 12, 2022, 5:24:55 PM11/12/22
to KumbiaPHP Framework
Buenos dias, estoy con un trabajo para la facutlad y estoy teniendo problemas para recuperar los datos de un form.
Lo que estoy haciendo es un sistema de turnos para un aeroclub.
Cada turno tiene que guardar en la BD la aeronave a utilizar, el alumno, el instructor, la fecha, hora de comienzo y hora de fin. La cuestion es que los horarios no se pueden superponer asi que para cada aeronave y fecha elegida tengo que filtrar los horarios que se pueden elegir.
La forma de implementarlo que pense es que el usuario primero en una vista carge a traves de un formulario, la aeronave que se va a usar, el alumno, el instructor y la fecha y despues pasar a otra vista donde se le ofrezca solo los horarios disponibles.
El problema es que no se como mantener los datos que se cargan primero para despues guardarlos en la BD.
El codigo que tengo hasta ahora es:
code.png
Les agradeceria cualquier ayuda que me puedan brindar.
Saludos
Bruno.

Nelson Rojas Nuñez

unread,
Nov 13, 2022, 2:19:48 PM11/13/22
to KumbiaPHP Framework
Hola Bruno,

Gusto en saludarte. Te recomiendo hacer "un truco" aunque no es la única opción.

El primer formulario envíalo al controlador y almacénalo en la variable de sesión. Esa es una parte del truco. La segunda parte es la forma en la que uno genera el formulario en la vista. Usando las funciones de Kumbia, puedes definir por ejemplo Form::text('datos.nombre');
Cuando el formulario se renderiza en html, internamente aparecerá como <input type="text" id="datos_nombre" name="datos[nombre]" />
Luego, al momento de enviarlo con POST al controlador, puedes recibir el contenido completo de los elementos del formulario como:
$datos_del_formulario = Input::post('datos');

Con lo que obtendrás dentro de $datos_del_formulario un arreglo asociativo como:

['nombre' => 'valor_ingresado_en_el_texto_nombre']

Ahora es momento de usar la clase Session

Session::set('datos_del_formulario_fase_1', $datos_del_formulario);

Cuando pases a la vista 2, entonces podrás usar los datos que tienes en Session::get('datos_del_formulario_fase_1') dentro de la vista. Puedes usar la operación siguiente:

$datos_de_la_fase_1 = Session::get('datos_del_formulario_fase_1');

Aquí en $datos_de_la_fase_1 tienes el mismo arreglo asociativo que obtuvimos usado el Input::post(''datos"), es decir:
['nombre' => 'valor_ingresado_en_el_texto_nombre']

Puedes usarlo para pintar HTML común y corriente o crear un input en la vista 2 pasando los valores del arreglo asociativo o creas un input como HTML y le asignas el valor en la propiedad value, por ejemplo
<input type="text" readonly id="datos2_nombre" name="datos2[nombre]" value="<?=$datos_de_la_fase_1['nombre']?>" />

En la vista 2, puedes usar el contenedor datos2.atributo tal como usamos en la vista 1 datos.atributo.

En el controlador recibiremos Input::post('datos2') y con eso ya tendremos todos los elementos necesarios y entonces podemos guardar lo que sea necesario en la base de datos.

Espero que te sirva la idea. 

Si tienes dudas extras, son bienvenidas!

Saludos cordiales desde Talca, Chile :-)

Nelson Rojas.-

Nelson Rojas Nuñez

unread,
Nov 13, 2022, 2:25:38 PM11/13/22
to KumbiaPHP Framework
Hola nuevamente Bruno,

Otro truco es usar un "stepper" o "wizard" y llenar los elementos en una única vista y luego enviar todo el paquete al controlador para almacenarlo en la base de datos.

Si fuera necesario procesar alguna cosa entre una etapa y otra, es posible hacer alguna llamada de AJAX para pintar el contenido sin tener que recargar el formulario. 

Así, sin mucho más que hacer peticiones AJAX es posible también resolverlo sin la necesidad de usar la clase Session.

Si necesitas algún ejemplo me avisas.

Saludos cordiales,

Bruno Moscardini

unread,
Nov 13, 2022, 4:10:10 PM11/13/22
to KumbiaPHP Framework
Buenas tardes Nelson, muchas gracias por su respuesta, estoy intentando implementar lo que me indico con el Session, sepa usted disculparme pero estoy teniendo algunas dificultades para hacerlo, soy demasiado nuevo en esto de la programacion y recien llevo unos dias con KumbiaPHP.

Le comento lo que entendi he implemente.
Desde mi primer vista "altaTurnoAlumno.phtml", se selecciona la aeronave a utilizar, el alumno y el instructor (cada uno de una lista desplegable [SELECT] que se recupera de la BD) y la fecha del turno (mediante campo DATE), esto se envia por POST al controlador que seria "turno_controller.php" que en su function "altaTurnoAlumno" guardo los datos recibidos por POST desde el formulario de la vista en una variable con "$datos_form = Input::post('datosTurno');" y luego uso la clase Session "Session::set('datos_form1', $datos_form);"

En el Form::open de la primer vista me redirigo a la segunda vista "horarioTurno.phtml" con "Form::open('turno/horarioTurno');" y en el controlador "turno_controller.php" en su function "horarioTurno" recupero los datos del form con "$this->datosTurno = Session::get('datos_form1');"

¿Esta ahi iria bien? ¿Como podria mostar los datos del Session en la segunda vista, para comprobar que se hayan enviado?

Desde ya muchas gracias por todo y principalmente por la paciencia.
Saludos desde Argentina
Bruno.

Nelson Rojas Nuñez

unread,
Nov 13, 2022, 4:34:56 PM11/13/22
to KumbiaPHP Framework
Estimado Bruno, 

Si tienes un poco de paciencia, creo que te pasaré un ejemplo por la noche para que veas de qué manera se me ocurre lo que estás haciendo.

Saludos :-)

Bruno Moscardini

unread,
Nov 13, 2022, 4:36:58 PM11/13/22
to KumbiaPHP Framework
Obviamente Nelson no hay apuro, cuando puedas y tengas tiempo.
Muchas gracias por tu predisposicion y paciencia.
Estamos en contacto.
Saludos =)

Nelson Rojas Nuñez

unread,
Nov 14, 2022, 5:21:00 AM11/14/22
to KumbiaPHP Framework
Buen día Bruno,
Aquí va el código de ejemplo:

--- controlador ejemplo
<?php

class EjemploController extends AppController
{
    public function paso1()
    {
        //revisamos que la llamada post contenga los datos del formulario del paso 1
        if (Input::hasPost('datos1')) {
            $datos_paso1 = Input::post('datos1');
            Session::set('datos1', $datos_paso1);
            return Redirect::toAction('paso2');
        }
        //si no hay llamada post entonces solo dibujamos la vista
        //predeterminada paso1.phtml
    }

    public function paso2()
    {
        //revisamos que la llamada post contenga los datos del formulario del paso 2
        if (Input::hasPost('datos2')) {
            $datos_paso2 = Input::post('datos2');
           

            //hacer persistencia en la base de datos
            //pintar alguna vista de finalización del proceso
            //pasaremos los datos para verlos en la vista
            $this->datos_finales = $datos_paso2;
            View::select('final');
        }    
        //si no hay llamada post entonces solo dibujamos la vista
        //predeterminada paso2.phtml
        //pasamos los datos del paso 1
        $this->datos1 = Session::get('datos1') ?? array();
    }
}


--- vista paso 1: paso1.phtml
<h2>Paso 1</h2>

<?= Form::open() ?>
<label>Nombre</label>
<?= Form::text('datos1.nombre') ?>
<label>Apellido</label>
<?= Form::text('datos1.apellido') ?>
<label>Edad</label>
<?= Form::text('datos1.edad') ?>

<?= Form::submit('Enviar') ?>

<?= Form::close() ?>


--- vista paso 2: paso2.phtml
<h2>Paso 2</h2>

<?= Form::open() ?>
<!-- datos del paso 1 -->
<label>Nombre</label>
<?= Form::text('datos2.nombre', 'readonly', $datos1['nombre']) ?>
<label>Apellido</label>
<?= Form::text('datos2.apellido', 'readonly', $datos1['apellido']) ?>
<label>Edad</label>
<?= Form::text('datos2.edad', 'readonly', $datos1['edad']) ?>

<!-- datos del paso 2 -->
<label>Color Favorito</label>
<?= Form::select('datos2.color', ["rojo"=> "Rojo", "verde"=>"Verde", "azul"=>"Azul"]) ?>


<?= Form::submit('Enviar') ?>

<?= Form::close() ?>
<pre>
<?php var_dump($datos1); ?>
</pre>
--- vista final: final.phtml

Nelson Rojas Nuñez

unread,
Nov 14, 2022, 5:25:22 AM11/14/22
to KumbiaPHP Framework
Buen día Bruno,
Aquí va el código de ejemplo:
Nota: para que puedas probarlo deberías poder acceder usando la url localhost/nombre_de_tu_proyecto/ejemplo/paso1

--- Controlador de ejemplo: ejemplo_controller.php
<?php

class EjemploController extends AppController
{
    public function paso1()
    {
        //revisamos que la llamada post contenga los datos del formulario del paso 1
        if (Input::hasPost('datos1')) {
            $datos_paso1 = Input::post('datos1');
            Session::set('datos1', $datos_paso1);
            return Redirect::toAction('paso2');
        }
        //si no hay llamada post entonces solo dibujamos la vista
        //predeterminada paso1.phtml
    }

    public function paso2()
    {
        //revisamos que la llamada post contenga los datos del formulario del paso 2
        if (Input::hasPost('datos2')) {
            $datos_paso2 = Input::post('datos2');
            

            //hacer persistencia en la base de datos
            //pintar alguna vista de finalización del proceso
            //pasaremos los datos para verlos en la vista
            $this->datos_finales = $datos_paso2;
            View::select('final');
        }    
        //si no hay llamada post entonces solo dibujamos la vista
        //predeterminada paso2.phtml
        //pasamos los datos del paso 1
        $this->datos1 = Session::get('datos1') ?? array();
    }
}


--- vista Paso 1: paso1.phtml
<h2>Paso 1</h2>

<?= Form::open() ?>
<label>Nombre</label>
<?= Form::text('datos1.nombre') ?>
<label>Apellido</label>
<?= Form::text('datos1.apellido') ?>
<label>Edad</label>
<?= Form::text('datos1.edad') ?>

<?= Form::submit('Enviar') ?>

<?= Form::close() ?>

--- vista Paso 2: paso2.phtml
<h2>Paso 2</h2>

<?= Form::open() ?>
<!-- datos del paso 1 -->
<label>Nombre</label>
<?= Form::text('datos2.nombre', 'readonly', $datos1['nombre']) ?>
<label>Apellido</label>
<?= Form::text('datos2.apellido', 'readonly', $datos1['apellido']) ?>
<label>Edad</label>
<?= Form::text('datos2.edad', 'readonly', $datos1['edad']) ?>

<!-- datos del paso 2 -->
<label>Color Favorito</label>
<?= Form::select('datos2.color', ["rojo"=> "Rojo", "verde"=>"Verde", "azul"=>"Azul"]) ?>


<?= Form::submit('Enviar') ?>

<?= Form::close() ?>
<pre>
<?php var_dump($datos1); ?>
</pre>


--- vista final: final.phtml
<h2>Final</h2>
<pre>
<?php
//mostrar el contenido resultante entre el paso 1 y el paso 2
var_dump($datos_finales);
?>
</pre>


Suerte con la idea :-)

Bruno Moscardini

unread,
Nov 14, 2022, 3:45:45 PM11/14/22
to KumbiaPHP Framework
Buenos dias Nelson, perdón por la demora en agradecerte, estaba estudiandolo a detalle y adaptandolo mi proyecto.
La verdad te debo la vida me sirvio muchisimo tu explicacion con el ejemplo, estoy recien iniciando y muchas cosas aun me cuesta verlas o implementarlas solo.
Te agradezco muchisimo tu tiempo y predisposicion para ayudarme, me sirvio muchisimo!
Saludos desde Argentina.
Bruno.

Nelson Rojas Nuñez

unread,
Nov 14, 2022, 7:47:12 PM11/14/22
to kum...@googlegroups.com
Saludos Bruno,

Me alegro de que el ejemplo te haya servido.

Cualquier cosa no dudes en escribirme o escribir al grupo.

Cordialmente,
Nelson Rojas

--
Viva KumbiaPHP Framework!
http://www.kumbiaphp.com/
Ha recibido este mensaje porque está suscrito a Grupo "KumbiaPHP Framework" de Grupos de Google.
Para obtener más opciones, visita este grupo en http://groups.google.com/group/kumbia?hl=es.
---
Has recibido este mensaje porque estás suscrito a un tema del grupo "KumbiaPHP Framework" de Grupos de Google.
Para cancelar la suscripción a este tema, visita https://groups.google.com/d/topic/kumbia/9UDbsP5EraI/unsubscribe.
Para cancelar la suscripción a este grupo y a todos sus temas, envía un correo electrónico a kumbia+un...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/kumbia/fd638210-87b1-43ab-b39f-212ec571adb3n%40googlegroups.com.


--
Reply all
Reply to author
Forward
0 new messages