Статьи
Отличная статья по настройке таблицы
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; } } //... } |
Комментарии