AR форма со связями
AR форма со связями
Понимаю что вопрос наверно тупой, но что то не могу сообразить как мне сделать форму со связями.
Например есть таблицы
cat (cat_id, cat_title) has many post
post (post_id, post_title, post_text) has many cat
cat_post (cat_id, post_id)
Как в форме редактирования post вывести checbox'ами список всех категорий, чтобы связанные категории были чекнутые и как все это дело сохранять
Например есть таблицы
cat (cat_id, cat_title) has many post
post (post_id, post_title, post_text) has many cat
cat_post (cat_id, post_id)
Как в форме редактирования post вывести checbox'ами список всех категорий, чтобы связанные категории были чекнутые и как все это дело сохранять
- lancecoder
- Сообщения: 2532
- Зарегистрирован: 2012.06.26, 17:16
Re: AR форма со связями
1. для вывода вам понадобится жадная загрузка
2. вывести post->cats
3. для сохранения http://www.yiiframework.com/search/?q=s ... =extension
2. вывести post->cats
3. для сохранения http://www.yiiframework.com/search/?q=s ... =extension
Re: AR форма со связями
Ну сохранить я в принципе думаю можно и самому, непонятно как в саму форму нарисовать кучу галочек да еще и пометить те с которыми есть связь, загрузить то связи с категориями и все категории понятно, а вот как вывести все это дело в форме, что бы оно и после вывода ошибок оставалось в том же положение как до отправки формы...
- lancecoder
- Сообщения: 2532
- Зарегистрирован: 2012.06.26, 17:16
Re: AR форма со связями
Код: Выделить всё
$checked=CHtml::listData($post->cats,'id','id');
$all=Category::model()->findAll();
Код: Выделить всё
foreach($all as $category){
echo CHtml::activeCheckBox($form, 'cat_id['.$category->id.']', array_search($category->id, $checked)!==false?array('checked'=>'checked'):array())
}
Re: AR форма со связями
Спасибо, попробую
Re: AR форма со связями
Код: Выделить всё
class Post extends CActiveRecord
{
public $cats_array=array();
public function rules(){
return array(
array('cats_array', 'safe');
);
}
// ...
protected function afterFind(){
$this->cats_array=CHtml::listData($this->cats, 'id', 'id');
parent::afterFind();
}
protected function afterSave(){
// обрабатываем новый массив $this->cats_array
// ...
parent::beforeSave()
}
}
Код: Выделить всё
$form->checkBoxList($model, 'cats_array', CHtml::listData(Category::model()->findAll(),'id','name'));
Последний раз редактировалось ElisDN 2012.11.22, 14:26, всего редактировалось 7 раз.
- lancecoder
- Сообщения: 2532
- Зарегистрирован: 2012.06.26, 17:16
Re: AR форма со связями
public function rules(){
return array(
array('cats_id', 'array');
array('cats_id', 'myValidateArray');
);
}
return array(
array('cats_id', 'array');
array('cats_id', 'myValidateArray');
);
}
- lancecoder
- Сообщения: 2532
- Зарегистрирован: 2012.06.26, 17:16
Re: AR форма со связями
error in afterFind
change
$cats_array[]=$item->id;
to
$this->cats_array
change
$cats_array[]=$item->id;
to
$this->cats_array
++ nice$form->checkBoxList($model, 'cats_array', CHtml::listData(Category::model()->findAll(),'id','name'));
Re: AR форма со связями
Да нет, думаю в afterFind и afterSafe ниче пихать не буду, мне это нужно только в админке
Re: AR форма со связями
Ну это не важно где обрабатывать. Хоть в контроллере. Просто в checkBoxList нужно поле с массивом выбранных передавать.Dr.Death писал(а):Да нет, думаю в afterFind и afterSafe ниче пихать не буду, мне это нужно только в админке
Re: AR форма со связями
Fixed. Thanks!lancecoder писал(а):...to $this->cats_array
- lancecoder
- Сообщения: 2532
- Зарегистрирован: 2012.06.26, 17:16
Re: AR форма со связями
а что будет с афтерфайндом если я не вытащу with('cats') ?Ну это не важно где обрабатывать. Хоть в контроллере. Просто в checkBoxList нужно поле с массивом выбранных передавать.
потихонечку просыпаемся....))))
Re: AR форма со связями
Ухтыжъёжег)) Загрузятся нежадно по первому требованию, то есть всегда...lancecoder писал(а):а что будет с афтерфайндом если я не вытащу with('cats') ?
Ладно, вынесем в свойство:
Код: Выделить всё
class Post extends CActiveRecord()
{
protected $cats_array;
public function rules(){
return array(
array('catsArray', 'safe');
);
}
// ...
public function getCatsArray(){
if ($this->cats_array===null)
$this->cats_array=CHtml::listData($this->cats, 'id', 'id');
return $this->cats_array;
}
public function setCatsArray($value){
$this->cats_array=$value;
}
protected function afterSave(){
// ...
parent::afterSave();
}
}
Код: Выделить всё
$form->checkBoxList($model, 'catsArray', CHtml::listData(Category::model()->findAll(),'id','name'));
Последний раз редактировалось ElisDN 2012.11.26, 15:11, всего редактировалось 6 раз.
- lancecoder
- Сообщения: 2532
- Зарегистрирован: 2012.06.26, 17:16
Re: AR форма со связями
просто такие вещи лучше в бехавиор и подключать в ручную когда надо, а так на модель навешивать ради использования в 1 месте не рационально, а с афтерФайндом, что ранее ты указал, да ты прав, он подтянул бы, причем каждый раз при файнде
Re: AR форма со связями
Ещё заметил, что обработку надо не в beforeSave(), а в afterSave() делать, так как нам $this->id пригодится, а в newRecord он ещё пустой.
Re: AR форма со связями
Такс... если я передаю в форму $aCheckedCats = CHtml::listData($oPost->cats, 'cat_id', 'cat_id'); то как мне при посте с ошибками отавить чекнутые категории, а не заного взять из базы...
Re: AR форма со связями
А блин туплю...
Код: Выделить всё
if(isset($_POST['Post']['cats_ids'])) {
$aCheckedCats = array_keys($_POST['Post']['cats_ids']);
}
else {
$aCheckedCats = CHtml::listData($oPost->cats, 'cat_id', 'cat_id');
}
Re: AR форма со связями
Вынес геттер и сеттер в бехавиор.