Урок 7 : Комментарии
Рубрика: Создаем блог вместе
3 Июл. 2009Эта статья устарела т.к. была написана для yii версии 1.0.х; Если вы используете более новую версию - у вас могут возникнуть ошибки из-за несовместимости. Обычно ответы на все вопросы работы на 1.1.х были описаны в комментариях ниже статьи.
Сегодня разговор пойдет о том как сделать комментарии на нашем блоге.
---В этой статье мы рассмотрим с вами как добавить формочку комментариев к нам в блог, и безопасно обрабатывать входные данные. Простой план сегодняшнего занятия выглядит следующим образом:
- Создаем форму (отображение) для добавления комментария
- Подключаем форму на страницу
- Подключаем вывод всех комментариев по посту внизу страницы
- Работа с контроллером. Добавляем поиск всех комментариев
- Работа с контроллером. Механизм проверки что пришли данные с формы
- Создаем модель Comments
- Пробуем
В принципе ничего замысловатого. Ну что, начнем?
Введение
Форма добавления комментариев будет выглядеть примерно точно также как у меня на dbhelp.ru. Как вы понимаете комментарии у нас смогут оставлять как зарегистрированные так и не зарегистрированные пользователи.
Создаем форму для добавления комментария
Открываем protected/views/post/ и создаем там файл _commentsForm.php:
<h1 id="respond">
<?php echo CHtml::form(); ?>
<?php echo CHtml::errorSummary($form); ?>
<?php echo CHtml::activeTextArea($form, 'text', array('cols' => 50, 'rows' => 8)) ?>
<table border=0 id="captcha">
<tr>
<td valign="top"><?php $this->widget('CCaptcha', array('buttonLabel' => '')); ?>
<td valign="top">
<table border=0>
<tr>
<td valign="top"><?php echo CHtml::activeLabel($form, 'verifyCode'); ?></td>
<td valign="top"><?php echo CHtml::activeTextField($form,'verifyCode'); ?></td>
</tr>
<tr id="login">
<td valign="top"><?php echo CHtml::activeLabel($form, 'login'); ?></td>
<td valign="top"><?php echo CHtml::activeTextField($form, 'login') ?></td>
</tr>
</table>
</td>
</tr>
</table>
<p><?php echo CHtml::submitButton("Ок, отправить!", array('id' => "submit")); ?></p>
<?php echo CHtml::endForm($form); ?>
Тут же внизу я добавляю немного javascript (jQuery) кода для красоты, который чуть ниже мы рассмотрим подробнее:
<script>
$(document).ready(function() {
$("#captcha").hide();
$("#guestlogin").hide();
$("#Comments_text").click(function(){
<?php if (Yii::app()->user->isGuest): ?>
$("#guestlogin").show();
<?php endif; ?>
$("#captcha").show();
});
});
</script>
Данный код отображает поля "капча" и "имя" при клике на поле ввода текста.
Также хочу заметить что поле "имя" выводиться только если пользователь гость. (для этого в коде поставлена соответствующая проверка).
.
Как вы видите код написан с использованием jQuery, поэтому его необходимо предварительно подключить на сайт. Я не агитирую использовать именно jQ для таких вещей, просто привёл пример того как это делаю я. Интересная вещь, мой Yii сам увидел что страница использует jQuery код и сам подключил его! Так что в ручную вам добавлять какой либо код подключения библиотеки не придется, всё делает фреймворк.
Если всё же jQuery у вас автоматически не подключился используйте следующие строчки:
$cs=Yii::app()->clientScript;
$cs->registerCoreScript('jquery');
добавить их надо в PostController -> actionView()
Подключаем вывод всех комментариев по посту внизу страницы
Я надеюсь вы не забыли что кроме формы добавления комментариев, нам надо бы еще вывести все комментарии для темы. (т.е. которые написали уже до вас)
Так как мы начали уже работать с отображением, давайте не будем далеко ходить и организуем файл вывода (предполагая что список всех комментариев у нас находиться в переменной $comments).
Т.е. что я предлагаю сделать: сейчас создадим файл отображения который будет выводить нам список всех комментариев которые уже есть. Как вы понимаете с контроллера к нам еще не какие данные не приходят в отображение (мы еще не дошли до работы с контроллером), поэтому мы должны представить что переменная $comments уже содержит в себе список нужных нам комментариев.
Это способ разработки от конца к началу. Мы сначала создаем файл который будет обрабатывать данные которые должны прийти (отображение), а потом создаем файл который эти данные будет передавать (экшинс контроллера).
Откройте файл protected/views/post/view.php. Именно этот файл отвечает за вывод страницы по конкретному посту. В него нам надо добавить вывод списка всех комментариев и вывод формы добавления. Я это сделал следующим образом:
<table border="1" width="100%">
<?php if (!empty($post)) : ?>
<tr><td><h1><?=$post->name;?></h1></td></tr>
<tr><td><?=$post->created;?></td></tr>
<tr><td><?=$post->text;?></td></tr>
<tr>
<td>
<h3>Комментарии</h3>
<table border="0" width="100%" cellpadding="10" cellspacing="10">
<?php
if (!empty($comments))
foreach ($comments as $key => $val) {
$this->renderPartial('_comments',array(
'comment'=>$val,
));
}
?>
</table>
<div align="center">
<?php echo $this->renderPartial('_commentsForm', array('form' => $comm_form));?>
</div>
</td>
</tr>
<?php endif; ?>
</table>
У нас добавилось еще одно поле в таблицу - комментарии. После него в цикле мы каждый комментарий загружаем через отображением _comments (в которое мы передаем данные текущего комментария). Данный подход я уже использовал вот в этом уроке.
Чуть ниже я подключил файл _commentsForm который мы с вами создали чуть выше. Я надеюсь с этим всё понятно.
По поводу переменных $comments и $comm_form - вы всё поймете когда мы будем работать с контроллером. (хотя я надеюсь вы уже сейчас понимаете для чего они примерно надо и что в себе должны содержать).
Давайте перейдем к созданию файла protected/views/post/_comments.php:
<tr>
<td>
<table border="1" width="100%">
<tr><td><?php echo $comment->login; ?></td></tr>
<tr><td><?php echo nl2br(htmlentities($comment->text, null, 'UTF-8')); ?></td></tr>
</table>
</td>
</tr>
Работа с контроллером. Добавляем поиск всех комментариев
Теперь было бы отлично зайти в наш контроллер PostController и немного подредактировать метод actionView():
public function actionView ()
{
$this->pageTitle = "";
if (!empty($_GET['url'])) {
// На всякий случай удаляю пробелы и устанавливаю
// максимальную длину для url в 100 символов.
$url = substr(trim($_GET['url']), 0, 100);
// Только англ. буквы и цифры в url
if(preg_match("/^[a-zA-Z0-9\-\_]+$/", $url)) {
$post = Posts::model()->find("url = :url", array(':url' => $url));
// Тема есть в базе
if (!empty($post)) {
// Для того чтобы сгенерировать форму добавления комментария
$comm_form = new Comments();
// Создаем критерию отбора данных
$com_criteria = new CDbCriteria;
// Нам нужны все записи где id_post = текущему посту
$com_criteria->condition = 'id_post = :id';
// Вместо :id посдтавляем реальное значение
$com_criteria->params = array(':id' => $post->id);
// Сортируем данные. Что бы новые отзывы - были вверху
$com_criteria->order = 'created ASC';
// Передаем критерию в findAll
$comments = $comm_form->findAll($com_criteria);
$this->render('view', array(
'post' => $post,
// результат передаем в отображение.
'comments' => $comments,
'comm_form' => $comm_form,
));
} else {
// Такой темы в базе нет. 404?
Yii::app()->runController('post/error404');
}
} else {
Yii::app()->runController('post/error403');
}
} else {
// $_GET['url'] пустое. Выводим главную страницу
Yii::app()->runController('post/index');
}
}
Мы делаем простую выборку комментариев текущего поста.
Работа с контроллером. Механизм проверки что пришли данные с формы
Теперь давайте проверим пришли ли данные с формы и выполним валидацию. Поэтому в метод actionView() добавляем еще немного кода, и теперь он выглядит вот так:
public function actionView ()
{
$this->pageTitle = "";
if (!empty($_GET['url'])) {
// На всякий случай удаляю пробелы и устанавливаю
// максимальную длину для url в 100 символов.
$url = substr(trim($_GET['url']), 0, 100);
// Только англ. буквы и цифры в url
if(preg_match("/^[a-zA-Z0-9\-\_]+$/", $url)) {
$post = Posts::model()->find("url = :url", array(':url' => $url));
// Тема есть в базе
if (!empty($post)) {
// Для того чтобы сгенерировать форму добавления комментария
$comm_form = new Comments();
// Если был отправлен новый комментарий...
if (!empty($_POST['Comments']))
{
$comm_form->attributes = $_POST['Comments'];
$comm_form->id_post = (int)$post->id;
$comm_form->created = date('Y-m-d H:i:s');
if (!Yii::app()->user->isGuest) {
// Если не гость - заполняем запись действиельным
// айдишником владельца комментария и ником
$comm_form->id_user = Yii::app()->user->id;
$comm_form->login = Yii::app()->user->name;
} else {
// Если гость...
$comm_form->id_user = 0;
}
// Валидация специально идет после присваивания значению login
// того что ввёл гость через форму. Я это сделал для того чтобы
// введенные данные были проверены через rules
if ($comm_form->validate('add')) {
// ну теперь можем делать save..
$comm_form->save();
} else {
// ошибка при добавлении комментария.
// не прошла валидация..
}
}
// Создаем критерию отбора данных
$com_criteria = new CDbCriteria;
// Нам нужны все записи где id_post = текущему посту
$com_criteria->condition = 'id_post = :id';
// Вместо :id посдтавляем реальное значение
$com_criteria->params = array(':id' => $post->id);
// Сортируем данные. Что бы новые отзывы - были вверху
$com_criteria->order = 'created ASC';
// Передаем критерию в findAll
$comments = $comm_form->findAll($com_criteria);
$this->render('view', array(
'post' => $post,
// результат передаем в отображение.
'comments' => $comments,
'comm_form' => $comm_form,
));
} else {
// Такой темы в базе нет. 404?
Yii::app()->runController('post/error404');
}
} else {
Yii::app()->runController('post/error403');
}
} else {
// $_GET['url'] пустое. Выводим главную страницу
Yii::app()->runController('post/index');
}
}
Я надеюсь комментариев в коде вам достаточно что бы понять суть работы.
Создаем модель Comments
Теперь мы перешли к одному из главных моментов - создание модели.
Создаем файл Comments в папке models:
<?php
class Comments extends CActiveRecord
{
public $verifyCode;
public $guestlogin = "Гость";
public static function model($className=__CLASS__)
{
return parent::model($className);
}
public function tableName()
{
return 'comments';
}
public function relations()
{
return array(
// делаем привязку комментария к пользователю. что бы иметь возможность
// получить его логин вместо id_user
'user' => array(self::BELONGS_TO, 'User', 'id_user'),
);
}
}
Тут вы должны были увидеть такую вещь с которой мы раньше НЕ работали. В relations задаются связи нашей модели с другими моделями. Для лучшего понимания скажу что это некий JOIN который будет выполняться автоматически когда мы делаем select.
В данном случае я связываю комментарий к моделью User по полю id_user. Мне это нужно при выводе комментариев (что бы знать текущий логин пользователя который оставил комментарий вместо его id). Подробнее прочитать про relations вы может в статье Реляционная Active Record [рус.]
Теперь нам надо бы добавить safeAttributes (для защиты от хаЦкеров) и attributeLabels (для красоты отображения имен полей). Добавляем в Comments.php :
public function attributeLabels()
{
return array(
'verifyCode' => 'Код',
'login' => 'Имя',
);
}
public function safeAttributes()
{
return array('verifyCode', 'text', 'login');
}
Ну а теперь пожалуй самое важное - rules. Правил для проверки данных у нас будет в принципе немного, но без них форма была бы очень не безопасна:
public function rules()
{
return array(
// логин может содержать только англ и рус буквы, плюс цифры.
array('login', 'match', 'pattern' =>'/^[A-Za-z0-9А-Яа-я\_\-\s,]+$/u','message' => 'Логин содержит недопустимые символы.'),
// логин, пароль не должны быть больше 128-и символов, и меньше трёх
array('login', 'length', 'max'=>128, 'min' => 3),
// проверка капчи
array('verifyCode', 'captcha', 'allowEmpty'=>!extension_loaded('gd')),
);
}
Хочу заметить что логин я проверяю по той причине что гость у нас в форме может написать всё что угодно.
Для удобства файл Comments.php в конечном итоге у вас должен выглядеть следующим образом:
<?php
class Comments extends CActiveRecord
{
public $verifyCode;
public $guestlogin = "Гость";
public static function model($className=__CLASS__)
{
return parent::model($className);
}
public function tableName()
{
return 'comments';
}
public function relations()
{
return array(
// делаем привязку комментария к пользователю. что бы иметь возможность
// получить его логин вместо id_user
'user' => array(self::BELONGS_TO, 'User', 'id_user'),
);
}
public function attributeLabels()
{
return array(
'verifyCode' => 'Код',
'login' => 'Имя',
);
}
public function safeAttributes()
{
return array('verifyCode', 'text', 'login');
}
public function rules()
{
return array(
// логин может содержать только англ и рус буквы, плюс цифры.
array('login', 'match', 'pattern' =>'/^[A-Za-z0-9А-Яа-я\_\-\s,]+$/u','message' => 'Логин содержит недопустимые символы.'),
// логин, пароль не должны быть больше 128-и символов, и меньше трёх
array('login', 'length', 'max'=>128, 'min' => 3),
// проверка капчи
array('verifyCode', 'captcha', 'allowEmpty'=>!extension_loaded('gd')),
);
}
}
Пробуем
Теперь смело заходим к себе на localhost на страницу одной из тем, и проверяем как работаю комментарии.
Как это работает у меня - вы можете посмотреть на yii.dbhelp.ru
Вот и все. Надеюсь у вас получилось со всем разобраться.
Кстати хочу посоветовать вам одну отличную методику которой часто пользуюсь для усвоения материала. Первый раз прочитайте статью и выполняйте все действий. Когда поймете что вы в принципе поняли как это дело работает - просто удалите всё. Закройте блог, и попробуйте всё повторить самостоятельно. Если с первого раза не получиться - подсмотрите в блог, и попробуйте продолжить дальше самостоятельно.
Исходники
_comments.php
_commentsForm.php
Comments.php
PostController.php
view.php
структура проекта + исходники урока (rar)
Если хотите опубликовать этот материал у себя - пожалуйста, разместите ссылку на страницу откуда вы его взяли.
- Давайте сегодня немного поработаем со всевозможными настройками которые нам предоставляет стандартный класс для работы с капчей (CCaptcha).
next
Давайте для начала ... "Изменяем нашу каптчу (captcha)"
- Новое сообщение на официальном сайте поддержки Yii информирует нас про утверждение нового дизайна сайта, логотипа и стиля.
Как сообщает разработчик фреймворка, ... "Новый Yii дизайн"
- Вот и порадовали нас новой версией любимого фреймворка. Хотелось бы отметить что на этот раз исправлений ошибок оказалось меньше чем ... "Yii PHP framework 1.0.9"

[adm] zolter
Было сказано: Пятница, 03 Июль 2009
Как и обещал - новое чтиво.
До понедельника думаю новых текстов можете не ждать.

SkliF
Было сказано: Пятница, 03 Июль 2009
А можно к каждому уроку полный архивчик с блогом который в уроках разрабатывается?
Так разбираться будет проще чем пошагово копипастить)

[guest] xoma
Было сказано: Суббота, 04 Июль 2009
Спасибо за статьи!
У меня вопрос: а почему бы это
$comm_form->created = date('Y-m-d H:i:s');
и это
$comm_form->id_user = Yii::app()->user->id;
$comm_form->login = Yii::app()->user->name;
не вынести в модель, например в beforeValidate() ?

[adm] zolter
Было сказано: Суббота, 04 Июль 2009
to SkliF
просто я разработку веду сразу на хостинге (не вирт машина) поэтому будет немного проблемно всё это дело копировать и архивировать :) но я постараюсь :)

[adm] zolter
Было сказано: Суббота, 04 Июль 2009
to xoma
В принципе тоже вариант :) Почему то он у меня из головы вылетел.. ^_^
В общем вот это:
$comm_form->created = date('Y-m-d H:i:s');
красиво было бы сделать через Behavior. Но по его поводу я потом еще что-то напишу :)

