[Yii 1] Allineamento Orizzontale Dei Risultati In Una Cdetailview

Allora fai una cosa, modifica questa function così




public function actionStampa($id)

{


$dataProvider=new CActiveDataProvider('Telegramma');

$this->layout="//layout/pdf-telegramma"; // inutile..... 


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

$output = $this->render('stampa',array('model'=>$telegramma),true);


echo $output;

CVarDumper::dump($telegramma->agenzia,2,true);


// $mPDF1 = Yii::app()->ePdf->mpdf();

// $mPDF1->WriteHTML($output);

// $mPDF1->Output();

}



Lo scopo (al di là di rendere più ordinato il codice, è di capire cosa c’è in $telegramma->agenzia).

Invece di fare un pdf e darlo al browser, questo mostra a video l’output del telegramma e sotto ci mette il dump di $telegramma->agenzia.

Per favore, copia/incolla questo dump così forse capiamo meglio.

Prova ad attivare il log delle query e copia/incolla quella che fa la select in agenzia.

Aggiungo una cosa: quando fai dei pdf, prima di fare l’output, mantieni tutto in echo a video che fai molto prima a fare il debug.

caccia un bel




ini_set("display_errors","on");

ini_set("error_reporting", E_ALL);



all’inizio della actionStampa, così se succede qualcosa di strano lo capiamo

Lo puoi togliere quando la feature è ok.

Forse sto arrivando a una soluzione.

Riesco a recuperare l’ id dell’ agenzia mittente inserendo questo nella vista “stampa”:




<?php echo "Agenzia mittente: ";

echo $model->cap->agenzia_id; 

?>



Ora non mi resta che far apparire al posto dell’ id il nome dell’ agenzia…ecco come posso fare??..sempre che si possa fare ovviamente.

PS: azz avevi già risposto e non avevo letto. Ho aggiunto ciò che hai scritto nell’ actionStampa

Accidenti, che svista




'agenzia'=>array(self::BELONGS_TO, 'Agenzia', 'id'), 



Questo non funzionerà mai… stai dicendo ad Yii che Telegramma.id -> Agenzia.id, invece direi che

Telegramma.id_agenzia_mittente -> Agenzia.id, giusto ?

Il nome del campo l’ho denominato a caso, però la modifica è la seguente.




'agenzia'=>array(self::BELONGS_TO, 'Agenzia', 'id_agenzia_mittente'), 



Questo se in telegramma, come mi aspetto, c’è l’id dell’agenzia mittente …

se invece va dedotto dall’utente il giro è diverso, aspetto la tua risposta per capirlo.

Ah… ho visto solo ora il tuo reply…

Se devi passare da cap devi togliere la relation che da Telegramma porta ad Agenzia … perchè non funzionerà mai.

Ed usare, appunto




$model->cap->cap



Scusa, non ho a memo tutte le relation.

Hai fatto bingo, in telegramma non ho un campo agenzia_id. Dovrei prelevarlo dalla tabella user, tamite l’ utente che in quel momento è connesso. Per questo inizio ad avere dubbi sulla struttura del database e pensavo fosse neccessario inserire un campo “hidden” autocomplete (all’ interno della tabella telegramma…non so “agenzia_mitt”) che si autocompleta con il nome dell’ agenzia che in quel momento sta postalizzando il telegramma e che questo campo “hidden” venga recuperato al momento della stampa.

Ti incollo il Dump con relations in Telegrammi:




'agenzia'=>array(self::BELONGS_TO, 'Agenzia', 'id'),



ma come vedi cosi non recupera nessun dato.

Scusami,

io ho provato a passare da cap perchè nella tabella cap ho un campo denominato agenzia_id dove inserisco l’ id dell’ agenzia di appartenenza alla creazione del cap. Quindi volevo provare a recuperare quell’ attributo facendo apparire al posto dell’ id il nome dell’ agenzia…ma non riesco. Appare solo ed esclusivamente l’ id.

In Telegramma ho queste relations:




'Cap'=>array(self::BELONGS_TO, 'Cap', 'cap_id'),

        'CapAgenzia' => array(self::HAS_MANY, 'CapAgenzia', array('id','id'), 'through' => 'Cap'),

        'utenti' => array(self::HAS_MANY, 'User', array('agenzia_id','agenzia_id'), 'through' => 'Cap', 'together' => true),



già, un bel null. Cancella la relation.

Prima di tornare al codice chiarisci questo.

