Ver Informacion Usuario Logueado

Hola que tal.

Buenos dias!

Tengo una duda acerca de como es que puedo ver la informacion relacionada con determinad usuario.

He visto ejemplos donde del USerIdentity obtienen el ID del usuario logeado. y generan la consulta.

Pero mi duda es por ejemplo yo tengo dos tablas

USUARIO Y PROFESOR…

Usuario tiene la informacion del inicio de sesion, y Profesor tiene el id del usuario al que pertenece, para el inicio de sesion.

es decir

USUARIO

ID | USERNAME |PASSWORD

PROFESOR

ID | NOMBRE | CARGO | ID_user

Tengo una tabla MATERIAS

ID | MATERIA |PROFESOR |

Al ingresar al sistema el profesor quiero que solo pueda ver sus propias materias.

Pero quisiera saber como hacer esto.

Es decir como defino que el usuario tal se relaciona con el profesor, para que me de la informacion del usuario logueado.

Espero y me halla explicado…

Saludos.

Buenas, Mayrem.

Todos los usuarios que acceden a la aplicación son profesores? De ser así, te podría sobrar la tabla usuarios. Meterías el login y el password en la tabla profesor y listo.

De todas formas vamos con tu ejemplo.

Tendríamos las siguientes tablas:

user: user_id, username, pwd …resto de campos [tabla de usuarios]

teacher: teacher_id, user_id, … resto de campos [tabla de profesores]

subject: subject_id, … resto de campos [tabla de materias]

subject_teacher: subject_id, teacher_id, resto de campos [tabla de relación de materias con profesores]

Una vez tengas estas tablas, ya está.

Cuando entres al sistema con un usuario, este estará relacionado sí o sí con un profesor, que a su vez podrá tener 0, 1 o varias materias relacionadas.

Para mostrar sólo las materias del profesor tendrías que añadir la condición en la consutla que utilices y listo. Un ejemplo de consulta pura SQL sería:




SELECT 

     A.TEACHER_NAME, D.SUBJECT_NAME 

FROM 

     USER A 

     INNER JOIN TEACHER B 

          ON A.USER_ID = B.USER_ID 

          AND USER_ID = (aquí recoges el identificador del usuario logueado, por ejemplo Yii::app()->user->id)

     LEFT JOIN SUBJECT_TEACHER C 

          ON B.TEACHER_ID = C.TEACHER_ID 

     LEFT JOIN SUBJECT D 

          ON C.SUBJECT_ID = D.SUBJECT_ID 

ORDER BY 

     USER_ID 

ASC



Ten en cuenta q usando Yii supongo que utilizarás los widgets, criterias, dataproviders y modelos, con lo q esta consulta no la vas a hacer nunca completa.

Por ejemplo:




$teacher = TEACHER::model()->findByAttributes('USER_ID' => Yii::app()->user->id); // Recuperas un profesor mediante el identificador del usuario logueado


// Si tiene materias, puedes verlas por ejemplo así.

if(isset($teacher->relSubjects))// Considero que en tu modelo TEACHER tienes declarada la relation "relSubjects".

{

     foreach($teacher->relSubjects as $subject)

     {

          echo($subject->name);

     }

}



Supongo q es esto lo que preguntas.

Un saludo.

Hola que tal, lo que pasa es que tengo varios roles. Profesor, Alumno, Admin, Encargado.

Cada uno tiene diferentes Permisos, estoy usando el RBCA de yii, para lograr eso.

pero mi duda surge al momento de mandar llamar los valores.

MI TABLA MATERIA,con profesor.

Una materia es impartida por un profesor, y un profesor puede impartir muchas materias, por cuestion de la escuela, tengo el ID del profesor que da determinada materia, es decir.

MATERIA

Clave Nombre Profesor…

Esto tratando de que en mi vista Index, pueda ingresar como usuario Logueado, y ver las materias que estoy impartiendo yo como profesor.




	public function actionIndex()

	{


		$criteria=new CDbCriteria;

$criteria->condition = "maestro= ".Yii::app()->user->getId();

 

 $mismaterias=Materia_Maestro::model()->findAll($criteria);

 $dataProvider=new CActiveDataProvider('Materia_Maestro', array(

    'criteria'=> $criteria,

 ));


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

			'dataProvider'=>$dataProvider,

		));

	}



Pero esta condicion me pide el nombre del usuario, en la tabla materias la cual no existe, ya que se almacena el id del profesor, por ello me manda este error.




CDbCommand falló al ejecutar la sentencia SQL: SQLSTATE[42703]: Undefined column: 7 ERROR: no existe la columna «mayrem»

LINE 1: SELECT * FROM "materia" "t" WHERE maestro= mayrem

^. The SQL statement executed was: SELECT * FROM "materia" "t" WHERE maestro= mayrem



Ya he pensado hasta en relacionar la tabla usuario con materia, para asi hacerlo mas facil, pero no se si sea una mejor opcion,o que es lo que tengo que agregar, para que en vez de tomar el id del usuario, me de el id del profesor que se logueo.

