Yii создание сообщения - обмен данными между моделями CForm и CActiveRecord // как сохранить сообщение - испоьзование конструкт
Primary tabs
если мы используем автозаполнение формы ,то главное - это совпадение имён атрибутов - они должны быть одинаковыми для обоих моделей -тогда мы с успехом сможем "автоматически заполняться" подобным образом (привожу один из методов - добавленных мной в контроллер по умолчанию sitecontroller - переопределение базового примера Hello World ):
/*Следующее действие ответственно за вывод формы - косвенно оно же проверяет значения и сохраняет данные в БД*/ public function actionAddMessage() { $model=new AddMessageForm; // создаём модель формы // определяем характеристики формы $form = new CForm('application.views.site.AddMessageForm', $model); // если пост-запрос получен, то... if(isset($_POST['AddMessageForm'])) { // получаем данные от пользователя $model->attributes=$_POST['AddMessageForm']; // читаем в CFrom // проверяем полученные данные и, если результат проверки положительный, if($model->validate()){ // print_r ($model->attributes); // можно посмотреть вид массива (но сперва откл. редирект) $model=new Message; $model->attributes=$_POST['AddMessageForm']; // читаем в CActiveRecord if($model->save()) // выполняем переадресацию К СПИСКУ СООБЩЕНИЙ $this->redirect(array('site/messagelist')); } } // рендерим представление если форма не отправлена(или) $this->render('addmessage', array('form'=>$form)); }
чтобы модели обоих типов заполнились - необходимо чтобы в их классах были определены поля и методы их проверки - по названию совпадающие с названиями атрибутов формы (это необходимо для наименее трудоёмкого заполнения формы но не обязательно):
например - для СActiveRecord (в меня только одно поле):
class Message extends CActiveRecord { /** * */ public $text; /*в качестве правила про верки для единственного поля нашей формы установим, что длинна сообщения не должна превышать 200 символов*/ public function rules() { return array( array('text', 'length', 'min'=>10, 'max'=>200) ); } public static function model($className=__CLASS__) { return parent::model($className); } /** * возвращаем имя таблицы БД для данной модели */ public function tableName() { return '{{message}}'; } public function relations() // задаём отношения с другими классами (User) { return array( 'user' => array(self::BELONGS_TO, 'User', 'user_id') ); } }
ну а для CForm =
<?php /*здесь мы опишем модель - для формы создания новых сообщений*/ class AddMessageForm extends CFormModel { public $text; // пусть будет только одно поле /*в качестве правила про верки для единственного поля нашей формы установим, что длинна сообщения не должна превышать 200 символов*/ public function rules() { return array( array('text', 'length', 'min'=>10, 'max'=>200) ); } } ?>
кстати форму в примере выше мы генерировали с помощью конструктора форм, положив php-файл с таким вот содержимым :
<?php return array( 'title'=>'Введите текст сообщения:', 'elements'=>array( 'text'=>array( 'type'=>'textarea',//большое текстовое поле 'maxlength'=>200, ) ), 'buttons'=>array( 'login'=>array( 'type'=>'submit', 'label'=>'Создать', ), ), ); ?>
по адресу вызванному в первом листинге этой заметке:
$form = new CForm('application.views.site.AddMessageForm', $model);
то есть это
protected/views/site/AddMessageForm.php
- Log in to post comments
- 3974 reads