Un utente è legato ad una agenzia, quindi user è legato (BELONGS_TO) ad una ed una sola agenzia.

A questo punto è necessario sapere l’utente che ha ‘creato’ il telegramma.

in questo caso Telegramma deve avere una relation Utente che BELONGS_TO alla tabella utenti col campo telegramma.user_id.

Dimmi se fino a qui è chiaro l 110%

La relation




        'CapAgenzia' => array(self::HAS_MANY, 'CapAgenzia', array('id','id'), 'through' => 'Cap'),




non mi è proprio chiara, ma lasciamola indietro per ora. ci pensiamo al bisogno

E’ chiaro…ma il campo telegramma.user_id nella tabella user non esiste. La tabella user ha i seguenti campi:




id

username

password

session

data_registrazione

agenzia_id



Cap_Agenzia e la relation che lega due tabelle cap e agenzia (tramite la tabella cap_agenzia) in maniera tale che nella index telegramma ogni utente veda solo i telegrammi indirizzati alla sua agenzia tramite i cap che gestisce la stessa.

si, e questo è il problema.

mi dai l’elenco dei campi di Telegramma e di Cap_agenzia per favore ?

scritti, non in una immagine.

[fino a sera rispondo in realtime]

PS: rinnovo l’invito ad usare i tag [ code ] e [ /code ], senza spazi, per elenchi di campi, codice, etc…

I campi in telegramma sono




                'id'

                'nome_mitt',

		'cognome_mitt',

		'indirizzo_mitt',

		'via_mitt',

		'civico_mitt',

		'cap_mitt',

		'citta_mitt',

		'provincia_mitt',

		'stato_mit',


                'nome_dest',

		'cognome_dest',

		'indirizzo_dest',

		'via_dest',

		'civico_dest',

		'cap_id'

		'citta_dest',

		'provincia_dest',

		'stato_dest',

		'parole',

		'prezzo',



PS: io sono al lavoro quindi se non rispondo in realtime vuol dire che ho un cliente <_<

Domanda banale: quindi è cap_mitt che ti dice da quale agenzia in pratica è stato inviato il telegramma, ho capito bene ?

EDIT: bravo per l’uso del tag CODE, grazie !

Allora per ora yii capisce l’ agenzia di destino ed e per questo che nella vista index di “Telegramma” ogni utente può vedere solo i telegrammi che la sua agenzia ha in gestione.

Yii capisce questo perchè ogni User è collegato alla propria Agenzia e ogni Agenzia ha in gestione i suoi Cap. Quindi credo che se modifico l’ attributo cap_mitt come ho modificato cap_dest e quindi facendogli assegnare l’ id del cap nella tabella di composizione del telegramma yii riuscirebbe a capire anche qual’ è l’ agenzia mittente. Vuoi che provo a modificare questo pezzo di codice? Cosi vedo che succede!!!

no, fermo, rispondimi: da cap_mitt riesci a risalire a qual’è l’agenzia che l’ha spedito, oppure un cap può essere gestito da piu agenzie?

secondo me la strada migliore è creare, visto che serve, un campo id_agenzia_mittente nella tabella Telegramma.

senza modificare il form di creazione, sul beforeSave del Telegramma recuperi dall’utente collegato la sua agenzia e lo salvi qui

a questo punto avresti la relazione diretta tra telegramma e agenzia mittente

No un cap può essere gestito da una sola agenzia che può però avere in gestione piu cap. Ma ogni cap puo essere gestito da una sola agenzia.

Se il cap 00142 è gestito dall’ agenzia di roma 4 quel cap non può essere gestito da nessun’ altra agenzia. Se creo il campo che dici come faccio a far si che si riempia da solo senza che l’ agenzia lo riempia?(ho clienti in ufficio quindi vado a rilento per questo).

meglio che vai a rilento, così ho tempo anche io …

allora se un cap è gestito da una unica agenzia IGNORA IL PRECEDENTE POST.

Abbiamo che Telegramma anche un campo cap_mittente.

Questo è un id del cap o è proprio il cap ?