[guest] GueST
Было сказано: Вторник, 07 Июль 2009
Урок получился солидным по высоте текста, плюс около десяти комментариев, а меня вместо того, чтобы сфокусировать на допущенной ошибке (Неправильный код проверки) кидает в самый верх страницы!
Мотаем вниз... До-о-о-лго... :(

[adm] zolter
Было сказано: Вторник, 07 Июль 2009
Да, к сожалению не придумал как при ошибки в форме без перезагрузки сделать прокрутку вниз :(

[guest] MixTer
Было сказано: Среда, 08 Июль 2009
А почему бы не реализовать добавление комментов через ajax + была бы еще одна тема для статьи (насчет yii+ajax)

[adm] zolter
Было сказано: Среда, 08 Июль 2009
В принципе можно, там ничего сложного. Главное что б это было интересно читателям :)

[adm] zolter
Было сказано: Среда, 08 Июль 2009
В статью добавлена ссылка на рабочий проект. (rar) архив содержит в себе исходники всех предыдущих уроков + текущего урока. Что бы запустить его от вас требуется изменить немного index.php (прописать новый путь к yii) и config/main.php (логин пароль к базе)

[adm] zolter
Было сказано: Четверг, 09 Июль 2009
Уже почти готов "Урок 8" в котором будет разобрано как подключить дизайн к yii приложению (в виде отдельной темы).

[guest] Space
Было сказано: Пятница, 14 Август 2009
Добрый день было бы интересно продолжение этого топика, на тему как добавить постраничное листание к комментам

[guest] zolter
Было сказано: Пятница, 14 Август 2009
Там все в принципе аналогично. Просто вместо модели постов, ставите модель комментариев и добавляете в отображение виджет пагинации. Как будет время - я постараюсь написать, к сожалению, на этой неделе точно не смогу.

[guest] snnwolf
Было сказано: Понедельник, 31 Август 2009
Классный урок. Но есть пара замечаний.
1. После отправки коммента стоит рефрешить страницу как здесь у тебя в блоге
2. Yii сам не подгружает скрипты jquery, если используются какие-либо его функции. В твоих примерах это делала, на мой скромный взляд, captcha

[guest] zolter
Было сказано: Понедельник, 31 Август 2009
Сенк.
да, я потом тоже заметил что Yii сам не подключает :)

