Старт сессии в Yii Framework и cookieParams

В Yii для работы с сессиями используется класс CHttpSession, который обычно подключается как компонент приложения:

'components' => array(
    'session' => array(
        'cookieMode' => 'allow',
        'cookieParams' => array(
             'domain' => 'site.ru',
             'httponly' => true,
        ),
    ),
),

Для установки параметров кук по умолчанию используется функция session_set_cookie_params, параметры которой передаются через cookieParams.
В документации к функции указано, что она обязательно должна вызываться до старта сессии.

На практике бывают случаи, когда необходимо проиницилизировать сессию параметрами из базы данных. В таком случае задать настройки напрямую через конфиг не получится. Полностью


  • 05.05.2012
  • Yii

Yii Web Application Skeleton

Работа с Yii Framework обычно начинается с генерации каркаса приложения, которая описана в официальном гайде. Для новичков структура проекта по умолчанию выглядит достаточно просто. Но за два года работы я столкнулся с определенными неудобствами: весь проект находится в webroot, один конфиг для всего и т.п.

Автор фреймворка предлагает более сложную структуру директорий, которая имеет свои преимущества: вынесение общих частей кода, деление на frontend и backend, разные конфиги и прочее. На мой взгляд для «средних» проектов данная структура выглядит избыточной. Полностью


  • 25.02.2012
  • Yii

Ивенты ноября — jsTalks и Mageconf

В ноябре было два интересных события — jstalks и mageconf.

jsTalks прошло 26 ноября в Днепропетровске в клубе Рио. Организатор — фирма Wix, которые делаю систему для сайтоконструктора (напоминает ucoz). Вместо стандартного для таких мероприятий «актового зала» выбрали неплохой клубешник в центре. На входе давали фирмовые баффы, правда качества не очень ;)

Доклады были разного уровня, узнал для себя новое о CoffeScript и KnockoutJS. Сам же рассказывал о клиентской javascript шаблонизации.
По отзывам всем понравилось, особо не скучали, всегда можно было поговорить, и сама обстановка располагала.

@sergebezborodov и @timlar_ua

MageConf прошла 3 декабря в Киеве, в Экспоплазе. На входе фирмовые пакетики, ручки, блокноты — как обычно, всякая дребедень. Проходило в две секции php и magento.

Первый доклад был общим, растянулся на час, но смысл можно выразить словами «magento, классно, x.com, развитие, рост». Крутили промо ролик, как парниша накодил за пару часов шоп в консольном виме на маженте и заработал кучу бабла, улыбнуло.

Сама Magento интересовала не  сильно, пошел на секцию php, доклад был о сервис-ориентированной архитектуре, рассказчик очень волновался, что он хотел донести осталось непонятно. Дальше шли «Взаимодействие с асинхронными системами на php» и «О преднамеренном» программировании», на последнем Виталий Коротун безперерывно тараторил и шутил с залом, в итоге конечная мысль - серебряной пули нет, программирование говно.

Приятный момент, что за лучший вопрос докладчику давали лицензию php storm.

Потом пошли на обед, по заверению организаторов в районе есть масса кафешек, которые в большей части были закрыты (китайскую еду за еду не считаю). В результате дошли до нивок и решили что конференция не стоит гастрита — поехали в центр пообедать и гулять. В итоге, судя по твитам, народу больше нравилось троллить чем слушать.

Те кто были «в теме» после конфы собрались на #YiiBeerAfterParty где отлично провели время, в принципе ради этого и поехали в Киев.

#YiiBeerAfterParty


Преобразование даты формата MySql в JavaScript Date

Часто при разработке фронтента приходится работать с датами на Javascript. В js объекте Date имеется статический метод parse, который может разобрать практически все, но кроме даты формата MySql ’2011-10-21 17:08:00′.

На stackoverflow наткнулся на простое и элегантное решение.

// разбиваем дату на части [ Y, M, D, h, m, s ]
var t = "2010-06-09 13:12:01".split(/[- :]/);
 
// Передаем каждый элемент в конструктор, если время не указано ставим нули
var d = new Date(t[0], t[1]-1, t[2], t[3] || 0, t[4] || 0, t[5] || 0);
 
alert(d);
// -> Wed Jun 09 2010 13:12:01 GMT+0100 (GMT Daylight Time)

Для большего удобства можно добавить новый метод к классу Date:

Date.createFromMysql = function(mysql_string) {
   if(typeof mysql_string === 'string') {
      var t = mysql_string.split(/[- :]/);
      return new Date(t[0], t[1] - 1, t[2], t[3] || 0, t[4] || 0, t[5] || 0);          
   }
   return null;   
}

