Crud Dentro De Otro

Hola de nuevo!

Si bien entiendo bien el concepto de MVC, me cuesta imaginar la forma correcta de hacer la aplicación.

Tengo un crud llamado eventos, y tengo otro que se llama personas, ambos funcionan bien, tienen selects dependientes y todo. El tema es que necesito asignar personas a cada evento, que personas sea "hijo" de eventos, y que cada persona que yo cree se guarde como perteneciente a dicho evento.

En otras palabras, necesito que la estructura sea…

Inicio>Eventos>Personas

Y no

[b]

[i]Inicio>Eventos

Inicio>Personas[/i][/b]

como está actualmente.

¿Cómo podría lograr esto?

Saludos.

Buenas.

En una arquitectura MVC (Model - View - Controller) lo que vas a tener es eso:

  • modelos, vistas y controladores.

Cada modelo tiene un controlador y una serie de vistas. Eso es así!!!!

Por otro lado, por supuesto puedes hacer lo q quieres. Pero para ello siempre ha de existir un modelo de eventos y un modelo de personas, relacionados mediante las correspondientes relaciones.

Entiendo que por un lado querrás tener el CRUD para personas y por otro lado el CRUD para eventos.

Lo único que tienes que hacer es modificar la vista "_form" de eventos para que además de sus propios campos, muestres una lista, combo o lo que sea mediante el cuál puedas seleccionar las personas asociadas a ese evento.

Cuando ese form se envíe, en el controlador de eventos guardarás los datos de los eventos y de las personas relacionadas.

PERO LA ESTRUCTURA DE LOS DATOS SERÁ SIEMPRE LA MISMA!!!!!!! LO QUE PUEDES CAMBIAR ES LA FORMA DE VISUALIZARLOS, O SEA, LAS VIEWS!!!!

Por supuesto en lugar de seleccionar las personas en el form de eventos podrías crearlas y relacionarlas, o lo que quieras, pero será en el form de eventos!!!!!

Una extensión que te pude ser útil:

SelGridView

Un saludo.

Gracias por responder. Exactamente estoy tratando de cargar diferentes vistas.

Asumiendo que tengo:


views/

--eventos/

-----index.php

-----create.php

--personas/

-----index.php

-----create.php

¿Cómo yo puedo cargar la vista create de personas desde el controlador evento?

En el controlador de evento tengo esto:


public function actionPersonas(){

	$persona = new Persona();


	$this->render('create',array(

		'model' => $persona

	));

}

pero esto carga la vista create de eventos. También intenté con:


$this->render('personas/create',array(

	'model' => $persona

));

y no funciona. ¿Cuál sería la forma correcta de hacerlo?

Saludos.

Buenos días.

Ya te lo expliqué en el anterior comentario.

No tienes q cargar la vista de personas en la de eventos. Tienes q modificar la vista de eventos y añadir una parte que sea una "copia" de la vista de personas. Por ejemplo:




views/

eventos/

     index.php

     _form.php

     create.php

     _personas.php



Y después en el _form.php:




$this->renderPartial('_personas');



Si te fijas en la cabecera de por ejemplo el "create" te pone esto:




/* @var $this ToEventosController */

    /* @var $model ToEventos */



Por tanto, este controlador no puede cargar una vista ‘personas/create’ pq para él no existe. De ahí q tengas q crear tu propia vista personas dentro de la estructura de eventos.

Recuerda q en _personas.php no debes de crear otro form, sino hacer la llamada a renderPartial dentro del form de eventos.

Un saludo.

Hola,

Seguí tus pasos, pero me queda un dato volando.

Retomando el problema inicial, al ver en detalle un evento necesito agregar personas a ese evento. De modo que en el controller de eventos, cargo el modelo y el trozo de la vista de personas (creada dentro de la estructura eventos).

Ahora, estando dentro de eventos>personas, ¿cómo puedo obtener el ID del evento para guardar la persona bajo ese evento? ¿Cómo le paso ese parámetro?

Buenos días.

Una vez tienes todo lo q me comentas, harás un envío del formularioo mediante POST.

Entonces en tu controlador tendrás algo como esto:




...

if($modelEventos->save())

{

...



Entonces lo único que tienes q hacer es recuperar el id del evento después del save, con lo q te quedaría de la sifuiente forma:




...

if($modelEventos->save())

{

     if(isset($_POST['personas']))

     {

     $modelPersonas->attributes = $_POST['personas'];


     $modelPersonas->evento_id = $modelEventos->evento_id;

     ...

...



Un saludo.

Lo primero lo entendí, sin embargo, recuperar el id el evento no me queda claro y es donde estoy parado. ¿Cómo paso u obtengo $modelEventos->evento_id;?

Cuando yo estoy viendo el detalle del evento id 2, actionView del controlador eventos (/eventos/2), en el sidebar tengo un menu que dice "Asignar personas", el cual me carga el formulario de las personas /eventos/personas.

Entonces, de alguna manera yo tengo que pasarle a la vista /eventos/personas el id del evento. Probé pasarlo por GET poniéndole a los links del sidebar el id del modelo evento en cuestion: /eventos/personas/2

Con esto, puedo obtener el modelo con




$evento = $this->loadModel($id);



Entonces, más lo tuyo sería




$modelEventos = $this->loadModel($id);

$modelEventos->evento_id;



El tema es de donde saco $id, ¿es correcto que lo pase por GET? ¿No hay una forma más ortodoxa de hacerlo?

Gracias por la ayuda ;)

Buenos días.

De las forma q lo tienes diseñado, pues creo q se la tendrás q pasar por GET.

Puedes por ejemplo enviarlo encriptado para más seguridad.

Yo lo q hago normalmente (cogiendo tu ejemplo) es tener en el formulario de eventos una zona donde puedo asignar una persona (por ejemplo usando CJuiTabs), con lo q puedo ir añadiendo personas al evento. Y como estoy en el controlador de eventos y voy a ir a update o create de eventos, ahí ya tengo el id sin necesidad de pasarlo mediante GET. Lo único q tengo q hacer es enviar el formulario del evento con sus datos POST (con lo q tendré su id) y guardar la persona recogiendo sus datos POST, ya q desde el formulario de eventos puedo enviar los datos de un modelo persona.

Un saludo.

Perfecto, ahora me queda mucho más claro.

Muchas gracias por la ayuda y tu tiempo ;)

Para eso estamos, un saludo.