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