AR форма со связями

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
Dr.Death
Сообщения: 125
Зарегистрирован: 2011.05.07, 18:24
Контактная информация:

AR форма со связями

Сообщение Dr.Death » 2012.11.22, 07:49

Понимаю что вопрос наверно тупой, но что то не могу сообразить как мне сделать форму со связями.
Например есть таблицы
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'ами список всех категорий, чтобы связанные категории были чекнутые и как все это дело сохранять
:oops:

Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: AR форма со связями

Сообщение lancecoder » 2012.11.22, 08:03

1. для вывода вам понадобится жадная загрузка
2. вывести post->cats
3. для сохранения http://www.yiiframework.com/search/?q=s ... =extension

Аватара пользователя
Dr.Death
Сообщения: 125
Зарегистрирован: 2011.05.07, 18:24
Контактная информация:

Re: AR форма со связями

Сообщение Dr.Death » 2012.11.22, 08:12

Ну сохранить я в принципе думаю можно и самому, непонятно как в саму форму нарисовать кучу галочек да еще и пометить те с которыми есть связь, загрузить то связи с категориями и все категории понятно, а вот как вывести все это дело в форме, что бы оно и после вывода ошибок оставалось в том же положение как до отправки формы...

Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: AR форма со связями

Сообщение lancecoder » 2012.11.22, 08:42

Код: Выделить всё

$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())
}

Аватара пользователя
Dr.Death
Сообщения: 125
Зарегистрирован: 2011.05.07, 18:24
Контактная информация:

Re: AR форма со связями

Сообщение Dr.Death » 2012.11.22, 09:04

Спасибо, попробую

Аватара пользователя
ElisDN
Сообщения: 4961
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: AR форма со связями

Сообщение ElisDN » 2012.11.22, 09:34

Код: Выделить всё

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 форма со связями

Сообщение lancecoder » 2012.11.22, 09:36

public function rules(){
return array(
array('cats_id', 'array');
array('cats_id', 'myValidateArray');
);
}

Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: AR форма со связями

Сообщение lancecoder » 2012.11.22, 09:39

error in afterFind
change
$cats_array[]=$item->id;
to
$this->cats_array
$form->checkBoxList($model, 'cats_array', CHtml::listData(Category::model()->findAll(),'id','name'));
++ nice

Аватара пользователя
Dr.Death
Сообщения: 125
Зарегистрирован: 2011.05.07, 18:24
Контактная информация:

Re: AR форма со связями

Сообщение Dr.Death » 2012.11.22, 09:41

Да нет, думаю в afterFind и afterSafe ниче пихать не буду, мне это нужно только в админке

Аватара пользователя
ElisDN
Сообщения: 4961
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: AR форма со связями

Сообщение ElisDN » 2012.11.22, 09:44

Dr.Death писал(а):Да нет, думаю в afterFind и afterSafe ниче пихать не буду, мне это нужно только в админке
Ну это не важно где обрабатывать. Хоть в контроллере. Просто в checkBoxList нужно поле с массивом выбранных передавать.

Аватара пользователя
ElisDN
Сообщения: 4961
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: AR форма со связями

Сообщение ElisDN » 2012.11.22, 09:46

lancecoder писал(а):...to $this->cats_array
Fixed. Thanks!

Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: AR форма со связями

Сообщение lancecoder » 2012.11.22, 09:57

Ну это не важно где обрабатывать. Хоть в контроллере. Просто в checkBoxList нужно поле с массивом выбранных передавать.
а что будет с афтерфайндом если я не вытащу with('cats') ?

потихонечку просыпаемся....))))

Аватара пользователя
ElisDN
Сообщения: 4961
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: AR форма со связями

Сообщение ElisDN » 2012.11.22, 10:10

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 форма со связями

Сообщение lancecoder » 2012.11.22, 10:13

просто такие вещи лучше в бехавиор и подключать в ручную когда надо, а так на модель навешивать ради использования в 1 месте не рационально, а с афтерФайндом, что ранее ты указал, да ты прав, он подтянул бы, причем каждый раз при файнде

Аватара пользователя
ElisDN
Сообщения: 4961
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: AR форма со связями

Сообщение ElisDN » 2012.11.22, 10:20

Ещё заметил, что обработку надо не в beforeSave(), а в afterSave() делать, так как нам $this->id пригодится, а в newRecord он ещё пустой.

Аватара пользователя
Dr.Death
Сообщения: 125
Зарегистрирован: 2011.05.07, 18:24
Контактная информация:

Re: AR форма со связями

Сообщение Dr.Death » 2012.11.22, 12:39

Такс... если я передаю в форму $aCheckedCats = CHtml::listData($oPost->cats, 'cat_id', 'cat_id'); то как мне при посте с ошибками отавить чекнутые категории, а не заного взять из базы...

Аватара пользователя
Dr.Death
Сообщения: 125
Зарегистрирован: 2011.05.07, 18:24
Контактная информация:

Re: AR форма со связями

Сообщение Dr.Death » 2012.11.22, 12:43

А блин туплю...

Код: Выделить всё

        if(isset($_POST['Post']['cats_ids'])) {
            $aCheckedCats = array_keys($_POST['Post']['cats_ids']);
        }
        else {
            $aCheckedCats = CHtml::listData($oPost->cats, 'cat_id', 'cat_id');
        } 

Аватара пользователя
ElisDN
Сообщения: 4961
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: AR форма со связями

Сообщение ElisDN » 2012.11.22, 18:00

Вынес геттер и сеттер в бехавиор.

Ответить