[guest] Гость
Было сказано: Вторник, 09 Февраль 2010
Почему-то не сохраняется текст комментария в базу. При этом логин сохраняется.
Версия Yii последняя стабильная.
Пугает в режиме отладки отсутствие поля text в запросе INSERT:
Executing SQL: INSERT INTO `comments` (`login`, `id_post`, `created`,
`id_user`) VALUES (:yp0, :yp1, :yp2, :yp3)

[guest] Гость
Было сказано: Суббота, 13 Февраль 2010
Так есть хоть какие-то мысли по поводу сохранения комментария?

[guest] zolter
Было сказано: Суббота, 13 Февраль 2010
Я так думаю проблема в том что вы не кинули текст коммента как сэйватрибут в модель. В контроллере сделайте принтовку того что приходит с $_POST и попробуйте в ручную прописать
$model->text = $_POST['ModelName']['text'] и все будет работать.
Просто данный урок писался для старой версии yii, где в сэйватрибуты небыло обязалово кидать все что хотим сохранить

[guest] Гость
Было сказано: Суббота, 13 Февраль 2010
Вручную работает, а в автомате нет. Как-то это не правильно.

[guest] zolter
Было сказано: Суббота, 13 Февраль 2010
Что б работало автоматом - надо добавить в метод сэйвАттрибутес список полей которые будут заполнятся автоматически.
http://www.yiiframework.com/doc/api/CModel#safeAttributeNames-detail