Ora ho fatto si che al cap_mitt venga inserito l’ idi del cap (che poi io nella vista mostro il cap) come in cap_id (riferito al cap di destinazione. Cosi facendo yii prende come indicazione l’ id del cap.

Come vedi nell’ allegato mostro il cap ma nel form gli faccio inviare l’ id tramite:




<?php echo $form->labelEx($model,'cap'); ?><br  />

		<?php echo $form->dropDownList($model,'cap_mitt', CHtml::listData(Cap::model()->findAll(), "id","cap")); ?>

		<?php echo $form->error($model,'cap_mitt'); ?>





<?php echo $form->labelEx($model,'cap_id'); ?><br  />

		<?php echo $form->dropDownList($model,'cap_id', CHtml::listData(Cap::model()->findAll(), "id","cap")); ?>        

		<?php echo $form->error($model,'cap_id'); ?>



perfetto… ora dobbiamo solo risalire dall’id del cap all’agenzia che lo gestisce.

Mi servono i campi di cap e di cap_agenzia (se si chiama così, non ricordo, la tabella che li relaziona)

Però ora mi sovviene un ragionamento.

Se 1 agenzia ha N cap, ma un cap ha UNA SOLA agenzia, … a cosa ti serve la tabella di collegamento?

In questo mi ha aiutato un’ altro utente con le relations, perchè nell’ innerJoin e nel Left mi dava sempre errori.

Ora questa relazione non sta agendo a quanto credo, perchè avevamo deciso di creare quella tabella se poi in futuro ogni agenzia avrebbe potuto gestire piu cap per farlo capire da quella tabella. Ma dopo cambiando strada abbiamo deciso di fare tutto tramite le tabelle user - agenzia e cap con Inner e Left Join nelle tabelle e dicendo a yii nella pagina index "Telegramma" di mostrare i risultati in base a:




public function actionIndex()

	{

		echo Yii::app()->user->id;

		if(Yii::app()->user->checkAccess("admin"));

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


$cr = new CDbCriteria();

        $cr->with = array('utenti' => array('condition' => 'utenti.id = :idUtente','params' => array(':idUtente' => $user->id)));

        

		$dataProvider=new CActiveDataProvider('Telegramma', array('criteria' => $cr));

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

			'dataProvider'=>$dataProvider,

		));



Query che viene eseguita in index:




Querying SQL: SELECT `t`.`id` AS `t0_c0`, `t`.`nome_mitt` AS `t0_c1`,

`t`.`cognome_mitt` AS `t0_c2`, `t`.`indirizzo_mitt` AS `t0_c3`,

`t`.`via_mitt` AS `t0_c4`, `t`.`civico_mitt` AS `t0_c5`, `t`.`cap_mitt` AS

`t0_c6`, `t`.`citta_mitt` AS `t0_c7`, `t`.`provincia_mitt` AS `t0_c8`,

`t`.`stato_mit` AS `t0_c9`, `t`.`nome_dest` AS `t0_c10`, `t`.`cognome_dest`

AS `t0_c11`, `t`.`indirizzo_dest` AS `t0_c12`, `t`.`via_dest` AS `t0_c13`,

`t`.`civico_dest` AS `t0_c14`, `t`.`cap_id` AS `t0_c15`, `t`.`citta_dest`

AS `t0_c16`, `t`.`provincia_dest` AS `t0_c17`, `t`.`stato_dest` AS

`t0_c18`, `t`.`parole` AS `t0_c19`, `t`.`prezzo` AS `t0_c20`, `utenti`.`id`

AS `t1_c0`, `utenti`.`agenzia_id` AS `t1_c1`, `utenti`.`username` AS

`t1_c2`, `utenti`.`password` AS `t1_c3`, `utenti`.`session` AS `t1_c4`,

`utenti`.`data_registrazione` AS `t1_c5` FROM `telegramma` `t`  LEFT OUTER

JOIN `cap` `Cap` ON (`t`.`cap_id`=`Cap`.`id`)  LEFT OUTER JOIN `user`

`utenti` ON (`Cap`.`agenzia_id`=`utenti`.`id`) AND

(`Cap`.`agenzia_id`=`utenti`.`id`)  WHERE (utenti.id = :idUtente) LIMIT 10



Quindi penso di poter eliminare sia la tabella che la relation…stasera provo perchè prima devo farmi un backup di tutto.

Allora i campi della tabella cap sono:




                'id',

		'cap',

		'comune',

		'regione',

		'provincia',

                'agenzia_id'



Mentre i campi di cap_agenzia sono:




'id'

'cap_id'

'agenzia_id'




Ma ripeto…quest’ ultima tabella ora come ora è inutile se non ricordo male…mannaggia a me e a quando non ho tolto ciò che non serviva. Sai quando dici…"Dopo lo faccio!! " Ecco …dopo non l’ ho fatto!!! :o ;D