Автоматическое подключение js файлов в Yii Framework

Если посмотреть js файлы многих сайтов, то, в большинстве случаев, можно увидеть файлы типа scripts.js, main.js, functions.js и т.д. в которых тысячи строк самых разных скриптов, и половина которых скорее всего не нужна на этой странице. Другой крайностью является десятка два подключаемых файлов, которые создают лишнюю нагрузку на сервер.

При разработке приложений на Yii я выработал следующую методику организации js файлов.
Полностью


  • 27.09.2011
  • Yii

Расширяем Active Record в проекте на Yii Framework

Yii Framework предоставляет достаточно функциональный AR для взаимодействия с базой, однако очень часто не хватает некоторой «магиии» для более удобной работы.

В своих проектах я добавил несколько полезных функций в класс, скачать который можно ниже.

Функционал:

  • автоматическое обновление полей даты создания и последнего обновления записи в таблице
  • удобные функции для начала и завершения транзакции
  • трансляция сообщений об ошибке в контроллер
  • автоматическое создание slug записи и поля title

Код на GitHub
Установка:
Положить файл в components или любую другую директорию по желанию. Унаследовать свои модели от класса ActiveRecord.


  • 17.07.2011
  • Yii

Техническая сторона проекта Все бланки

 

 

 

 

 

 

 

Как и любая хорошая идея, идея создания сайта пришла после того, как я пытался найти нужный бланк для сдачи отчетности для ЧП. Стоит сказать, что украинские сборники бланков напоминают сайты конца девятосных годов, где искать приходится браузерным поиском по Ctrl+F. После недолгих раздумий, решил сделать сайт с простым названием «Все бланки» Полностью


Тестирование Javascript кода с помощью QUnit

Еще пару лет назад javascript использовали для различного рода «украшательств», то сейчас на js может быть написано больше половины бизнес логики приложения. С ростом объемов кода встает вопрос о его качестве и соответственно unit тестировании.
Именно о теме тестирования js кода написана хорошая статья «Automating JavaScript Testing with QUnit» от известного разработчика jQuery плагинов — Bassistance (Jörn)


Днипроавиа или украинский сервис

В конце апреля приобрел билет на рейс Бельбек — Борисполь, который осуществляется авиакомпанией Днипроавиа. Взял обычный электронный билет. Сегодня утром приехал в Бельбек, какой то бородатый мужик на входе сообщает, что все рейсы отменены. Сначала подумал что шутит, но объявление приклеенное на дверь развеяло все сомнения. Мой рейс в Дюссельдорф из Борисполя на пол четвертого дня.

Звоню в коллцентр, с вопросом что за хрень? На что примерный ответ «технические проблемы бла бла бла». Решено ехать в Симферополь,  ближайший рейс на который есть надежда попасть — авиакомании Мау в 7 утра, регистрация заканчивается в 6:30. Из Бельбека выехали в 5:40.  Стоит сказать что нестись по 200 км/час по нашим трассам не очень приятно, радует что было утро и пустая дорога. В Симферополе побежал в кассу, была Кийавиа — быстро сделали билет и придержали регистрацию, за что им и спасибо.

Из беседы с менеджером выяснилось, что рейсы отменили по техническим причинам и физически уведомить каждого пассажира им не удалось.  Поиск по гуглу не нашел никаких упоминаний на их сайте информации об отмене, есть пара ссылок по которым говорится об отмене рейсов из-за финансовых проблем Днипроавии, где рейсы из Бельбека не значатся.

Для полноты картины беседа с менеджером

 


isset и array_key_exists — в чем различие?

array key exists

Многие пхпшники недоумевают зачем сделана функция array_key_exists, когда есть обычный isset.
Проверочный код:

$testArray = array(1 =>; 'Первый', 'second' => 'Второй');
var_dump(isset($testArray[1]));            // =>; bool(true)
var_dump(array_key_exists(1, $testArray)); // => bool(true)

Если в массив попадает значение null, то тут сразу возникают отличия в их работе

$testArray = array(1 => 'Первый', 'second' => 'Второй', 3 => null);
 
var_dump(isset($testArray[3]));              // => bool(false)
var_dump(array_key_exists(3, $testArray));   // => bool(true)

В проверках следует применять array_key_exists если в массивах возможно значение null. Поведение isset в данном случае вполне оправдано, исходя из документации: «Determine if a variable is set and is not NULL«.


  • 10.03.2011
  • php