Yii Framework Forum: [Solved] Checkboxlist E Relazioni Many_Many - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

[Solved] Checkboxlist E Relazioni Many_Many Rate Topic: -----

#1 User is offline   Legolas 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 5
  • Joined: 31-December 12

Posted 22 February 2013 - 03:46 PM

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 :)
0

#2 User is offline   Legolas 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 5
  • Joined: 31-December 12

Posted 23 February 2013 - 01:01 PM

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.
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users