Урок № 1 - Знакомство с Yii

Тема в разделе 'Yii Framework для начинающих', создана пользователем Igogo, 27 май 2011.

?

Понравиться ли вам эта тема, стоит ли её продолжать?

Голосование закрыто 27 авг 2011.
Да! Конечно стоит! 10 голосов 100,0%
Тема отличная, но автор совершенно писать не умеет, так что лучше не продолжать. 0 голосов 0,0%
Тема, некому не нужна! Закройте её! 0 голосов 0,0%
  1. Igogo Member


    Добрый день уважаемые форумчане, в этой теме будут выкладываться практические примеры роботы в Yii Framework!
    Для тех кто не слышал о Yii и не знает что это делаю суда копи-пейст с официального сайта данного фреймворка =)
    Ну и конечно же даю ссылку на официальный сайт и русскоязычного сайта с полной документацией, и книгой рецептов по фреймворку
    Посты в этой теме будут учебного характера, для людей которые не знакомы с Yii и хотят научиться разрабатывать высоко качественные приложения в очень короткие сроки :) и в этом вам поможет yii!

    И так что нам понадобиться для начала?

    Заходим на официальный сайт и скачиваем последнюю версию фреймворка (на момент написания поста это была версия 1.1.7) .

    Распаковываем скачанный архив.

    Далее открываем командную строку если вы пользуетесь windows и выполняем команду-
    Код:
    % путь/к/фреймворку/framework/yiic webapp путь/к/приложению/имя_приложения
    , если же вы работаете в *nix системе то выполняем в консоли команды -
    Код:
    % cd /путь/к/приложению/
    % php /путь/к/фреймворку/framework/yiic.php webapp имя_приложения
    Для наглядного примера, я сейчас выполнил у себя в linux вот такую команду -
    Код:
    cd /home/igogo/www/
    php /home/igogo/downloads/framework/yiic.php webapp yiiframework_lesson1
    Затем после нужных настроек своего сервера я смогу обращаться к своему приложению по адресу - или

    После выполнения консольных команд в папке которую вы указывали как "/путь/к/приложению/" у вас должна появиться "база" для вашего приложения, далее вы можете следовать документации или руководству по созданию блога из официального сайта используя виджет gii, а я же в этих постах буду показывать приемы написания приложения в данном случае простенького сайта, но без использования gii, то есть мы сейчас зайдем в папку нашего приложения и там удалим се что нас не интересует, и за тем начнем писать все сначала, что бы вы могли понять сам принцип написания кода в yii и могли дальше развиваться сами, сразу скажу в начале понять будит достаточно сложно, особенно тем кто плохо знаком с ООП в php!
    Для начала я хочу что бы вы удалили ненужные нам файлы, вот как у нас должна выглядеть папка приложения после чистки -
    Untitled-1.jpg
    то есть в папке /protected нужно почистить содержимое всех папок, кроме /commands, /data, /config и /tests! Все что не касается папки /protected пока что не трогаем!
    Ну и если каких то папок не хватает, то просто создаем их!

    И так приступим к первому написанию кода =)
    Открываем файл /protected/config/main.php и заменяем его код на свой -
    PHP:
    <?php
    return array(
        
    //Базовый путь к приложению
        
    'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
        
    //Имя приложения
        
    'name'=>'Yii Lessons',
        
    //Язык по умолчанию
        
    'language' => 'ru',
        
    // подключаем лог
        
    'preload'=>array('log'),
        
    //Включаем автозагрузку из папок /protected/models и /protected/components
        
    'import'=>array(
            
    'application.models.*',
            
    'application.components.*',
        ),
        
    // Подключаем behavior *который создадим позже*
        
    'behaviors'=>array(
            
    'runEnd'=>array(
                
    'class'=>'application.behaviors.WebApplicationEndBehavior',
            ),
        ),

        
    'components'=>array(
            
    // подключаемся к базе данных *замените (dbname|username|password|charset) своими*
            
    'db'=>array(
                
    'connectionString' => 'mysql:host=localhost;dbname=test_app',
                
    'emulatePrepare' => true,
                
    'username' => 'root',
                
    'password' => 'pass',
                
    'charset' => 'utf8'
            
    ),
            
    // сразу будим работать с ЧПУ
            
    'urlManager'=>array(
                
    //Убераем из удреса index.php
                
    'showScriptName' => false,
                
    // Включаем сам формат для ЧПУ адрессов
                
    'urlFormat'=>'path',
            ),
            
    // настраиваем лог
            
    'log'=>array(
                
    'class'=>'CLogRouter',
                
    'routes'=>array(
                    array(
                        
    'class'=>'CProfileLogRoute',
                        
    'levels'=>'error,profile',
                        
    'enabled'=>true,
                    ),
                ),
            ),
        ),
        
    'params'=>require(dirname(__FILE__).'/params.php'),
    );
    Далее создаем файл /protected/behaviors/WebApplicationEndBehavior.php
    Этот behavior поможет нам разбить логику приложения на сам сайт и на админский раздел вставляем в него следующий код -
    PHP:
    <?php
    class WebApplicationEndBehavior extends CBehavior
    {
        
    // имя нужной нам части сайта
        
    private $_endName;
        
    // геттер $_endName;
        
    public function getEndName(){
            return 
    $this->_endName;
        }
        
    // запуск приложения
        
    public function runEnd($name){
            
    $this->_endName $name;
            
    // обрабатываем событие создания модуля
            
    $this->onModuleCreate = array($this'changeModulePaths');
            
    $this->onModuleCreate(new CEvent ($this->owner));
            
    $this->owner->run();
        }
        
    // обработчик события onModuleCreate
        
    public function onModuleCreate($event){
            
    $this->raiseEvent('onModuleCreate'$event);
        }
        
    // подменяем пути к файлам
        
    protected function changeModulePaths($event){
            
    // добавляем название части сайта (frontend или backend) в путь, по которому фреймворк будет искать контроллеры и вьюшки
            
    $event->sender->controllerPath .= DIRECTORY_SEPARATOR.$this->_endName;
            
    $event->sender->viewPath .= DIRECTORY_SEPARATOR.$this->_endName;
        }
    }
    Далее для удобства создаем в папке /protected/config/ еще два файла настроек, один для сайта, второй для админки, назовем их frontend.php и backend.php и зададим в них пока что минимальные настройки для наших частей приложения -
    frontend.php
    PHP:
    <?php
    return CMap::mergeArray(
        require_once(
    dirname(__FILE__).'/main.php'),
        array(
            
    // стандартный контроллер
            
    'defaultController' => 'page/view',
        )
    );
    backend.php
    PHP:
    <?php
    return CMap::mergeArray(
        require_once(
    dirname(__FILE__).'/main.php'),
        array(
            
    // стандартный контроллер
            
    'defaultController' => 'page/list',
        )
    );
    Далее в корне приложения создаем два файла index.php и admin.php, верней создаем один файл admin.php по тому что файл index.php у вас уже должен быть, в нем останется только заменить код -

    index.php
    PHP:
    <?php
    // Путь к фреймворку
    $yii=dirname(__FILE__).'../../framework/yii.php';
    // Путь к файлу настроек
    $config=dirname(__FILE__).'/protected/config/frontend.php';

    // Включаем режим отладки, для того что бы нам показывались ошибки
    defined('YII_DEBUG') or define('YII_DEBUG',true);

    // Подключаем фреймворк
    require_once($yii);

    // Запускаем приложение
    Yii::createWebApplication($config)->runEnd('');
    admin.php
    PHP:
    <?php
    // Путь к фреймворку
    $yii=dirname(__FILE__).'../../framework/yii.php';
    // Путь к файлу настроек
    $config=dirname(__FILE__).'/protected/config/backend.php';

    // Включаем режим отладки, для того что бы нам показывались ошибки
    defined('YII_DEBUG') or define('YII_DEBUG',true);

    // Подключаем фреймворк
    require_once($yii);

    // Запускаем приложение
    Yii::createWebApplication($config)->runEnd('backend');
    Теперь я могу обращаться к самому сайту по адресу - и к админке
    Но я хочу убрать пакостное admin.php на просто /admin, для этого опять же в корень ложим .htaccess со следующим кодом -
    Код:
    AddDefaultCharset UTF-8
    Options +FollowSymLinks
    IndexIgnore */*
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . index.php
    RewriteRule ^admin admin.php
    
    Тепреь остались последние штрихи подготовки нашего приложения, а именно переопределения базовых контроллеров и модели -
    Переопределяем класс CController для более гибкой разработки и уменьшения строк кода в дальнейшем -

    /protected/components/BaseControlle.php
    PHP:
    <?php
    class BaseController extends CController
    {
        public 
    $model// Здесь будим хранить имя модели для гибкости
        
    public function __construct($id$module null){
            
    parent::__construct($id$module);
        }

        
    // флеш-нотис пользователю
        
    public function setNotice($message){
            return 
    Yii::app()->user->setFlash('notice''<div class="notice">'.$message.'</div>');
        }
        
    // флеш-ошибка пользователю
        
    public function setError($message){
            return 
    Yii::app()->user->setFlash('error''<div class="error">'.$message.'</div>');
        }
    }
    /protected/components/FrontendController .php
    PHP:
    <?php
    class FrontendController extends BaseController
    {
    /* имя файла лейаута "в следующем уроке объясню что такое лейаут" */
        
    public $layout 'main';
        public 
    $breadcrumbs = array();  // Хлебные крошки для сайта

    // И естественно задумаемся о SEO сразу =)
        
    public $metaKeywords '';
        public 
    $metaDescription '';

    }
    /protected/components/BackendController .php
    PHP:
    <?php
    class BackendController extends BaseController
    {
        public 
    $layout 'backend';
        public function 
    __construct($id$module null){
            
    parent::__construct($id$module);
        }
    }
    Это были переопределенные контроллеры, я их максимально минимизировал сейчас, но в дальнейшем мы будим их дополнять для своего удобства!
    Ну и последний штрих, это переопределение базового класса модели -


    /protected/models/CRUD .php
    PHP:
    <?php
    class CRUD extends CActiveRecord
    {
    // Здесь будим хранить количество элементов для постраничного вывода
        
    public $per_page 10;
    // имя таблицы
        
    protected $table;
        public static function 
    model($className=__CLASS__){
            return 
    parent::model($className);
        }
        public function 
    tableName(){
            return 
    $this->table;
        }
    }
    Данную модель мы тоже будим расширять в будущем!

    Ну вот наверно на сегодня хватит :) скоро будет второй урок в котором вы уже увидите всю мощь yii ну и первые страницы своего сайта

    До встречи, надеюсь вам понравилось и принесло пользу прочтение этого поста.
    alpha13 и Toby нравится это.
  2. Igogo Member

    ПОПРАВКА - .htaccess нормально работает у меня под убунтой, он под фрибсд и виндой не хочет корректно работать, если у кого проблемы с ним то заменяем его на -
    Код:
    AddDefaultCharset UTF-8
    Options +FollowSymLinks
    IndexIgnore */*
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^admin admin.php
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . index.php
  3. vit New Member

    params.php ??? у меня такого нет файла, что там должно быть?
  4. Igogo Member

    там должен быть массив с твоими параметрами! которые ты сам задаешь для себя!
    самый простой вариант -
    PHP:
    return array();
    --- добавлено: Aug 19, 2011 6:56 AM ---
    Да и добраться до этих параметров можно в любом контроллере, виде или модели можно так -
    PHP:
    Yii::app()->params['myParam']
  5. zablik New Member

    Только начал читать, спасибо за статью, уверен, что она хорошая. :)
    Только пожалуйста, если будет время исправьте слова "будИм" на те же, но через "Е". Ну как пенопластом по стеклу, честное слово.
  6. alpha13 New Member

    А когда будет следующий урок ???!!!!! ато для таких чайников Как я Это очень важно :)

Поделиться этой страницей