Kyuzo
Было сказано: Понедельник, 15 Февраль 2010
аналогичная проблема с автоматическим занесением в базу текста комментария
public function safeAttributes()
{
return array('verifyCode', 'login', 'text');
}присутствует

Kyuzo
Было сказано: Понедельник, 15 Февраль 2010
с исходниками взятыми из архива аналогичная ситуация, версия Yii 1.1.0

[guest] Гость
Было сказано: Понедельник, 15 Февраль 2010
Еще раз повторяю, для версий 1.1.х что бы работало автоматически - надо занести в моделе поля в сэйвАтрибутс
http://www.yiiframework.com/doc/api/CModel#safeAttributeNames-detail

[guest] Гость
Было сказано: Понедельник, 15 Февраль 2010
имелось ввиду не сейвАтрибутс а все же сейф, от слова safe?
так вот, обратите внимание на коммент 1016
public function safeAttributes()
{
return array('verifyCode', 'login', 'text');
}или я что-то не так понял?

[guest] zolter
Было сказано: Вторник, 16 Февраль 2010
Да, точно. Все верно значит, должно писать автоматом.
А ваши поля в базе случайно не отличные от text/login к примеру?

Kyuzo
Было сказано: Вторник, 16 Февраль 2010
нет, не отличные,
проблему кстати решил простой строчкой в модели
public function rules()
{
return array(
array('text', 'required'),
);
}
видимо если поле не описано в правилах, то и в обработку не попадает?

