Usare le relazioni nelle viste

Ciao a tutti,

Sto muovendo i primi passi con Yii.

Volevo qualche indicazione su come poter utilizzare le relazioni tra tabelle nelle viste:

Faccio un esempio, ho una tabella libri (id_libro, titolo, id_autore) ed una tabella autori (id_autore, cognome, nome)

Nel modello Libri inserisco:

public function relations()

{


	return array(


		'idAutore' => array(self::BELONGS_TO, 'Autori', 'id_autore'),


	);


}

A questo punto voglio modificare la vista index di Libri, per visualizzare Autore: Cognome + spazio + Nome ed inserisco:

<b><?php echo CHtml::encode(‘Autore’); ?>:</b>

<?php echo CHtml::encode($data->idAutore->cognome).’ '.CHtml::encode($data->idAutore->nome); ?>

<br />

Modifico anche la vista singola ed inserisco:

$cognome_nome = $model->idAutore->cognome.’ '.$model->idAutore->nome; /Non c’è un modo più elegante?/

$this->widget(‘zii.widgets.CDetailView’, array(

'data'=&gt;&#036;model,


'attributes'=&gt;array(


	'id_libro',


	array('label'=&gt;'Autore', 'value'=&gt;&#036;cognome_nome),


	'titolo',


),

));

E fin qui ci siamo…

Quando voglio creare un nuovo libri, voglio che l’autore sia all’interno di una select, aggiungo quindi in _form.php:

<?php echo $form->dropDownList($model,‘id_autore’,CHtml::listData(Autori::model()->findAll(),‘id_autore’,‘cognome’) , array(‘prompt’=>‘Scegliere un autore’)); ?>

Che ovviamente mi visualizza solo il cognome, mentre io vorrei che mi visualizzasse cognome + spazio + nome

Suggerimenti?

Grazie in anticipo

Max

Potresti provare a fare un metodo getNomeCompleto nel model giusto e caricare quello.

Grazie sensorario,

effettivamente se aggiungo nel model Autori:


public function getNomeCompleto()

		{

			return $this->cognome.' '.$this->nome;

		}

Posso poi usare nelle viste


$model->idAutore->getNomeCompleto()

per stamparlo, ma nella select che originariamente è:


<?php echo $form->dropDownList($model,'id_autore',CHtml::listData(Autori::model()->findAll(),'id_autore', 'cognome') , 


array('prompt'=>'Scegliere un autore')); ?>

Come devo modificare il codice?

Grazie

Max

In un mio vecchio progetto mi preparavo tutte le dropdownlist prima del form. La mia idea è questa: faccio diversi foreach che mi portino ad avere un array costruito appositamente per quella dropdownlist. e nella view mi limito ad usare una variabile. Ho detto foreach. Tu stai cercando di fare su una riga una cosa complessa. Io non saprei farlo. Preferisco scomporre il problema in tanti più piccoli e cercare una soluzione partendo da li.

http://www.yiiframework.com/wiki/167/understanding-virtual-attributes-and-get-set-methods

in sostanza:




<?php echo $form->dropDownList($model,'id_autore',CHtml::listData(Autori::model()->findAll(),'id_autore', 'NomeCompleto') , 

array('prompt'=>'Scegliere un autore')); ?>



banned,

Grazie banned, non avevo letto questa parte del wiki.

Non mi era chiaro che definendo getNomeCompleto mi dava la possibilità di richiamare nomecompleto così facilmente.

sensorario, hai ragione cerco di fare cose complesse, ma cerco di trarre il massimo vantaggio dalla OOP e dall’utilizzo di un framework

A presto

Max