Задача такая: вывести данные через компонент CGridView в YII, сгруппированные по определённому полю, а также применение условий по агрегированным данным.
Возьмём простую таблицу:
1
date | clicks
Нам нужно получить сгруппированные данные по каждому часу.
По сути нужно применить следующий запрос
123
SELECT*FROMtableGROUPBYLEFT(date,13);
Возникают следующие трудности в реализации через Yii:
Yii не может посчитать общее количество, а соответственно будет неправильно создавать пагинатор. Yii просто обнуляет поля group by и having при подсчёте общего количества. Да ещё count(*) тут не сработает, нужно просто. посчитать количество строк, которое вернул запрос с группировкой
Также нам не подходит использование where, чтобы искать по группированным данным. Тут нужно использовать having by.
Сортировка. Yii автоматически подставляет поле без агрегирующей функции. А если использовать отношения, то ещё и подставит алиас главной таблицы (t.clicks).
Соответственно, мы руками высчитываем общее количество и устанавливаем найденное значение в атрибут totalItemCount компонента CActiveDataProvider
publicfunctionsearch(){$criteria=newCDbCriteria;$criteria->compare('date',$this->date,true);if($this->clicks){// Скопипастил из исходников yiiif(preg_match('/^(?:\s*(<>|<=|>=|<|>|=))(.*)$/',$this->clicks,$matches)){$clicks=$matches[2];$op=$matches[1];}else{$clicks=$this->clicks;$op='=';}// Проставляем having by$criteria->having='SUM(clicks) '.$op.' '.Yii::app()->db->quoteValue($clicks);}// Выбираем дату без минут и секунд И сумму кликов за определённый час$criteria->select='LEFT(date, 13) AS date, SUM(clicks) AS clicks';// Применяем группировку по часам$criteria->group='LEFT(date, 13)';// Клонируем объект критерии, чтобы посчитать общее количество записей$countCriteria=clone$criteria;$countCriteria->select='1';$sum=count(static::model()->findAll($countCriteria));$pages=newCPagination($sum);$pages->pageSize=50;$pages->applyLimit($criteria);returnnewCActiveDataProvider(get_class($this),array('totalItemCount'=>$sum,'criteria'=>$criteria,'pagination'=>$pages,'sort'=>array('attributes'=>array(// Тут устанавливаем свою сортировку по нужному полю'clicks'=>array('asc'=>'SUM(clicks) ASC','desc'=>'SUM(clicks) DESC',)),'defaultOrder'=>'date DESC',),));}
В интернете довольно много можно выложено конфигов nginx под различные веб-приложения. Но в большинстве из них используются if совместно с rewrite, что достойно всяческого порицания по словам автора nginx Игоря Сысоева. Выложу используемые мной конфиги для различных систем (redmine, chive)
Сохраняем вывод в какой-нибудь файл (/home/user/svn-authors.txt) и проставляем у всех авторов email. Иногда первый коммит совершается из консоли и он получается от неизвестного пользователя, поэтому стоит добавить строку об этом неизвестном пользователе, иначе экспорт в git не сработает.
1
(no author) = Name Surname < email >
И вот собственно скрипт. Он вытягивает репозиторий из svn (используя файл соотношения авторов с email), проставляет тэги и пушит изменения на удалённый git-репозитарий. В данном случае вытягивается исходники yii и пушаться на github.
Услышав шумиху про некую систему интеграционного тестирования hudson, который переименовали в jenkins, я захотел узнать что это и как это можно использовать. Для чего собственно он нужен? В кратце: он вытягивает последнюю версию из git/svn-репозитория и выполняет определённые действия (тестирует, выкладывает на другой сервер, делает отчёты). Всё это происходит автоматически: можно задать время, когда будет выполнятся задания. Можно почитать про пример использования jenkins.
Задача такая: Выполнение unit тестов для yii с отображением покрытия кода
Все действия проводятся на сервере debian squeeze от root.
Чтобы наши конфиги подхватились идём в настройки jenkins и кликаем по ссылке “Пересчитать настройки из файла”. В настройках проекта yii указываем git репозиторий до нашего проекта. Можно даже указать локальный путь, но должны быть права для пользователя jenkins. Добавляем файл теста в protected/unit/
Теперь запускаем сборку. Вот как примерно это выглядит.
Уведомления по email
В конфиге jenkins указываем параметры для подключения к SMTP. Если настроен sendmail или exim, то нужно указать только от кого отсылать письмо. И теперь в настройках проекта yii указываем кому слать письмо об упавших тестах.
Авто-сборка
Можно настроить, чтобы сборки проводились автоматически. Для этого в настройках проекта yii ставим галку у Собирать периодически и в появившемся тестовом поле указываем время запуска в формате cron. Или сделать hook в git:
P.S. Я показал только малую часть того, что может делать jenkins. Он может создавать документацию по коду, проверять на наличие дублирования в коде, проверять стиль кодирования и многое, многое другое. Примеры более сложных конфигов config.xml и build.xml
Есть ситуация: проводятся какие-то технические работы на сайте и нужно сайт правильно закрыть. Это нужно чтобы поисковики знали, что сайт не доступен, а не добавляли страницы в индекс или помечали страницы как удалённые.
Строка error_page 404 403 =503 /503.html означает, что перенаправляем все запросы с ошибками 404 и 403 на файл 503.html, попутно меняя код ответа на 503. И при запросе файла 503.html отдаём заголовок Retry-After, чтобы поисковики знали, когда можно опять запросить страницу. Вместо даты можно указать количество секунд перед следующей попыткой. В файле 503.html можно написать что-нибудь осмысленное для пользователей и даже встроить флэш-игру, чтобы не было скучно.
Нашёл как исправить баг с глючащим wifi в моём нетбуке Asus EeePC 1000H. Карточка RaLink 2790 (RT2860). Нетбук подключался к wifi, получал ip-адрес по DHCP, но ничего не работало. Потом разрывалось соединение и заново подключалось с тем же печальным эффектом. Решение подсмотрел тут. Комманда lspci -vv выдала
Поведения в yii позволяют применять некоторые методы к уже существующему объекту из другого класса. Для чего могут понадобиться поведения? Рассмотрим “жизненный” пример. Нужно получить какие-то данные по залогиненному пользователю. Можно, конечно, использовать что-то вроде:
1
User::model()->findByPk(Yii::app()->user->id);
А можно использовать поведения и добавить метод в Yii::app()–>user protected/components/WebUser.php