[Solved] Checkboxlist E Relazioni Many_Many

Ciao a tutti! E’ da qualche giorno che ho cominciato a smanettare con Yii e devo dire che, per le cose basilari, a parte qualche intoppo qua e là, mi trovo alla grande.

Dicevo: per le cose basilari. Infatti sto sbattendo la testa su un problema che non riesco a risolvere. Ho le seguenti tabelle:




tbl_progetti     tbl_progetti_utenti       tbl_utenti

------------     -------------------       ----------

id               progetto_id               id

titolo           utente_id                 nome

...                                        ...



-Ad ogni progetto possono essere associati più utenti

-Ogni utente può occuparsi di più progetti

Nel model dei progetti ho impostato la relazione:




public function relations()

{

    return array(

        'progettiUtenti'=>array(self::MANY_MANY, 'Utenti', 'tbl_progetti_utenti(progetto_id, utente_id)'),

    );

}



Sempre nel model ho dichiarato una property per tenere traccia degli utenti associati al progetto e ho aggiunto una regola safe:




public $utentiSelezionati;

...

public function rules()

{

    return array(

        ...

        array('utentiSelezionati', 'safe')

    );

}



Nell’afterFind del model ho inserito:




$this->utentiSelezionati = (Yii::app()->db->createCommand()->select('utente_id')

    ->from('tbl_progetti_utenti')

    ->where('progetto_id=:prid', array(':prid'=>$this->id))

    ->queryColumn());



che mi restituisce un array contenente gli indici dei checkbox da selezionare in _form:




echo $form->CheckBoxList($model, 'utentiSelezionati', Chtml::listData(Utenti::model()->findAll(),'id','nome'));



La CheckBoxList viene generata correttamente, così come vengono selezionati i check box in maniera corretta. Però adesso non riesco a stabilire come passare al model (in afterSave) i valori modificati dei checkbox. Ho provato, seguendo questo thread:




protected function afterSave()

{

    if (!is_null($this->utentiSelezionati)) {

        Yii::app()->db->createCommand()->delete('tbl_progetti_utenti', 'progetto_id = :id', array(':id' => $this->id));

        if ($this->utentiSelezionati) {

            foreach ($this->utentiSelezionati as $utenteId) {

                Yii::app()->db->createCommand()->insert('tbl_progetti_utenti', array('progetto_id' => $this->id, 'utente_id' => $utenteId));

            }

        }

    }

}



Ma in questo modo tbl_progetti_utenti non viene modificata.

Una mano sarebbe graditissima :)

Ok, come mi capita di solito, dopo aver chiesto sul forum sono riuscito a far andare la baracca :lol:

Spiego, così magari qualcuno col mio stesso problema può approfittarne in futuro.

Modifiche al Model Progetti.php:




public $utentiId = array();


...


	public function rules()

	{

		// NOTE: you should only define rules for those attributes that

		// will receive user inputs.

		return array(

...

			array('utentiId', 'safe'),

...

		);

	}


...


public function relations()

{

    return array(

        'utenti'=>array(self::MANY_MANY, 'Utenti', 'tbl_progetti_utenti(progetto_id, utente_id)'),

    );

}


...


protected function afterFind()

{


    $this->utentiId =  (Yii::app()->db->createCommand()->select('utente_id')

        ->from('tbl_progetti_utenti')

        ->where('progetto_id=:prid', array(':prid'=>$this->id))

        ->queryColumn());


}


protected function afterSave()

{

    if (!is_null($this->utentiId)) {

        Yii::app()->db->createCommand()->delete('tbl_progetti_utenti', 'progetto_id = :id', array(':id' => $this->id));

        if ($this->utentiId) {

            foreach ($this->utentiId as $utenteId) {

                Yii::app()->db->createCommand()->insert('tbl_progetti_utenti', array('progetto_id' => $this->id, 'utente_id' => $utenteId));

            }

        }

    }

}



Modifiche alla View _form.php:




...

<div class="row">

    <?php echo $form->labelEx($model,'utenti'); ?>

    <?php echo $form->CheckBoxList($model, 'utentiId', Chtml::listData(Utenti::model()->findAll(),'id','nome')); ?>		

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

</div>

...



Tutto qua :)

La CheckBoxList viene creata correttamente e lo stato dei box viene correttamente letto dal database. Inoltre, adesso funziona anche il salvataggio sul database.

Che dire, mi ero incartato leggendo esempi su esempi e aggiungendo e rimuovendo codice più o meno a casaccio…

Ripartendo da zero e facendo affidamento su quanto scritto qui sono riuscito a venire a capo del problema modificando soltanto la parte relativa all’afterFind e la View.