Создание и сопровождение сайтов

Блог. Yii. Генерация кода при помощи Gii

Поиск

    Рассмотрим реализацию операций CRUD (Create, Read, Update и Delete) для записей и пользователей на примере входящей в дистрибутив yii демонстрации блога.

    Забегая вперёд, скажу, что пост будет изобиловать иллюстрациями. Они помогут вам избежать моих мучений при изучении функционала yii.

    Авторизовавшись в деме блога под пользователем demo, мы видим яркий пример реализации CRUD для записей:

manage post

    Если вы никогда ранее не сталкивались с подобными реализациями, например со скаффолдингом в 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 заполнится автоматически.

crud1

    Кликнув на Preview, увидим, что файлы уже существуют и генератор предлагает переписать их.

    Напоминаю о том, что интерфейс по управлению записями уже имеется поэтому файлы этого инструментария существуют.

crud2

    Мы с вами не собираемся их перезаписывать, поэтому просто зададим другое имя в поле Controller ID, например 'myPost'.

    Кликнув на Preview, видим, что ни один файл перезаписан не будет, а будут созданы новые, что нас устраивает. Далее кликам на Generate.

crud3

    Интерфейс управления записями фактически создан. Остаётся убедиться в его работоспособности.

    Набирая в адресной строке http://site/index.php/myPost/admin , видим сообщение о том, что у нас нет прав. Как же так? Мы же его только что создали. Что произошло?

crud5

    Чтобы разрешить это маленькое недоразумение, необходимо открыть файл 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

crud6

     

    Ура! Заработало. Можно редактировать, удалять, создавать новые записи.

    Ссылки (http://site/index.php/myPost/create) на создание новой записи нет, но вы и без посторонней помощи  сможете добавить её в необходимое место.

    Не стоит забывать, что это всего лишь каркас и его требуется "дорабатывать" под свои нужды.

    Попробуйте сами добавить CRUD интерфейс для работы с пользователями.

    Если не получится - на следующей странице можно подглядеть ответ.

    Спасибо за внимание.

    Обсуждение статьи на форуме


   По принципу, описанному на предыдущей странице, необходимо указать имя модели:

crud7

   Вставить с заменой функцию 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',
    ),
),

   Что получилось в итоге:

   crud9