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
- 4315 reads