Igual en la vista Admin, no encuentro la manera de filtrar que me muestre los campos del usuario logueado.

Ya que materia no se relaciona con Usuario…

Solo con profesor que a su vez si tiene relacion con usuario.

Estoy algo confundida en esto.

Por ejemplo si pongo este codigo en mi search




	  $criteria->compare('usuario',Yii::app()->user->id);




en la vista admin, me va a dar todos los registros que se relacionan con el usuario que inicio sesion, es un ejemplo.

Pero en vez de tomar el ID del usuario quiero tomar el id de otra tabla relacionada con el usuario.

Espero y puedas orientarme, por que mi alterminativa seria relacionar la tabla usuario en todo, pero no creo que sea una manera correcta de hacerlo.

Saludos.

Y gracias por tu respuesta.

Buenas de nuevo Mayrem.

Una materia sólo puede ser impartida por un profesor??? entonces no necesitas la tabla intermedia Materias_Profesores.

Creo que tu problema es que no tienes cogido el punto a q Yii es un framework MVC (Modelo-Vista-Controlador).

En primer lugar decirte que el error:




CDbCommand falló al ejecutar la sentencia SQL: SQLSTATE[42703]: Undefined column: 7 ERROR: no existe la columna «mayrem»

LINE 1: SELECT * FROM "materia" "t" WHERE maestro= mayrem

^. The SQL statement executed was: SELECT * FROM "materia" "t" WHERE maestro= mayrem



Se debe a que tu id es un string, con lo que debes encerrarlo entre comillas simples:




$criteria->condition = "maestro= '" . Yii::app()->user->getId() . "'";



Aunque no sé pq envías un dataprovider si sólo quieres mostrar los datos de un modelo en tu vista index… No tienes pq utilizar un DetailView para esto, puedes enviar un modelo a la vista index y simplemente mostrar los datos del mismo.

Segundo, al ser Yii un framework MVC, y teniendo bien definidos los modelos de datos, simplemente recogiendo un modelo MAESTRO ya tienes todo lo que exista relacionado con un maestro.

Te voy a poner un ejemplo con modelos (cambia los nombres de las propiedades por las tuyas, no te olvides) y suponiendo que una materia sólo pueda ser impartida por un profesor:




public function actionIndex()

{

     $model = Maestro::model()->findByAttributes('codigo_usuario' => Yii::app()->user->getId());


     $this->render('index', 

                    array(

                         'model'=>$model,

                         ));// Pasamos a nuestra vista index el modelo con TODOS los datos de nuestro profesor.

}



En tu modelo Maestro tendrás algo como (esto es muy importante, pq las relaciones son las que nos

permiten que el modelo profesor tenga todos sus datos relacionados en el momento de crearlo):




public function relations()

        {

                // NOTE: you may need to adjust the relation name and the related

                // class name for the relations automatically generated below.

                return array(

                        'relacion_materias' => array(self::HAS_MANY, 'Materias', 'codigo_profesor')

                );

        }



En tu vista index (simplemente te voy a hacer echos, tú lo formateas como quieras):




echo('Nombre profesor:' . $model->nombre_profesor);


echo('Materias impartidas:<br />');


if(isset($model->relacion_materias))// Si el profesor tiene materias.

{

     foreach($model->relacion_materias as $materia)

     {

          echo($materia->nombre_materia . '<br />');

     }

}



Si tuvieses una tabla intermedia en el caso de que una materia pudiese ser impartida por varios profesores, tendrías lo mismo, pero además para recuperar los datos de las materias tendrías que añadir la relación de la tabla intermedia con la tabla Materias: $model->relacion_t_intermedia[indice]->relacion_t_intermedia_materias por ejemplo.

En tu modelo Maestro:




public function relations()

        {

                // NOTE: you may need to adjust the relation name and the related

                // class name for the relations automatically generated below.

                return array(

                        'relacion_intermedia' => array(self::HAS_MANY, 'Materias_Profesor', 'codigo_profesor')

                );

        }



En tu modelo intermedio Materias_Profesor:




public function relations()

        {

                // NOTE: you may need to adjust the relation name and the related

                // class name for the relations automatically generated below.

                return array(

                        'relacion_t_intermedia_materias' => array(self::BELONGS_TO, 'Materias', 'codigo_materia')

                );

        }






echo('Nombre profesor:' . $model->nombre_profesor);


echo('Materias impartidas:<br />');


if(isset($model->relacion_t_intermedia))// Si el profesor tiene materias.

{

     foreach($model->relacion_intermedia as $rel)

     {

          if(isset($rel->relacion_t_intermedia_materias))

          {

               echo($rel->relacion_t_intermedia_materias->nombre_materia . '<br />');

          }

          else

          {

               echo('relación mal hecha o se eliminó la materia asociada);

          }

     }

}



Creo q no me he equivocado en el código.

Cualquier cosa ya sabes.

Un saludo.