Подскажите пожалуйста имеется ли возможность в Yii создать одну модель для нескольких таблиц? Если такая возможность имеется, то хотелось бы узнать как.
Подобная потребность возникает в случае, когда имеется две основные таблицы и 5-7 справочников.
Например: Имеется база компов, состоящая из пары основных таблиц и нескольких справочников. Имеется форма внесения нового компа в базу. В этой форме есть несколько DropList-ов, которые заполняются из справочников (DropList с типами процессоров из справочника процессоров, DropList типов операвивки из справочника оперативки и тд).
А при нажатии "Сохранить" надо сохранять данные в одну из основных таблиц.
Сейчас делаю всё это исходя из стандартного дзена Yii - "одна таблица - одна модель". Но при таком раскладе мне в одном экшене контроллера страницы добавления компа приходится создавать кучу объектов моделей, передавать кучу переменных только для заполнения DropList-ов из справочников, и это я ещё не добрался до написания процедуры сохранения.
HTML-элементы формы я генерирую просто через CHtml. Понимаю, что это топорно в случае если форма большая (у меня она не маленькая). Как это всё реализовать при помощи виджета я пока не понимаю.
Заранее благодарю!
Прошу прощения за длинный рассказ, но хотелось описать ситуацию как можно подробнее.
Я заполнял дробпоксы значениями из статических методов в моделях справочниках, которые сам делал.
Например "квест" привязан к какой-то локации (place), Place - в данном случае это справочник, в нем делаю статический метод возвращающий все локации в виде массива id->name
static public function getList(){
$arr=self::model()->findAll();
return CHtml::listData($arr, 'id', 'name' );
}
в вьюхе просто использую: …=>Place::getList()
Таким образом и в контроллере ничего создавать не надо, и в представлении прямого доступа к базе нет.
Значения для дроп-листов подтягивайте из геттеров в моделях. Если вы вылазите за пределы этих возможностей - делайте с CHtml но учитывайте это при сохранении.
Если вылезли за рамки стандартной формы (что бывает например при использовании мультиселектов, чекбоксов и прочего) - потрудитесь заполнить аттрибуты самостоятельно. Сформируйте массив и сделайте масс асигн или же по старинке руками.
да. но я уже потерял суть обсуждения. proctype и ramtype это модели? В чем именно у вас возникают сложности?
2 ineersa: CActiveForm действительно хорош, для выпадающих списков я его тоже использую, например если бы в моделе Comp было бы поле "cpu_id" которое бы указывало на справочник Cpu то я бы написал
Это насколько я понимаю адресовано мне. Так нельзя сделать так как в этой форме 2 checkboxlist. Можно записать $_POST в массив, потом убрать из этого массива ненужное и заменить на нужное и сделать
$model->attributes=$attributes. Я собственно так и делаю на больших формах, просто в этой быстрее было раскидать атрибуты руками.
Код выложен для примера топик стартеру. Мне не нужно 1 модель к двум таблицам