Статьи
Отличная статья по настройке таблицы
Action по умолчанию в Yii контроллере
В самом коде контроллера добавляем поле
public $defaultAction = 'test';
Язык сообщений об ошибках в Yii
В файле config/main.php добавляем в массив
'language' => 'ru',
Почему gii возвращает 403
По умолчанию с gii обычно работают только на локальной машине. Когда вы разкомментировали эти строки
'gii'=>array(
'class'=>'system.gii.GiiModule',
'password'=>'12345',
// If removed, Gii defaults to localhost only. Edit carefully to taste.
'ipFilters' => array('127.0.0.1', '92.50.156.138'), // EDIT TO TASTE
),
надо добавить в массив
ipFilters
свой ip, узнать который можно к примеру тут
Как создать кнопку Отмена в форме редактирования в Yii
Gii генерирует CRUD форму с единственной кнопкой Создать/Сохранить когда этого не достаточно, то создать ссылку Отмена можно так
<?php echo CHtml::link('Отмена',array('admin')); ?>
Включить ЧПУ в Yii
В файле protected/config/main.php надо раскомментировать следующие строки
'urlManager'=>array( 'showScriptName'=>false, // чтобы избавиться от index.php в url 'urlFormat'=>'path', 'rules'=>array( '<controller:\w+>/<id:\d+>'=>'<controller>/view', '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>', '<controller:\w+>/<action:\w+>'=>'<controller>/<action>', ), ),
И добавить в корень сайта файл .htaccess с таким содержимым
AddDefaultCharset utf-8
AddCharset utf-8 *
<IfModule mod_charset.c>
CharsetSourceEnc utf-8
CharsetDefault utf-8
</IfModule>
php_value display_errors 1
RewriteEngine on
RewriteRule ^index.html$ index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php
Как сделать так, чтобы jQuery подключалась автоматически в Yii
Конечно можно подключить jquery старым дедовским, в шаблоне main.php прописав
<script src="/jquery.js"></script>
Но большинство виджетов Yii также используют jQuery, и подключают ее самостоятельно. Получится так, что у вас библиотека будет грузиться два раза. Чтобы этого не произошло где/либо/нибудь вставляем
<?php Yii::app()->clientScript->registerCoreScript('jquery'); ?>
Самое удобное и универсальное вставить в protected/components/Controller.php
public function init(){
parent::init();
if( !Yii::app()->request->isAjaxRequest ){
Yii::app()->clientScript->registerCoreScript('jquery');
}
}
Если это не Ajax запрос, то подключаем библиотеку везде
Как выполнить обычный SQL запрос с выборкой данных в Yii
$ranges = Yii::app()->db->createCommand('select
min(Price) as pricemin,max(Price) as pricemax,
min(Area) as areamin,max(Area) as areamax
from pfx_units'
)->queryRow();
print_r($ranges);
Доступен еще метод queryAll()
Как вывести свои кнопки в CGridView
Часто помимо стандартных кнопок Удалить/Обновить/Посмотреть, нужны еще и другие. Добавить их не проблема
<? $this->widget('CGridView', array(
'id'=>'requests-grid',
'dataProvider'=>$dataProvider,
'columns'=>array(
'id',
'name',
'create_time',
'update_time',
array(
'class'=>'CButtonColumn',
'template'=>'{add}{update}{delete}',
'buttons'=>array(
'add' => array(
'label'=>'Создание решения',
'imageUrl'=>Yii::app()->request->baseUrl.'/images/add.svg',
'url'=>'Yii::app()->createUrl("solutions/create", array("id"=>$data->id))',
),
'update' => array(
'url'=>'Yii::app()->createUrl("requests/update", array("id"=>$data->id))',
),
),
),
),
));
При этом поля в массиве column также можно заменить на кастомные
<? $this->widget('CGridView', array(
'id'=>'requests-grid',
'dataProvider'=>$dataProvider,
'columns'=>array(
'id',
'name',
'create_time',
array(
'header'=>'Редактировано',
'name'=>'update_time',
'value'=>'date("H:i d.m.Y",$data->update_time)',
),
array(
'class'=>'CButtonColumn',
'template'=>'{update}{delete}',
),
),
),
));
Как конвертировать массив в dataProvider
Иногда у нас есть просто выборка моделей в виде массива. Ее нельзя просто так вставить в CGridView. Для того чтобы это сделать, надо сперва конвертировать массив в dataProvider. Вот как это можно сделать
$model->users;// какой-то relations или просто массив моделей
$dataProvider = new CArrayDataProvider('Users'); // массив каких моделей использовать
$dataProvider->setData($model->users); //заполняем пустоту в душе
//дальше все как обычно
$this->widget('CGridView', array(
'id'=>'users-grid',
'dataProvider'=>$dataProvider,
//...
);
Поиск по дате в CDbCriteria
Обычно мы храним даты в формате UNIXTIME. Т.е., как целове число. Когда gii генерирует поисковую форму и модель, он тоже ищет просто число. Но люди не могут автоматом конвертировать число в дату и обратно. Поэтому в форме делаем ввод обычных дат, к примеру с помощью датапикера, а уже в модели конвертируем эту дату в UNIXTIME и ищем по ней.
public function search(){
$criteria=new CDbCriteria;
$criteria->compare('id',$this->id);
if ($this->create_time) {
$created = strtotime($this->create_time);
$criteria->addBetweenCondition('start',$created-60,$created+60,true);
}
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
));
}
По 60 секунд скидываем просто потому, что юзер скорее всего не будет вбивать секунды. Обычно нам интересна дата или время вплоть до минут.
Как проверить или изменить какие-либо данные в модели перед сохранением
class Books extends CActiveRecord{
//...
protected function beforeSave(){
if (parent::beforeSave()) {
if ($this->isNewRecord) {
$this->create_time = $this->update_time = time();
} else {
$this->update_time = time();
}
$this->user_id = Yii::app()->user->id;
$labels = $this->attributeLabels();
// при заполнении формы пользователь заполняет только
// дату в обычном формате dd.mm.YYYY
if (empty($this->create_time) or !preg_match('#([0-9]+)\.([0-9]{2}).([0-9]{4})#',$this->create_time, $list)) {
$this->addError('start1', 'Не верно заполнено поле '.$labels['create_time']);
return false;
} else {
$this->create_time= mktime(0,0,0,intval($list[2]),intval($list[1]),intval($list[3]));
}
return true;
} else {
return false;
}
}
//...
}


Комментарии