[Resuelto] Solo El Usuario De Destino Puede Veer Los Mensajes (Telegramma)

Hola, antes que todo, les pido desculpa poi mi espanol. He trabajado dos anos y medio en espana y hace mucho tiempo que tampoco escribo en este fantastico idioma.

Tengo un problema con las relaciones entre 4 tablas.

Tengo 5 tablas:

user:

-id ->PrimaryKey

–agenzia_id

—username

----password

-----session

------data_de_registro

agenzia:

-id->PrimaryKey

–nome

—codice

----nome_completo

cap_agenzia:

cap_gestiti_id

agenzia_id

cap_gestiti:

-id->PrimaryKey

–agenzia

—cap

----comune

-----provincia

------regione

telegramma:

-id->PrimaryKey

–id_cap_gestiti

—nome

----cognome

-----indirizzo

------civico

-------cap_dest

--------comune

---------provincia

User esta relacionado a Agenzia con BELONGS_TO (1 Agenzia tiene muchos usuario)

Agenzia esta relacionado a Cap_Gestiti con MANY_MANY gracias a la tabla cap_agenzia en la qual tengo el id de Agenzia e el ide de User.

Yo quiero che en la vista de Telegrammas cada Agenzia (o usuario) pueda veer solo los telegrammas que se les assignan gracias a el cap (zip-code) con el cual cada Agenzia esta relacionada. En el form Telegramma en el campo “cap_dest” (zip-code) se inserta el cap (zip-code) de destino. Cada cap (zip-code) esta liado a una Agenzia. En tonces en la vista quiero que cada Agenzia pueda veer solo sus telegrammas y assignarle l’ estado “consegnato” o “non consegnato”. No se si me vais a entender y por eso pido disculpa otra vez. Si alguien me entiende o entiende tambien un poco de italiano se lo voy a esplicar en italiano tambien…seguro que lo vais a intender mejor. He ententado de escribir en el foro italiano…pero aun creo que vos otros aun soys mas adelante en yii. Si algo yo he apprendido se lo devo todo a Gustavo Salgado y a sus tutorials que tambien ha echo en colaboracion con Codigo facilito. Si les puede servir puedo pegar tambien mis model o controllers para que vean las relaciones. Gracias a todos los que me van a entender y me puedan dar un ayuda.

Hola, por lo que se ve no tiene mucha complicaciones lo que quieres realizar, solo faltan especificar un poco mas para ayudarte.

Primero, tendrías que poner a funcionar el modulo de usuarios, veo que tienes una tabla con el nombre user donde van a estar registrados todos los usuarios. Tendrías que hacer todo el procedimiento para que los usuarios sean validados por esa tabla a la hora de hacer login ( iniciar sesión ). no se que tan adelantado estés en esta parte

segundo tendrías que tener una vista genérica donde se muestren todos los Telegramma guardados y a partir de allí modificar el controlador o modelo para realizar el filtro. YII a través del crud te proporciona dos: el admin y el index, deberás elegir cual formato te gusta mas y entonces comienza la operación.

estaré por acá ayudándote, depende de lo que decidas y te vaya saliendo.

Saludos cordiales…

Hola xavieremv, y antes que todo, gracias por su respuesta. Los usuarios ya estan validandose por esa tabla. El login ya lo he preparado y todo funciona bien. La vista generica que dices la tengo que crear yo con el query sql? Ya tengo la index y las hotras vistas que yii crea gracias a el crud. Lo que no llego hacer es el filtro para que cada Usuario (relacionado con su agenzia de apartenencia y con sus cap (zip-code) de apartenencia) peuda ver solo sus telegramas. He entendado hacerlo pero no me sale. Qualquier usuario puede veer todos los telegrammas y eso no es bueno por lo que quiero hacer yo. Lo que tengo en mi vista index es esto para que se filtren los telegrammas:

public function actionIndex()

{


	$utente = User::model()->findByPk( Yii::app()->user->id );


            $telegramma = $utente->telegramma;


	$dataProvider=new CActiveDataProvider('Telegramma');


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


		'dataProvider'=>$dataProvider,


	));


}

El query que se executa en la vista index es esto:

Querying SQL: SELECT telegramma.id AS t1_c0, telegramma.nome_mitt

AS t1_c1, telegramma.cognome_mitt AS t1_c2,

telegramma.indirizzo_mitt AS t1_c3, telegramma.civico_mitt AS

t1_c4, telegramma.cap_mitt AS t1_c5, telegramma.citta_mitt AS

t1_c6, telegramma.provincia_mitt AS t1_c7, telegramma.stato_mit

AS t1_c8, telegramma.nome_dest AS t1_c9,

telegramma.cognome_dest AS t1_c10, telegramma.indirizzo_dest AS

t1_c11, telegramma.civico_dest AS t1_c12, telegramma.cap_id AS

t1_c13, telegramma.citta_dest AS t1_c14,

telegramma.provincia_dest AS t1_c15, telegramma.stato_dest AS

t1_c16, telegramma.parole AS t1_c17, telegramma.prezzo AS

t1_c18 FROM telegramma telegramma LEFT OUTER JOIN agenzia

agenzia ON (agenzia.cap_id=telegramma.cap_id) WHERE

(agenzia.id=:ypl0)

He entendado tambien de crear hotra vez el database con estas tabalas:

user:

  • id ->Primary Key (integer)

++ nome (varchar)

+++ codice (varchar)

++++ nome_completo (varchar)

+++++ session (varchar)

agenzia:

  • id ->Primary Key (integer)

++ nome (varchar)

+++ codice (varchar)

++++ nome_completo (varchar)

+++++ cap_id (varchar)

