Files
yii/docs/blog/ru/post.create.txt
2012-01-01 03:05:53 +00:00

125 lines
6.0 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Создание и редактирование записей
=================================
После того, как мы закончили с моделью `Post`, займёмся контроллером
`PostController` и его отображениями. В данном разделе мы настроим правила
доступа операций CRUD. Затем изменим код, отвечающий за `создание`(`create`) и
`обновление`(`update`).
Настройка правил доступа
------------------------
Первое, что мы запланировали — настройка
[прав доступа](/doc/guide/ru/topics.auth#access-control-filter). Код,
сгенерированный при помощи `gii` нам не подойдёт.
Необходимо изменить метод `accessRules()` в файле
`/wwwroot/blog/protected/controllers/PostController.php` следующим образом:
~~~
[php]
public function accessRules()
{
return array(
array('allow', // allow all users to perform 'list' and 'show' actions
'actions'=>array('index', 'view'),
'users'=>array('*'),
),
array('allow', // allow authenticated users to perform any action
'users'=>array('@'),
),
array('deny', // deny all users
'users'=>array('*'),
),
);
}
~~~
Описанные выше правила разрешают всем пользователям выполнять действия
`index` и `view`. Аутентифицированным — любые действия, включая `admin`.
Всем остальным пользователям запрещено всё. Стоит отметить, что правила
применяются в порядке их описания. Первое сработавшее правило определяет,
давать доступ или не давать. К примеру, если текущий пользователь является
владельцем системы и пытается зайти на страницу создания записи, будет применено
второе правило и доступ будет разрешён.
Правки в действиях `create` и `update`
--------------------------------------
Операции `create` и `update` довольно похожи. В обоих случаях требуется
вывести HTML форму для сбора данных, вводимых пользователем. Также требуется
валидация и сохранение данных в БД. Главное отличие в том, что при `update`
форма будет заполняться данными о редактируемой записи. По этой причине `gii`
генерирует вложенное отображение `/wwwroot/blog/protected/views/post/_form.php`,
которое включается как в отображение `create`, так и отображение `update` для
вывода HTML формы.
Для начала изменим файл `_form.php` таким образом, чтобы форма собирала только
нужные нам данные: `title`, `content`, `tags` и `status`. Для первых трёх атрибутов мы
используем текстовые поля. Для `status` — выпадающий список со всеми возможными
состояниями записи:
~~~
[php]
<?php echo $form->dropDownList($model,'status',Lookup::items('PostStatus')); ?>
~~~
В приведённом коде для получения списка статусов используется вызов `Lookup::items('PostStatus')`.
Далее изменим класс `Post` таким образом, чтобы он автоматически выставлял
некоторые атрибуты (такие, как `create_time` и `author_id`) непосредственно перед
сохранением записи в БД. Перекроем метод `beforeSave()`:
~~~
[php]
protected function beforeSave()
{
if(parent::beforeSave())
{
if($this->isNewRecord)
{
$this->create_time=$this->update_time=time();
$this->author_id=Yii::app()->user->id;
}
else
$this->update_time=time();
return true;
}
else
return false;
}
~~~
При сохранении записи мы хотим также обновить информацию о частоте использования
тегов в таблице `tbl_tag`. Мы можем реализовать это в методе `afterSave()`,
который автоматически вызывается после успешного сохранения записи в БД.
~~~
[php]
protected function afterSave()
{
parent::afterSave();
Tag::model()->updateFrequency($this->_oldTags, $this->tags);
}
private $_oldTags;
protected function afterFind()
{
parent::afterFind();
$this->_oldTags=$this->tags;
}
~~~
Так как необходимо определить, менял ли пользователь теги при редактировании
записи, нам понадобятся старые теги. Для этого мы реализуем метод
`afterFind()`, который записывает старые теги в свойство `_oldTags`. Метод
`afterFind()` вызывается автоматически при заполнении модели AR данными, полученными
из БД.
Здесь мы не будем детально рассматривать метод `Tag::updateFrequency()`.
Заинтересованные читатели могут ознакомиться с ним в файле
`/wwwroot/yii/demos/blog/protected/models/Tag.php`.
<div class="revision">$Id: post.create.txt 3209 2011-05-12 12:11:03Z mdomba $</div>