Skip to content

Commit

Permalink
merge from 1.0.
Browse files Browse the repository at this point in the history
  • Loading branch information
qiang.xue committed Sep 30, 2009
1 parent 2dc1c32 commit ad3767f
Show file tree
Hide file tree
Showing 48 changed files with 1,501 additions and 137 deletions.
110 changes: 110 additions & 0 deletions docs/blog/ru/comment.admin.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
Управление комментариями
========================

Управление комментариями включает обновление, удаление и одобрение комментариев.
Эти операции реализованы как действия класса `CommentController`.


Обновление и удаление комментариев
----------------------------------

Код, сгенерированный утилитой `yiic` для обновления и удаления комментариев,
остается, в основном, неизменным. Поскольку мы поддерживаем предварительный
просмотр комментария при его обновлении, мы должны только изменить метод
`actionUpdate()` контроллера `CommentController` следующим образом,

~~~
[php]
public function actionUpdate()
{
$comment=$this->loadComment();

if(isset($_POST['Comment']))
{
$comment->attributes=$_POST['Comment'];
if(isset($_POST['previewComment']))
$comment->validate('update');
else if(isset($_POST['submitComment']) && $comment->save())
$this->redirect(array('post/show',
'id'=>$comment->postId,
'#'=>'c'.$comment->id));
}

$this->render('update',array('comment'=>$comment));
}
~~~

Похожее есть в контроллере `PostController`.

Одобрение комментариев
----------------------

Недавно созданные комментарии находятся в статусе ожидающих одобрения и должны быть одобрены, чтобы стать видимыми для гостевого пользователя. Одобрение комментария - это, главным образом, изменение столбца состояния комментария.

Мы создаем метод `actionApprove()` в классе `CommentController` следующим образом,

~~~
[php]
public function actionApprove()
{
if(Yii::app()->request->isPostRequest)
{
$comment=$this->loadComment();
$comment->approve();
$this->redirect(array('post/show',
'id'=>$comment->postId,
'#'=>'c'.$comment->id));
}
else
throw new CHttpException(400, 'Invalid request...');
}
~~~

Выше, когда действие `approve` вызывается через запрос POST, мы вызываем метод
`approve()`, определенный в модели `Comment`, для изменения статуса. Затем мы
переадресовываем браузер пользователя к странице, отображающей запись, к которой
относится этот комментарий.

Мы также изменяем метод `actionList()` контроллера `Comment`, чтобы показать
список комментариев, ожидающих одобрения.

~~~
[php]
public function actionList()
{
$criteria=new CDbCriteria;
$criteria->condition='Comment.status='.Comment::STATUS_PENDING;

$pages=new CPagination(Comment::model()->count($criteria));
$pages->pageSize=self::PAGE_SIZE;
$pages->applyLimit($criteria);

$comments=Comment::model()->with('post')->findAll($criteria);

$this->render('list',array(
'comments'=>$comments,
'pages'=>$pages,
));
}
~~~

В представлении `list` мы отображаем детально каждый комментарий, ожидающий
одобрение. В частности, мы показываем кнопку `Одобрить` следующим образом,

~~~
[php]
<?php if($comment->status==Comment::STATUS_PENDING): ?>
<span class="pending">Ожидают одобрения</span> |
<?php echo CHtml::linkButton('Одобрить', array(
'submit'=>array('comment/approve','id'=>$comment->id),
)); ?> |
<?php endif; ?>
~~~

Мы используем метод [CHtml::linkButton()] вместо [CHtml::link()], потому что
первый вызвал бы запрос POST, в то время как второй вызывает запрос GET.
Рекомендуется, чтобы запрос GET не изменял данные на сервере. Иначе мы
оказываемся перед опасностью, что пользователь может неосторожно изменить
данные на сервере несколько раз, если он обновит страницу.

<div class="revision">$Id: comment.admin.txt 1335 2009-08-15 20:34:36Z qiang.xue $</div>
122 changes: 122 additions & 0 deletions docs/blog/ru/comment.create.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
Создание и отображение комментариев
===================================