cap:

  • id ->Primary Key (integer)

++ cap (varchar)

+++ comune (varchar)

++++ regione (varchar)

+++++ agenzia_id (varchar)

cap_agenzia:

  • id -> Primary Key (integer)

++ cap_id (integer)

+++ agenzia_id (integer)

telegramma:

  • id -> Primary Key

++ varios campos de destino

+++ cap_id (varchar) = estos es el campo (zip-code) que tiene que decirle a Yii que este cap (zip-code) esta liado a el agenzia que tambien esta liada a el usuario.

Un Agenzia puede tener varios Usuarios.

Tambien puede tener varios cap (zip-code) que son de su competencia

Tambien puede tener varios telegrammas en su vista por lo que he dicho antes (1 Agenzia puede tener varios cap de competencia)

He puesto tambien nuevas relaciones:

Model User y sus relaciones:

‘agenzia’=>array(self::BELONGS_TO, ‘Agenzia’, ‘agenzia_id’),

‘telegramma’=>array(self::HAS_MANY,‘Telegramma’,array(‘cap_id’=>‘cap_id’),‘through’=>‘agenzia’),

Model Agenzia y sus relaciones:

‘capAgenzia’ => array(self::HAS_MANY, ‘CapAgenzia’, ‘agenzia_id’),

‘cap’ => array(self::HAS_MANY, ‘Cap’, array(‘cap_id’,‘id’), ‘through’ => ‘CapAgenzia’),

Model Telegramma y sus relaciones:

‘cap’=>array(self::BELONGS_TO, ‘Cap’, ‘cap_id’),

Esto es el trabajo que he echo ententando de realizar esta aplicacion. Pero no me sale lo que quiero y tampoco llego a entender por que no me sale.

Si usted puede ayudarme le agradecería mucho por que me voy a volver loco con este problema.

Si usted tambien piensa que sea mejor cambiar mis tablas y mis relaciones para que todo salga bien…por mi no hay ningun problem…cambiare todo lo que se necesita de cambiar.

Gracias hotra vez…Saludos Cordiales

Ok, ahora que me muestras código te puedo ayudar un poco mas.

Te debo ser sincero y te digo que he entendido un poco mas en el primer post que publicaste, sobre todo en el diseño de las tablas.

Pero voy directo, Con vista genérica me refería a una donde se muestren todos los telegramas, en tu caso es el index (controlador index). pienso que también te pudo servir el controlador admin, que es generado al igual que el index por el CRUD automáticamente.

trabajemos entonces con el controlador index, En la parte de aplicar el filtro, que no es mas que aplicar las condiciones "WHERE" a la tabla de Telegramma para que se muestren determinados registros de dicha tabla.

Con el siguiente código debería de mostrarte todos los telegramas




public function actionIndex()

{

 $dataProvider=new CActiveDataProvider('Telegramma');

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

  'dataProvider'=>$dataProvider,

 ));

}



Ahora aplicando filtrado




public function actionIndex()

{

 $criteria=new CDbCriteria;

 $criteria->compare('cap_id','1010');


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

    'criteria'=>$criteria,

 ));

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

  'dataProvider'=>$dataProvider,

 ));

}



Como puedes observar use la clase CDbCriteria que es utilizada para construir el query.




$criteria=new CDbCriteria;

$criteria->compare('cap_id','1010');



Tened en cuenta que en este caso ‘cap_id’ es un campos de la tabla Telegramma y ‘1010’ es el valor por el cual se van a filtrar los registros, que traduce mas o menos en SQL en algo como




SELECT * 

 FROM Telegramma 

  WHERE cap_id = '1010';



Luego el objeto de esta clase se lo paso a la clase CActiveDataProvider en el segundo parámetro mediante un array como lo dice la documentación.




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

    'criteria'=>$criteria,

 ));



El 1010 es un valor estático, puedes hacer la prueba con un valor que realmente exista en la tabla Telegramma para el campo cap_id y así determinar si el filtro lo esta aplicando, después de eso deberías implementar la segunda parte que es obtener este valor dinamicamente a través del id de usuario.

Como te he dicho he entendido un poco mas la primera versión de la tabla que publicaste.

en la segunda versión colocas

user:

  • id ->Primary Key (integer)

++ nome (varchar)

+++ codice (varchar)

++++ nome_completo (varchar)

+++++ session (varchar)

agenzia:

  • id ->Primary Key (integer)

++ nome (varchar)

+++ codice (varchar)

++++ nome_completo (varchar)

+++++ cap_id (varchar)

y no veo como se relaciona user con agenzia y aquí me he trancado

mientras que en la primera versión colocaste

user:

-id ->PrimaryKey

–agenzia_id

—username

----password

-----session

------data_de_registro

agenzia:

-id->PrimaryKey

–nome

—codice

----nome_completo

Aquí se ve que user se relaciona con agenzia por el campo agenzia_id, es decir un usuario tiene una agencia y una agencia puede tener muchos usuarios.

Esa es mi duda, a ver si con lo que digo logras avanzar un poco mas, y por favor aclararme la diferencias entre las dos versiones de las tablas que me has enviado para seguir continuando.

Hola xavier y gracias hotra vez…te pido disculpa por que he olvidado de escribir agenzia_id en la tabla user. Ese campo esta en la tabla. Mi culpa…perdon.

El campo cap_id lo he tambien ensertado en la tabla agenzia por que he pensado que algun dia una sola agenzia puede tener mas cap(s) (codigos postales) de su competencia.

Manana por la tarde cuando acabe de trabajar entento hacer probas con tu solucion y voy a ver lo que sale. Del momento te digo gracias por tu ayuda :) … y como siempre … desculpa por mi espanol.