DbHelp.ru
Маленький Yii блог
Комментарии
Гость: комент
Гость: wahaha
zolter: Друпал на Yii? ))
nastia: http://drupal.org/
JB: Да там просто ад)) мне всего 3 значения нужно чтобы выпадало, все равно спасибо)...



Сервер Ultima Online - Forest Wars (от создателя данного блога)

Урок 7 : Комментарии

Рубрика: Создаем блог вместе

Оцените эту статью:

Рейтинг: 0.00 (0)
3 Июл. 2009
Опубликовать в Twitter Написать в Facebook Опубликовать в своем блоге livejournal.com

Эта статья устарела т.к. была написана для yii версии 1.0.х; Если вы используете более новую версию - у вас могут возникнуть ошибки из-за несовместимости. Обычно ответы на все вопросы работы на 1.1.х были описаны в комментариях ниже статьи.

Сегодня разговор пойдет о том как сделать комментарии на нашем блоге.

---

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

  1. Создаем форму (отображение) для добавления комментария
  2. Подключаем форму на страницу
  3. Подключаем вывод всех комментариев по посту внизу страницы
  4. Работа с контроллером. Добавляем поиск всех комментариев
  5. Работа с контроллером. Механизм проверки что пришли данные с формы
  6. Создаем модель Comments
  7. Пробуем

В принципе ничего замысловатого. Ну что, начнем?

Введение

Форма добавления комментариев будет выглядеть примерно точно также как у меня на 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)



Если хотите опубликовать этот материал у себя - пожалуйста, разместите ссылку на страницу откуда вы его взяли.
Другие yii статьи:

  1. Давайте сегодня немного поработаем со всевозможными настройками которые нам предоставляет стандартный класс для работы с капчей (CCaptcha). next Давайте для начала ... "Изменяем нашу каптчу (captcha)"

  2. Новое сообщение на официальном сайте поддержки Yii информирует нас про утверждение нового дизайна сайта, логотипа и стиля. Как сообщает разработчик фреймворка, ... "Новый Yii дизайн"

  3. Вот и порадовали нас новой версией любимого фреймворка. Хотелось бы отметить что на этот раз исправлений ошибок оказалось меньше чем ... "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] Гость

Было сказано: Суббота, 04 Июль 2009

Сенк! Жду продолжения!

[guest] Kirill

Было сказано: Вторник, 07 Июль 2009

Спасибо большое за ваши статьи!

[adm] zolter

Было сказано: Вторник, 07 Июль 2009

Отличная статья!

[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'),
);
}


видимо если поле не описано в правилах, то и в обработку не попадает?

[guest] zolter

Было сказано: Вторник, 16 Февраль 2010

Странно, не должно.

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] zolter

Было сказано: Среда, 17 Февраль 2010

Спасибо :)

[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

Спасибо, я гляну на днях :)

[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

Или в HtmlOptions своими руками

[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

Уточню, у меня хром стоит и только когда нажимаешь на кнопку "показать код" до нажатия нормально

[guest] hghgjhgj

Было сказано: Воскресенье, 24 Июль 2011

ghhjghj

Оставить комментарий


Код:
Имя: