Статьи

Отличная статья по настройке таблицы

ActiveRecords запросы в Yii2

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;
  }
 }
//...
}

 

Оставлять комментарии могут только зарегистрированные пользователи

Комментарии  

Елена76
# Елена76 14.08.2014 18:32
немного программирую на Yii, было полезно прочесть
Сапр
# Сапр 02.09.2014 15:52
Еще удобно сниппеты хранить в Gist