Здесь собраны полезные заметки и ссылки на интересные статьи и темы форумов, которые могут пригодиться и сэкономить достаточно много времени при разработке на Yii Framework. Подробности под катом.

Создать приложение YII

yiic webapp /home/webmaster/public_html
yiic.bat webapp Z:\home\mysite\www

Для корректной работы скрипта yiic.bat  в Windows на Denwer следует либо исправить скрипт (прописать полный путь к php, либо добавить каталог с php в системную переменную PATH).

if "%PHP_COMMAND%" == "" set PHP_COMMAND=z:\usr\local\php5\php.exe

Запускать скрипт следует из каталога framework

Приложение в YII можно создать без консоли. Достаточно скопировать framework/cli/views/webapp/protected/.

Наиболее полный конфиг для Yii

<?php
 
// uncomment the following to define a path alias
// Yii::setPathOfAlias('local','path/to/local-folder');
 
// This is the main Web application configuration. Any writable
// CWebApplication properties can be configured here.
return array(
 
    // the base path to the protected folder
    // access it using Yii::app()->basePath
    'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
 
    // name of application
    // access it using Yii::app()->name
    'name'=>'My website',
 
    //aliases to specify shortcuts for paths in your app or
      // perhaps to external resources for your app
      'aliases'=>array(
            'myExternalFramework'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..'
            .DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'myexternalframework'
        ),
 
        //building on above for a controller in the external 
        //framework you can use the controller map to map the 
        //controller path
        'controllerMap'=>array('myController'=>'myExternalFramework.controllers.MyController'),
 
        // default controller that will be executed when running the application
    'defaultController'=>'site', 
 
    // user language (for Locale)
    'language'=>'es',
 
        //language for messages and views
        'sourceLanguage'=>'es',
 
    // charset to use
    'charset'=>'utf-8',
 
    // preloading application components
    'preload'=>array('log'),
 
    // autoloading classes
    'import'=>array(
        'application.models.*',
        'application.components.*',
    ),
 
    // application-level parameters that can be accessed
    // using Yii::app()->params['paramName']
    'params'=>array(
        'adminEmail'=>'info@example.com',
    ),
 
    // Note: you can also separate your configuration file into
    // more files, for example: db.php, params.php and so on.
    // You can do it like this example:
    // 'params'=>require(dirname(__FILE__).'/params.php'),
    // and inside the params.php you will return the array:
    // return array('adminEmail'=>'info@example.com');
 
    // configuration of application components
    'components'=>array(
 
        // assets, see http://www.yiiframework.com/doc/api/CAssetManager
        'assetManager'=>array(
            // change the path on disk
            'basePath'=>dirname(__FILE__).'/../../assets/',
            // change the url
            'baseUrl'=>'/web/assets/'
        ),
 
        // logging
        'log'=>array(
            // class of logger
            'class'=>'CLogRouter', 
            // where to store logs?
            'routes'=>array( 
                array(
                    // store on file, other options are available
                    'class'=>'CFileLogRoute', 
                    // what to store on file? error and warning, info and trace can be added here
                    'levels'=>'error, warning', 
                ),
            ),
        ),
 
        // user
        'user'=>array(
            // enable cookie-based authentication
            'allowAutoLogin'=>true,
            // set the url where user must be redirected if authentication needed
            // use null to force 403 HTTP error 
            'loginUrl'=>null,
            // set here the name of a class
            // that extends CWebUser and it is stored in
            // protected/components/<classname>
            // see: http://www.yiiframework.com/doc/cookbook/60/
            'class' => 'WebUser',
        ),
 
        // database
        'db'=>array(
            // using mysql
            'connectionString'=>'mysql:host=example.com;dbname=my_db',
            'username'=>'my_user',
            'password'=>'my_password',
            // set the charset of the connection
            'charset'=>'utf8',
            // using sqlite
            // 'connectionString'=>'sqlite:'.dirname(__FILE__).'/../data/blog.db',
            //'charset'=>'utf8',
            'schemaCachingDuration'=>'duration in seconds',
        ),
 
                // config for db message source here, see http://www.yiiframework.com/doc/api/CDbMessagesource
                'messages' => array(
                       'class' => 'CDbMessageSource',
                ),
 
        // caching
        'cache'=>array(
            'class'=>'A cache class, like: system.caching.CApcCache',
        ),
 
        // url 
        'urlManager'=>array(
            // the URL format. It must be either 'path' or 'get'.
            // path: index.php/controller/action/attribute/value
            // get: index.php?r=controller/action&attribute=value
            'urlFormat'=>'path',
            // show www.example.com/index.php/controller/action 
            // or just www.example.com/controller/action
            'showScriptName' => true,
            // rules to redirect a specific url to the controller you want
            // see: http://www.yiiframework.com/doc/guide/topics.url
            'rules'=>array(
                // www.example.com/home instead of www.example.com/site/index
                'home'=>'site/index',
                'post/<id:\d+>'=>'post/show',
            ),
        ),
                // you can use the scriptMap to configure where your scripts come from. 
                //If you use the split configurations for development and production you can 
                // have different maps in each and then just load the file and it'll
                // load the appropriate file depending on the configuration your running.
                // for a production configuration you can have this
                'clientScript'=>array(
                      'scriptMap'=>array(
                          'register.js'=>'site.min.js',
                          'login.js'=>'site.min.js',
                      ),
                ),
                // for a development configuration you can have this
                'clientScript'=>array(
                      'scriptMap'=>array(
                          'register.js'=>'register.js',
                          'login.js'=>'login.js',
                      ),
                ),
    ),
);
?>

