Сайт онлайн бронирования гостиниц России

Собираем здесь завершённые проекты, использующие Yii. Один проект — одна тема.
Ответить
michael_v
Сообщения: 5
Зарегистрирован: 2010.05.04, 17:06

Сайт онлайн бронирования гостиниц России

Сообщение michael_v » 2010.05.13, 16:18

http://www.travelline.ru - Онлайн бронирование номеров гостиниц и отелей России.
Весь фронтенд написан на php с использованием yii.

Werewolf
Сообщения: 98
Зарегистрирован: 2010.02.27, 14:37
Контактная информация:

Re: Сайт онлайн бронирования гостиниц России

Сообщение Werewolf » 2010.05.13, 17:37

Что применяете DAO? ActiveRecord?

Аватара пользователя
samdark
Администратор
Сообщения: 9251
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Сайт онлайн бронирования гостиниц России

Сообщение samdark » 2010.05.13, 17:48

Очень приятно сделано. Интересно будет узнать об особенностях реализации. Что было трудным, в какие ограничения Yii упёрлись и т.д.

michael_v
Сообщения: 5
Зарегистрирован: 2010.05.04, 17:06

Re: Сайт онлайн бронирования гостиниц России

Сообщение michael_v » 2010.05.13, 20:02

Первоначально все было написано на ASP.NET. Потом было принято волевое решение переписать весь фронтенд на PHP, в качестве фреймворка бы выбран yii, тогда он был еще только версии 1.0.6. Сейчас обновились до 1.1.2. Переписали все кроме админки - она пока на ASP.NET и небольшая ее часть на yii.

Вся бизнес-логика написана на .NET, фронтенд общается с ядром через локальные сервисы. ActiveRecord используется только в переписанной части админки.
Что было трудным, в какие ограничения Yii упёрлись и т.д.
Сложно сказать, такие ситуации периодически возникали особенно в начале, но решались без особых проблем, намного больше положительных впечатлений от Yii, чем отрицательных.

Некоторые компоненты yii были переопределены или расширены существующие.

Так, например переписали загрузку конфигурационных файлов - теперь они хранятся в YAML разделены на логические части (по файлам), модули внутри себя имеют также папку config с файлами конфигурации (напимер url rules для модуля определяются прямо в нем), имеется поддержка окружений (специфичные настройки для живого сервера, тестового, для каждого разработчика и пр.). Все это собирается один раз и кешируется.

Еще был расширен класс СClientScript, поддерживается маппинг урлов ресурсов (на поддомены, версионность в урлах - сейчас это пока не используется), склейка ресурсов, минификация, подключение jquery с Google CDN.

Используем расширенную версию Smarty, в планах переключиться на Smarty 3.

Возможно что-то из этого уже есть в yii сейчас и был придуман велосипед, но я начинал с версии 1.0.6 и мне этого не хватало.

Кстати сказать, документация к yii очень хорошая, но сложно от версии к версии следить за всеми изменениями (я про мелкие изменения и улучшения в API), в результате натыкаюсь на них случайно.

Sam Dark, буквально сегодня решили расширить класс CActiveRecord своим, добавив в него такую вещь как маппинг AR на конкретную таблицу базы.
Объясню, что имеется в виду. Сейчас имя таблицы AR возвращается в методе CActiveRecord::tableName по умолчанию это имя класса. В нашей системе для каждого модуля есть своя база, и в некоторых местах они пересекаются и выборка может выполняться из нескольких баз сразу, чтобы это работало мы возвращаем не только имя таблицы но и имя базы (например tladmin.user).
Это все работает отлично пока на сервере работает одна копия сайта, но в нашем случае на одном сервере может быть несколько окружений (тестовая и демо версия сайта), соотвественно базы у них должны быть тоже разные, и тут мы видим два варианта: либо использовать отдельный экземпляр СУБД на отдельном порту, либо добавлять префикс к именам баз.
Мы выбрали второе. У нас уже переопределен tableName() в каждой модели все что осталось это дописать префикс к имени базы (брать его из конфига окружения), но этот вариант не очень нравится в виду отсутствия гибкости.
Теперь чтобы это все было более наглядно решили, что маппинг имен таблиц будет храниться в конфиге в виде

Код: Выделить всё

array(
  'UserModel' => 'tladmin.user',
  'AgentModel' => 'tlagent.agent',
  ...
)
 
и метод нашего базового ActiveRecord::tableName будет возвращать (изобразил упрощенно):

Код: Выделить всё

return self::$map[get_class($this)];
 
все что остается - это определить мап и унаследовать все наши модели не от CActiveRecord, а от нашего расширенного потомка.

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

Аватара пользователя
samdark
Администратор
Сообщения: 9251
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Сайт онлайн бронирования гостиниц России

Сообщение samdark » 2010.05.13, 20:31

Спасибо за то, что поделились довольно интересными решениями и идеями. Есть ещё вопросы и некоторые комментарии.

Почему решили уйти от ASP.NET?
фронтенд общается с ядром через локальные сервисы
SOAP?
Так, например переписали загрузку конфигурационных файлов - теперь они хранятся в YAML разделены на логические части (по файлам)
YAML, конечно, дело вкуса, но логическое разделение можно довольно легко делать в стандартных конфигах:

Код: Выделить всё

'urlManager'=>array(
  'urlFormat'=>'path',
    'rules'=> require(dirname(__FILE__).'/routes.php'),
    'showScriptName' => false,
),
 
модули внутри себя имеют также папку config с файлами конфигурации
Вот это довольно интересно. Особенно часть с rules т.к. CUrlManager отрабатывает до инициализации очень многих частей Yii.
Все это собирается один раз и кешируется.
Что используется для сборки?
имеется поддержка окружений
Опять же, легко делается в стандартном Yii.
Еще был расширен класс СClientScript, поддерживается маппинг урлов ресурсов (на поддомены, версионность в урлах - сейчас это пока не используется), склейка ресурсов, минификация, подключение jquery с Google CDN.
Подключение jquery с Google CDN вроде было ещё в 1.0(в самом низу).
Версионность в URL вроде тоже была всегда (папки в assets создаются с уникальными именами и регенирируются при изменении ресурсов).
Вот склейка ресурсов и минификация — это очень полезные вещи. Сейчас есть несколько расширений, которые это могут. Пару последних я не проверял, но те, что были на момент 1.0 работали, мягко говоря, не очень.
Используем расширенную версию Smarty, в планах переключиться на Smarty 3.
Случайно не через расширение из YiiExt?
Кстати сказать, документация к yii очень хорошая, но сложно от версии к версии следить за всеми изменениями (я про мелкие изменения и улучшения в API), в результате натыкаюсь на них случайно.
Все важные изменения с каждым релизом (и каждым коммитом) документируются: http://code.google.com/p/yii/source/bro ... /CHANGELOG
Было бы здорово если бы возможность определения такого мапа была бы уже в ядре yii. Хотя фича возможно не очень нужная для других решений и является специфичной только для нашего.
Штука, конечно, полезная, но для очень небольшого числа проектов. Не думаю, что стоит включать её в ядро.

snn
Сообщения: 7
Зарегистрирован: 2009.12.22, 21:41

Re: Сайт онлайн бронирования гостиниц России

Сообщение snn » 2010.05.13, 20:41

легкий offtop: а базу отелей сами набивали, договаривались с отелями или использовали один из знаменитых ресурсов через xml_rpc (не помню название)

michael_v
Сообщения: 5
Зарегистрирован: 2010.05.04, 17:06

Re: Сайт онлайн бронирования гостиниц России

Сообщение michael_v » 2010.05.13, 21:03

Почему решили уйти от ASP.NET?
Потому что PHP более динамичен и проще в веб-разработке чем ASP.NET (мнение нашей команды :) )
SOAP?
Нет используются свои сервисы (с кешированием, версионностью и пр.), которые сериализуют объекты в xml или json на выбор. Фронтенд использует json.

На счет конфигов, я с самого начала использовал require и склейку массивов, но в итоге захотелось YAML (дело вкуса). Про сборку я наверное не правильно выразился, конфиг собирается на лету из нескольких yaml файлов с помощью нашего класса который не зависит от yii, так как тот еще непроинициализирован. Собирается конечно не всегда а только при изменении файлов (на проде он вообще не проверяет изменения) и ложится в кеш. То есть в итоге получается тот же самый конфиг, что и при обычном main.php. Таким образом после сборки все url правила модулей попадают в общий конфиг и отдаются CUrlManager.

Про Google CDN в yii 1.0, я похоже упустил.
Случайно не через расширение из YiiExt?
Нет написал свое, в YiiExt тогда еще не было такого расширения. Плюс ко всему были свои доработки Smarty и расширений к нему, ориентированных на yii.

michael_v
Сообщения: 5
Зарегистрирован: 2010.05.04, 17:06

Re: Сайт онлайн бронирования гостиниц России

Сообщение michael_v » 2010.05.13, 21:04

snn писал(а):легкий offtop: а базу отелей сами набивали, договаривались с отелями или использовали один из знаменитых ресурсов через xml_rpc (не помню название)
Компания заключала договор с каждым отдельным отелем. Бронирование через систему проходит не только с нашего сайта, но и с сайта гостиницы, мы интегрируемся с их сайтом. Вот пример интеграции http://arthotel.ru/

kravcneger
Сообщения: 22
Зарегистрирован: 2011.05.16, 16:02

Re: Сайт онлайн бронирования гостиниц России

Сообщение kravcneger » 2011.05.20, 14:42

Это пожалуй самый крутой сайт на yii , из всех которые я видел.

glamurchik
Сообщения: 65
Зарегистрирован: 2011.04.27, 21:39

Re: Сайт онлайн бронирования гостиниц России

Сообщение glamurchik » 2011.05.21, 21:19

kravcneger писал(а):Это пожалуй самый крутой сайт на yii , из всех которые я видел.
он красив, но с yii здесь еще есть над чем работать...

в ноутбуке например нажимать на "события" и нужно перелистывать чтобы увидеть заголовок H1
нету пути где ты находишься ("хлебные крошки")

Ответить