Kyuzo
Было сказано: Вторник, 16 Февраль 2010
http://www.yiiframework.com/doc/guide/upgrade
Removed CModel::safeAttributes(). Safe attributes are now defined to be those that are being validated by some rules as defined in CModel::rules() for the particular scenario.как-то так :)
там еще интересности на эту тему есть

[guest] Гость
Было сказано: Пятница, 26 Февраль 2010
Подскажите, а как выполняются такие запросы как SELECT SUM(...) и подобные, т.е. как их грамотно написать с точки зрения yii??
Вот например мне надо просуммировать прибыль с проектов например:
$sql = 'SELECT SUM(cost) FROM `projects`';
$param = array('id_user' = 13);
$AllSum=Project::model()->findAllBySql($sql,$param);
Как то бредово получается....

Kros
Было сказано: Пятница, 19 Март 2010
Тимур, эта страница оч жёстко отображается - лишний закрывающий тег наверное, чутка нечитаемо, было бы кульно, если бы вы поправили, скрин - http://i044.radikal.ru/1003/28/6c13ea770190.jpg
по нажатии кнопки "показать" - контент открывается в комментариях.
а в ИЕ8 даже без кнопочки - вообще почти статьи нет)

[guest] zolter
Было сказано: Суббота, 20 Март 2010
to Гость
читайте про это вот тут http://dbhelp.ru/yii-cdbexpression-help/page/