В данном разделе мы реализуем функции отображения и создания комментариев.


Отображение комментариев
------------------------

Вместо использования индивидуальных страниц отображения и создания
комментариев, мы используем страницу отображения записи. Под контентом записи
мы отображаем список комментариев, принадлежащих записи и форму создания
комментария.

Чтобы отобразить комментарии на странице записи, мы изменяем метод
`actionShow()` контроллера `PostController` следующим образом:

~~~
[php]
public function actionShow()
{
$post=$this->loadPost();
$this->render('show',array(
'post'=>$post,
'comments'=>$post->comments,
));
}
~~~

Заметим, что выражение `$post->comments` правильно, потому что мы объявили
отношение `comments` в классе `Post`. Выполнение этого выражения вызвало бы
неявный JOIN-запрос к БД, чтобы возвратить комментарии, принадлежащие текущей
записи. Эта особенность известна как [ленивая загрузка](/doc/guide/ru/database.arr).

Мы также изменяем представление `show`, добавляя отображение комментария в
конце отображения записи, которое мы не будем уточнять.

Создание комментариев
---------------------

Чтобы обработать создание комментария, мы сначала изменяем метод `actionShow()`
контроллера `PostController` следующим образом:

~~~
[php]
public function actionShow()
{
$post=$this->loadPost();
$comment=$this->newComment($post);
$this->render('show',array(
'post'=>$post,
'comments'=>$post->comments,
'newComment'=>$comment,
));
}

protected function newComment($post)
{
$comment=new Comment;
if(isset($_POST['Comment']))
{
$comment->attributes=$_POST['Comment'];
$comment->postId=$post->id;
$comment->status=Comment::STATUS_PENDING;

if(isset($_POST['previewComment']))
$comment->validate('insert');
else if(isset($_POST['submitComment']) && $comment->save())
{
Yii::app()->user->setFlash('commentSubmitted','Спасибо...');
$this->refresh();
}
}
return $comment;
}
~~~

Выше мы вызываем метод `newComment()` перед рендерингом представления `show`.
В методе `newComment()` мы создаем экземпляр класса `Comment` и проверяем,
отправлена ли форма комментария. Форма может быть отправлена щелчком мыши либо
по кнопке отправки либо по кнопке предпросмотра. Если первое, то пытаемся
сохранить комментарий и отобразить flash-сообщение. Flash-сообщение отображается
только один раз, а значит, при следующем обновлении страницы оно исчезнет.

Мы также модифицируем представление `show` добавлением формы создания комментария:

~~~
[php]
......
<?php $this->renderPartial('/comment/_form',array(
'comment'=>$newComment,
'update'=>false,
)); ?>
~~~

Здесь мы включаем форму создания комментария рендерингом частичного
представления `/wwwroot/blog/protected/views/comment/_form.php`. Переменная
`$newComment` передается методом `actionShow`. Её назначение - хранение
введенного пользовательского комментария. Переменная `update` установлена в
значение false, которое указывает, что форма комментария используется для
создания нового комментария.

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

~~~
[php]
... форма комментария с кнопкой предварительного просмотра...

<?php if(isset($_POST['previewComment']) && !$comment->hasErrors()): ?>
<h3>Предварительный просмотр</h3>
<div class="comment">
<div class="author"><?php echo $comment->authorLink; ?> сказал:</div>
<div class="time"><?php echo date('F j, Y \a\t h:i a',$comment->createTime); ?></div>
<div class="content"><?php echo $comment->contentDisplay; ?></div>
</div><!-- post preview -->
<?php endif; ?>
~~~

<div class="revision">$Id: comment.create.txt 1157 2009-06-22 15:25:02Z qiang.xue $</div>
90 changes: 90 additions & 0 deletions docs/blog/ru/final.deployment.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
Тонкая настройка и развёртывание
================================

Мы близки к завершению разработки приложения - системы управления блогом. Перед
развертыванием мы бы хотели сделать некоторые настройки.


Изменение домашней страницы
------------------

