Архив метки: Yii

Yii. Конфликт имени модуля и контроллера.

Есть Yii приложение, у которого в настройках прописан модуль ‘Page’:

'page' => array(
     'class'  => 'application.modules.page.PageModule',
     'layout' => 'application.views.layouts.column2'
),

Так же есть простой контроллер ‘PageController’, расположенный в каталоге приложения ‘controllers’.

При обращении по url типа: http://localhost/page/about — возникает ошибка, так как Yii пытается вызвать контроллер ‘about’ из модуля ‘Page’, а его нет.

При обращении по url http://localhost/Page/about (Page вместо page) — Yii вызывает контроллер Page и его экшн ‘about’ что мне и требовалось =).

Валидируем UTF-ые строки в Yii

Начиная с версии 1.1.1 CStringValidator может принимать параметр «encoding». Выдержка из API:

the encoding of the string value to be validated (e.g. ‘UTF-8’). Setting this property requires you to enable mbstring PHP extension. The value of this property will be used as the 2nd parameter of the mb_strlen() function. Defaults to false, which means the strlen() function will be used for calculating the length of the string.

Используйте его при валидации текстовых строк на русском языке.

Пример (часть метода rules модели):

array(‘question, answer’, ‘length’, ‘max’=>255,’encoding’ => ‘utf-8’),

И не забудьте прочитать статью о том, как включить поддержку Юникод в Yii

Доступ к настройкам модуля в Yii

При разработке на Yii довольно часто приходится иметь дело с модулями.
Каждый модуль может иметь свои настройки (переменные уровня модуля). Для получения доступа к такого рода настройкам из самого модуля я использую конструкцию типа вот такой:

Yii::app()->controller->module->propertyName;

Однако если настройки модуля необходимо получить из другого модуля этого же приложения  или из самого приложения — такой прием не подойдет, так как переменная module может быть не определена, если текущий контроллер  не принадлежит модулю.
Для этого применяется конструкция вида:

Yii::app()->getModule(‘user’)->propertyName;

Здесь ‘user’ — название модуля, замените его на название своего модуля.
ВНИМАНИЕ!!! 
Название модуля пишется только в нижнем регистре, иначе не работает!

Второй вариант более универсальный и переносимый — стараюсь использовать только его.

Yii как я форматирую код

При разработке на Yii очень часто приходится иметь дело с формами и с моделями.
Формы (потомки CFormModel)  и модели (CActiveRecord), как правило, принимают параметры и что-то с ними делают =). При этом часто можно видеть записи вида:

$model = new Model();
$model->attr_1 = 'attr_1';
$model->attr_2 = 'attr_2';
...................................

Такая «кишка» присваиваний выглядит в коде не очень здорово.

Вместо этого можно и нужно использовать метод setAttributes.
Если еще и отформатировать код как-нибудь вот так:

$registration = new Registration();
$registration->setAttributes(array(
     'email'    =>  $email,
     'nickName' => $login,
     'password' => $pass,
));

if($registration->save()){
..................................
}

Жизнь становится прекраснее!

Аналогично форматировать  можно и код  выборки данных, используя ORM Yii:

Question::model()->answered()->with('user.profile','fromUser')->findAll(array(
   'condition' => 't.userId = :userId',
   'limit'          => self::STREAM_PER_PAGE,
   'offset'        => $already,
   'params'      => array('userId' => $user),
   'order'         => 't.creationDate DESC'
));

Пусть Ваш код будет приятным для чтения и просмотра!