activeCheckBoxList Problem
Das Problem tritt häufiger im Forum auf: In einem Formular zum Bearbeiten eines Films möchte ich die Genres zuweisen, die in einer M:N-Relation gespeichert werden. Die Anzeige der Formular-Elemente meistert Yii zunächst Bravour.
<?php echo CHtml::activeCheckListBox($movie, 'genres', CHtml::listData(Genre::model()->findAll(), 'id', 'name'))?>
Wobei genres eine Relation ist:
public function relations() { return array( 'genres' => array(self::MANY_MANY, 'Genre', 'MovieGenre(movieId, genreId)') ); }
Die Update-Variante des Formulars schmeisst aber einen häßlichen Fehler. Das liegt daran, dass der zweite Parameter ein Attribut des Models sein muss und eben keine Relation.
Folgender Workaround:
Im Movie-Model ein Attribut erzeugen:
private $_genreList;
Anschließend eine Methode hinzufügen, um die Daten entsprechend zu formatieren:
public function getGenreList() { $a = array(); foreach ($this->genres as $genre) { $a[] = $genre->id; } return $a; }
Das Attribut korrekt setzen.
<?php echo CHtml::activeCheckListBox($movie, 'genreList', CHtml::listData(Genre::model()->findAll(), 'id', 'name'))?>
und noch eine Methode zum Speichern der Genres:
public function setGenres($keys) { $this->dbConnection->createCommand('DELETE FROM moviegenre WHERE movieId = ' . $this->id)->execute(); foreach ($keys as $value) { $this->dbConnection->createCommand("INSERT INTO moviegenre (movieId, genreId) VALUES ({$this->id},{$value})")->execute(); } }
Im Controller kann ich diese dann zum Beispiel so verwenden:
public function actionUpdate() { $model = $this->loadMovie(); if (isset($_POST['Movie'])) { $model->attributes = $_POST['Movie']; if ($model->save()) { $model->setGenres($_POST['Movie']['genreList']); $this->redirect(array('show', 'id' => $model->id)); } } $this->render('update', array('model' => $model)); }
Oder man benutzt das Relation-Widget für diese Zwecke:
http://www.yiiframework.com/extension/relation/
I’m coming from Yii forum website. Your article looks interesting, thanks for sharing.
I’m trying this solution using form builder but I’m not able to make those checkboxes checked or unchecked, depending on relations (example: genres like gen1, gen2, gen3 and gen4 with gen2 and gen4 checked because of relation).