Рассмотрим реализацию операций CRUD (Create, Read, Update и Delete) для записей и пользователей на примере входящей в дистрибутив yii демонстрации блога.
Забегая вперёд, скажу, что пост будет изобиловать иллюстрациями. Они помогут вам избежать моих мучений при изучении функционала yii.
Авторизовавшись в деме блога под пользователем demo, мы видим яркий пример реализации CRUD для записей:
Если вы никогда ранее не сталкивались с подобными реализациями, например со скаффолдингом в CodeIgniter, может показаться, что для реализации подобной функциональности будет потрачен не один час разработки.
Но, как и каждый уважающий себя фреймворк, Yii может похвастаться мощнейшим кодогенератором под названием Gii. При помощи данного инструментария создание каркаса такого функционала потребует не более 5 минут.
Первым делом требуется активировать Gii, входящий в состав Yii начиная с версии 1.1.2.
Для этого в файл конфигурации, который находится по адресу protected\config\main.php, необходимо добавить следующий код:
return array( ... 'modules'=>array( 'gii'=>array( 'class'=>'system.gii.GiiModule', 'password'=>'password', ), ), |
Если ваше приложение использует ЧПУ, т.е. ссылки имеют вид index.php/site/contact, а не index.php?r=site/contact, то также требуется добавить правила URL перед уже существующими:
'components'=>array( ... 'urlManager'=>array( 'urlFormat'=>'path', 'rules'=>array( 'gii'=>'gii', 'gii/<controller:\w+>'=>'gii/<controller>', 'gii/<controller:\w+>/<action:\w+>'=>'gii/<controller>/<action>', 'post/<id:\d+>/<title:.*?>'=>'post/view', 'posts/<tag:.*?>'=>'post/index', '<controller:\w+>/<action:\w+>'=>'<controller>/<action>', ), ), |
На этом все настройки закончены. Теперь перейдём по адресу http://site/index.php/gii/ , в появившуюся форму авторизации введём заданный нами пароль (password). После успешного входа в меню выбираем Crud Generator.
Здесь необходимо задать имя модели, на основе которой создаём CRUD интерфейс.
Так как мы задались целью управлять записями, то необходимо прописать 'Post' либо 'application.models.Post'.
Поле Controller ID заполнится автоматически.
Кликнув на Preview, увидим, что файлы уже существуют и генератор предлагает переписать их.
Напоминаю о том, что интерфейс по управлению записями уже имеется поэтому файлы этого инструментария существуют.
Мы с вами не собираемся их перезаписывать, поэтому просто зададим другое имя в поле Controller ID, например 'myPost'.
Кликнув на Preview, видим, что ни один файл перезаписан не будет, а будут созданы новые, что нас устраивает. Далее кликам на Generate.
Интерфейс управления записями фактически создан. Остаётся убедиться в его работоспособности.
Набирая в адресной строке http://site/index.php/myPost/admin , видим сообщение о том, что у нас нет прав. Как же так? Мы же его только что создали. Что произошло?
Чтобы разрешить это маленькое недоразумение, необходимо открыть файл protected\controllers\PostController.php скопировать функцию accessRules()
public function accessRules() { return array( array('allow', // allow all users to access 'index' and 'view' actions. 'actions'=>array('index','view'), 'users'=>array('*'), ), array('allow', // allow authenticated users to access all actions 'users'=>array('@'), ), array('deny', // deny all users 'users'=>array('*'), ), ); } |
и с заменой вставить её в недавно созданный файл protected\controllers\MyPostController.php.
После этих манипуляций с кодом, возвращаемся в браузер, нажимаем F5
Ура! Заработало. Можно редактировать, удалять, создавать новые записи.
Ссылки (http://site/index.php/myPost/create) на создание новой записи нет, но вы и без посторонней помощи сможете добавить её в необходимое место.
Не стоит забывать, что это всего лишь каркас и его требуется "дорабатывать" под свои нужды.
Попробуйте сами добавить CRUD интерфейс для работы с пользователями.
Если не получится - на следующей странице можно подглядеть ответ.
Спасибо за внимание.
По принципу, описанному на предыдущей странице, необходимо указать имя модели:
Вставить с заменой функцию accessRules() из protected\controllers\PostController.php в protected\controllers\UserController.php
Открыть файл protected\models\User.php и добавить функцию search()
public function search() { $criteria=new CDbCriteria; return new CActiveDataProvider('User', array( 'criteria'=>$criteria, 'sort'=>array( 'defaultOrder'=>'id DESC', ), )); } |
Размер таблицы отображения слишком велик, для его уменьшения в файле \protected\views\user\admin.php в самом низу удалим несколько значений из массива 'columns'
'columns'=>array( 'id', 'username', 'email', array( 'class'=>'CButtonColumn', ), ), |
Что получилось в итоге: