Yii: рецепты №1

Пакетирование js и css-файлов и использование зависимостей между этими пакетами.

Есть замечательный инструмент для рисования графиков на js — highcharts, но он использует фреймворк jQuery и сам jQuery не подключает. Соответственно, мы создаём наш пакет, где указываем js и css файлы из highcharts и прописываем зависимость от jQuery.

'clientScript'=>array(
  'packages' => array(
       'highcharts' => array(
            'baseUrl' => '/js/highcharts/',
            'js'=>array(YII_DEBUG ? 'highcharts.src.js' : 'highcharts.js'),
            'css' => array('highcharts.css'),
            'depends'=>array('jquery'),
        ),
    )
)

Теперь вместо

Yii::app()->clientScript
->registerPackage('jquery')
->registerScriptFile('/js/highcharts/highcharts.js')
->registerCssFile('/js/highcharts/highcharts.css');

Пишем

Yii::app()->clientScript
->registerPackage('highcharts');

YII_DEBUG

Эта константа позволяет включать режим дебага и она же доставляет немного неудобства. Локально нужно устанавливать констатну YII_DEBUG в true, но не комитить это изменение нельзя. Т.е. перед комитом нужно выставлять значение в false. Мы же программисты, народ ленивый, поэтому тем меньше пальцедвижений, тем лучше.

  • Можно воспользовать changelist в PhpStorm
  • Можно не добавлять файл в коммит

Но эти варианты не подходят, когда используется консоль, нельзя будет использовать команду git add .

Решение очевидное: использовать директивы auto_prepend_file При запуске любого php-файла, будет предварительно выполнятся наш файлик с установленной константой.

Теперь пишем в файл с настройками сайта php-fpm /etc/php5/fpm/pool.d/super-site-on-yii.conf

[php]
php_admin_value[auto_prepend_file] = /var/www/yii_debug.php

Создаём файл /var/www/yii_debug.php

<?php
// Если включен профайлер xdebug
//define('YII_DEBUG', empty($_GET['XDEBUG_PROFILE']));
define('YII_DEBUG', true);

Автодополнение в PhpStorm

При подключении стороннего компонента или расширении стандартного хотелось бы «научить» IDE подсказывать

'components'=>array(
  'user'=>array(
    'class' => 'WebUser',
  ),
  'myext'=>array(
    'class' => 'MyExt',
  ),
)

Создаём файлик в любом месте, из которого он не сможет подключится автолоадерем. Например, в protected/autocomplete.php

<?php
/**
 * @property WebUser $user
 * @property MyExt $myext
 */
class CApplication {}

Теперь по вводу Yii::app()->myext PhpStorm будет посказывать методы из класса MyExt.

Ещё можно заставить PhpStorm подсказывать в файлах представления (views)

Обычно хватает стандартного набора ($this и $form), но в каждой конкретной view может быть свой набор переменных

/** @var $this Controller */
/** @var $form CActiveForm */
/** @var $model User */

Последний метод можно полу-автоматизировать через шаблоны gii. Это остаётся в качестве самостоятельной работы читателя.