http://www.yiiframework.com/doc/api/1.1/CWebApplication — конфиг = массив параметров

Можно поставить http://www.yiiframework.com/extension/yii-debug-toolbar Там в настройках все подключенные компоненты описаны и все их настройки.

Создание блога на Yii

Хорошая книга от автора фреймворка. Можно скачать, а можно посмотреть её онлайн.

Кэширование схемы БД

Для кэширования схемы БД нужно добавить в конфиге в разделе db параметр schemaCachingDuration указывающий сколько секунд хранить кэш.

'db'=>array(
    //...
    'schemaCachingDuration'=>3600,
    //....
)

Хорошая статья на эту тему от Larry Ullman.

Контроллер по умолчанию site. Задать другой контроллер по умолчанию

Для этого в конфиге поправим

'defaultController'=>'default', // параметр в protected/config/main.php

Action по умолчанию index. Задать другой Action по умолчанию

Нужно задать переменную в контроллере

public $defaultAction = 'newindex'; // переменная в Controller

Если нужный Action отсутствует

То тогда может быть вызван метод missingAction

class SiteController extends CController
{
  public missingAction($actionID)
  {
    Yii::trace(' Action not found '.$actionID);
    $this->redirect('site/index'); // вариант с редиректом
    $this->run('index'); // вариант без редиректа
  }
}

Язык по умолчанию в Yii

Язык по умолчанию задается в protected.config.main (сообщения верификации вроде “cannot be blank”)

'sourceLanguage' => 'ru',
'language' => 'ru',

Тотальный перевод — http://yiiframework.ru/forum/viewtopic.php?f=3&t=1001

Свой адрес для страниц, требующих авторизации

если null — выдает 403 ошибку, а не перебрасывает на форму

'loginUrl'=>null, // 'site/login'

Динамическое изменение CUrlManager::rules

Довольно часто на форумах спрашивали, как добавить свои правила роутинга не из конфига, а, например, из БД или XML, лежащего в модуле. Теперь это можно сделать при помощи CUrlManager::addRules. Вызывать его необходимо до CWebApplication::processRequest. Всё, что будет добавлено позже будет проигнорировано. Одним из способов это сделать является использование событий. В данном случае CWebApplication::onBeginRequest.

Например, для подгрузки правил из модулей в main.php пишем:

'onBeginRequest'=>function($event){
  $route=Yii::app()->getRequest()->getPathInfo();
  $module=substr($route,0,strpos($route,'/'));
 
  if(Yii::app()->hasModule($module))
  {
    $module=Yii::app()->getModule($module);
    if(isset($module->urlRules))
    {
      $urlManager=Yii::app()->getUrlManager();
      $urlManager->addRules($module->urlRules);
    }
  }
  return true;
},

Структура Yii