Будем использовать список записей в качестве домашней страницы. Для этого
изменим [конфигурацию приложения](/doc/guide/ru/basics.application#application-configuration)
следующим образом:

~~~
[php]
return array(
......
'defaultController'=>'post',
......
);
~~~

> Tip|Подсказка: Поскольку контроллер `PostController` уже объявляет действие
`list` действием по умолчанию, то при обращении к домашней странице приложения
мы увидим результат, сгенерированный действием `list` контроллера записей.


Включение кэширование схемы
-----------------------

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

~~~
[php]
return array(
......
'components'=>array(
......
'cache'=>array(
'class'=>'CDbCache',
),
'db'=>array(
'class'=>'system.db.CDbConnection',
'connectionString'=>'sqlite:/wwwroot/blog/protected/data/blog.db',
'schemaCachingDuration'=>3600,
),
),
);
~~~

В коде выше мы сначала добавляем компонент `cache`, который использует базу
данных SQLite, определенную по умолчанию, как хранилище кэша. Если наш сервер
имеет другие кэширующие расширения, такие как APC, мы могли бы так же легко их
использовать. Мы также изменяем компонент `db`, устанавливая свойство
[schemaCachingDuration|CDbConnection::schemaCachingDuration] в значение 3600,
что означает, что полученные данные схемы базы данных могут оставаться
валидными в кэше в течение 3600 секунд.


Отключение дебаг-режима
------------------------

Изменим файл точки входа `/wwwroot/blog/index.php`, удалив линию, определяющую
константу `YII_DEBUG`. Эта константа полезна во время стадии разработки, потому
что позволяет Yii отображать больше информации об отладке при возникновении
ошибки. Однако, когда приложение выполняется в рабочем режиме, отображать
информацию об отладке - не очень хорошая идея, потому что это может содержать
секретную информацию, такую как расположение файла скрипта, содержание файла и др.


Развертывание приложения
-------------------------

Заключительное развертывание главным образом включает в себя копирование
директории `/wwwroot/blog` в целевую директорию. Следующий контрольный список
содержит все необходимые шаги:

1. Установите Yii в место назначения, если он еще не установлен;
2. Скопируйте всю директорию `/wwwroot/blog` в место назначения;
3. Отредактируйте файл точки входа `index.php`, указав в переменной `$yii` путь к файлу начальной загрузки Yii;
4. Отредактируйте файл `protected/yiic.php`, указав в переменной `$yiic` путь к новому файлу `$yiic`;
5. Измените права директорий `assets` и `protected/runtime` так, чтобы они имели доступ на перезапись процессом Web-сервера.

<div class="revision">$Id: final.deployment.txt 683 2009-02-16 05:20:17Z qiang.xue $</div>
26 changes: 26 additions & 0 deletions docs/blog/ru/final.error.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
Настройка отображения ошибок
=========================

Наше приложение использует для отображения различных ошибок шаблоны,
предоставленные Yii. Поскольку стиль и формулировка отличаются от того, чего
хотелось бы нам, настроим эти шаблоны. Для этого мы создаем несколько файлов
представления в директории `/wwwroot/blog/protected/views/system`.


Сначала создадим файл `error.php`. Это файл представления по умолчанию, который
будет использоваться для отображения всех видов ошибок, если не будет доступен
файл представления для определенной специфичной ошибки. Поскольку этот файл
представления используется, когда происходит ошибка, он не должен содержать
сложную логику PHP, которая может вызвать дальнейшие ошибки. Отметим также, что
файлы представления ошибок не используют макет. Поэтому, каждый файла
представления должен быть законченной страницей для отображения.

Мы также создаем файл `error403.php` для отображения ошибки 403
(неаутентифицирован) и файл `error404.php` для отображения ошибки 404 (страница
не найдена) HTTP протокола.

Чтобы узнать больше деталей об именовании файлов представлений ошибок,
обратитесь к разделу [отображение ошибок](/doc/guide/ru/topics.error#displaying-errors)
руководства.

<div class="revision">$Id: final.error.txt 1049 2009-05-22 20:00:35Z qiang.xue $</div>
Loading

0 comments on commit ad3767f

Please sign in to comment.