[guest] Гость
Было сказано: Воскресенье, 21 Март 2010
CCaptchaValidator.action "captcha" is invalid. Unable to find such an action in the current controller.
(( я вот такое получаю( разбираюсь..

[guest] Гость
Было сказано: Воскресенье, 21 Март 2010
добавил по примеру из демоблога
public function actions()
{
return array(
// captcha action renders the CAPTCHA image displayed on the contact page
'captcha'=>array(
'class'=>'CCaptchaAction',
'backColor'=>0xFFFFFF,
),
// page action renders "static" pages stored under 'protected/views/site/pages'
// They can be accessed via: index.php?r=site/page&view=FileName
'page'=>array(
'class'=>'CViewAction',
),
);
}
в наш контроллер и капча заработала.. Видно что-то где-то упустил

[guest] Гость
Было сказано: Пятница, 25 Февраль 2011
Подскажите пожалуйста есть ли возможность задать текст по умолчанию в:
CHtml::activeTextArea($form, 'text', array('rows'=>20, 'cols'=>70))для textArea это сделать легко, но хотелось бы чтоб это дело работало ч-з вилидацию и ч-з массовое присваивание

[guest] zolter
Было сказано: Суббота, 26 Февраль 2011
В самой модели создайте паблик переменную text с дефолтным значением и оно будет подставлять её.

[guest] Гость
Было сказано: Суббота, 26 Февраль 2011
Да, паблик переменная с дефолным значением в данной ситуации помогла, но мне нужно немного другое, мне надо чтоб это значение подставлялось из БД, вылаживаю код:
контроллер
...
public function actionTest(){
$criteria = new CDbCriteria;
$criteria->condition = 'type=:var';
$criteria->params = array(':var'=>'index');
$Test_obj = Test::model()->find($criteria);
$form = new Test();
if (!empty($_POST['Test'])){
$Test_obj->attributes = $_POST['Test'];
if($Test_obj->validate()){
if ($Test_obj->save())
//сохранилось
}else{
//не сохранилось
}
}
$this->render('test', array(
'form' =>$form,
'title' =>$Test_obj->title,
'description' =>$Test_obj->description,
'keywords' =>$Test_obj->keywords,
'text' =>$Test_obj->text,
));
}
...
модель
...
class Test extends CActiveRecord{
public static function model($className=__CLASS__){
return parent::model($className);
}
public function tableName(){
return 'statics';
}
public function rules(){
return array(
array('text', 'required', 'message'=>'Текст не должен быть пустым'),
array('text, title, description, keywords', 'safe'),
);
}
public function attributeLabels(){
return array(
'text' =>'Текст',
'title' =>'Title',
'description' =>'Description',
'keywords' =>'Keywords',
);
}
}
...
отображение
...
<div class="form">
<?php echo CHtml::form(); ?>
<?php echo CHtml::errorSummary($form, 'Исправьте, пожалуйста, следующие ошибки:'); ?>
<div class="row">
<?php echo CHtml::activeLabel($form, 'title'); ?>
<?php echo CHtml::activeTextField($form, 'title', array('value'=>$title, 'size'=>50, 'maxlength'=>100)); ?>
</div>
<div class="row">
<?php echo CHtml::activeLabel($form, 'description'); ?>
<?php echo CHtml::activeTextField($form, 'description', array('value'=>$description, 'size'=>50, 'maxlength'=>100)); ?>
</div>
<div class="row">
<?php echo CHtml::activeLabel($form, 'keywords'); ?>
<?php echo CHtml::activeTextField($form, 'keywords', array('value'=>$keywords, 'size'=>50, 'maxlength'=>100)); ?>
</div>
<div class="row">
<?php echo CHtml::activeLabel($form, 'text'); ?>
<?php echo CHtml::activeTextArea($form, 'text', array('rows'=>20, 'cols'=>70)); ?>
</div>
<div class="row buttons">
<?php echo CHtml::submitButton('Сохранить', array('id'=>"submit")); ?>
</div>
<?php echo CHtml::endForm(); ?>
</div><!--form-->
идея следующая, есть статичные страницы, и их значения надо менять, вариант с CKEditor не подойдет, нужно именно ч-з activeTextArea.
Вопрос тот же, как в текст арию вставить текст полученный из БД.
Подскажите пожалуйста...
P.S. а вот задать значение в HtmlOptions я конечно же пробовал, ничего не получилось может тут есть какой то хитрый атрибут ч-з который можно? (точно не value)

[guest] паша
Было сказано: Воскресенье, 27 Февраль 2011
Ты демоблог изнутри видел? Советую ознакомиться, там про это хорошо понятно. Просто в отображении используй модель, лайк зис:
<?php echo CHtml::activeTextArea($model,'content',array('rows'=>10, 'cols'=>70)); ?>

[guest] zolter
Было сказано: Вторник, 01 Март 2011
В rules:
# default: псевдоним класса CDefaultValueValidator, который присваивает значение по умолчанию выбранным атрибутам;

[guest] Гость
Было сказано: Суббота, 02 Июль 2011
Добрый день! У меня какой то глюк отображения кода
http://floomby.ru/content/n39qgqLGk2/

[guest] Гость
Было сказано: Суббота, 02 Июль 2011
Уточню, у меня хром стоит и только когда нажимаешь на кнопку "показать код" до нажатия нормально