/
    backend/
    common/
        components/
        config/
            params.php
            params-local.php *
        lib/
            Pear/
            yii/
            Zend/
        migrations/
        models/
            Comment.php
            Extension.php
            ...
    console/
        commands/
            SitemapCommand.php
            ...
        config/
            main.php
            main-local.php *
            params.php
            params-local.php *
        runtime/
        yiic.php *
    frontend/
        components/
        config/
            main.php
            main-local.php *
            params.php
            params-local.php *
        controllers/
            SiteController.php
            ...
        lib/
        models/ 
            ContactForm.php
            SearchForm.php      
        runtime/
        views/
            layouts/
            site/
        www/
            assets/
            css/
            js/
            index.php *
    yiic
    yiic.bat

View — глобальный/модуль/каталог:

— “//layouts/main” указывает на «protected/views/layouts/main.php» (если «protected» — это базовая директория приложения)

— “/layouts/main” указывает на «protected/modules/abc/views/layouts/main.php» (если «abc» — это текущий рабочий модуль. Если нет, то это тоже самое, что и “//layouts/main”)

— “main” указывает на view-файл, размещенный в директории представлений текущего контроллера или в директории текущего макета (layout).

В атрибутах CHtml (а также — форм) убираем преобразование спецсимволов

echo CHtml::activeCheckBox($advertisment, ‘anyProposed’, array(
    ‘onClick’ => “document.getElementById(’myText’).value=’123?”,
    ‘encode’ => FASLE,
));

Yii отладка — смотрим SQL

'log'=>array(
            'class'=>'CLogRouter',
            'routes'=>array(
                . . .
                array(
                    'class'=>'CWebLogRoute',
                    'levels'=>'error, warning, trace, profile, info',
                    'enabled'=>false,
                ),
                . . .
            ),
        ),

Тут видны все логи, ошибки, предупреждения и т.д.

Можно еще через профайлер:

'log'=>array(
            'class'=>'CLogRouter',
            'routes'=>array(
                . . .
                array(
                    'class'=>'CProfileLogRoute',
                    'levels'=>'profile',
                    'enabled'=>true,
                ),
                . . .
            ),
        ),
'db'=>array(
    ....
    'enableProfiling' => true,
),

События в YII

http://devkp.ru/post/sobyitiya-v-yii

http://dr0id.ru/post/90/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5+%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D0%B9+%D0%B2+Yii

http://yiiframework.ru/forum/viewtopic.php?f=3&t=4255#p26793

Расширения для YII

http://www.yiiframework.com/extensions/

http://yiiframework.ru/forum/viewtopic.php?f=4&t=963

http://code.google.com/p/yiiplayground/

RBAC в БД

http://www.yiiframework.com/doc/api/1.1/CDbAuthManager

http://yiiframework.ru/forum/viewtopic.php?f=3&t=4321#p26883

Привязка изображений к модели

http://www.yiiframework.com/extension/fileimagearbehavior

http://yiiframework.ru/forum/viewtopic.php?f=3&t=4342

http://yiiframework.ru/forum/viewtopic.php?f=3&t=1678&start=20#p10318

Grid

http://www.yiiframework.com/forum/index.php?/topic/24280-gridview-filtering-of-relational-data/

http://yiiframework.ru/forum/viewtopic.php?f=3&t=4726#p29551

Полезные поведения

http://yiiframework.ru/forum/viewtopic.php?f=9&t=2000 — slug (транслит заголовка)

Twig Renderer

http://yiiframework.ru/forum/viewtopic.php?f=4&t=3511#p21424— static twig (CHtml)

Полезные статьи и темы форумов

http://yiiframework.ru/forum/viewtopic.php?f=3&t=6237#p38536 — yii db where add in condition

http://yiiframework.ru/forum/viewtopic.php?f=3&t=6236&p=38576#p38576 — массив id=>value из query (db command)

http://yiiframework.ru/forum/viewtopic.php?f=8&t=1284&start=10#p7918 — куки/сессии/поддомены

http://www.yiiframework.com/wiki/152/cookie-management-in-yii/ — cookie

http://www.larryullman.com/2010/08/10/handling-related-models-in-yii-forms/ — Yii MAnY MANY save

Комментарии

comments powered by Disqus