понедельник, 11 апреля 2011 г.

Autochmo

Собрался с силами и написал небольшое описание создания одного из проектов нашей студии, в котором я принимал наинепосредственнейшее участие. Это пост с большим количеством технических подробностей и небольшим количеством смысла.

Проект «Авточмо» — от идеи до запуска.

Правильнее следовало бы сказать не «от идеи», а «от того момента, когда я пришёл работать в компанию Greensight», потому что придумали авточмо незадолго до этого момента. Честно говоря, я не знаю, кто именно придумал этот проект, точнее, не помню. Я как-то спрашивал это у ребят, мне даже рассказали краткую историю придумывания идеи и названия, только я всё это забыл уже, а по-новой спрашивать неудобно.

Итак, когда я пришёл в студию Greensight, проект «Авточмо» существовал в виде нескольких задач и обсуждений в корпоративном мегаплане, и ещё, может, в набросанном дизайне и частично свёрстанной шапке сайта.

В качестве платформы для авточма был выбран «Битрикс». Причин тому было две: во-первых, большинство (кроме одного-двух) проектов в Greensight было сделано именно на Битриксе, то есть платформа была всем знакома, да и в партнёрской программе мы занимали далеко не последние места. Во-вторых, я же только-только пришёл в компанию, и ещё стеснялся предлагать какие-то кардинальные нововведения.

Итак, был выбран Битрикс. Я развернул виртуальный хост, настроил его более-менее, установил туда редакцию «Старт» и взялся за работу. Незадолго до этого я как раз обсуждал с Пашей (исполнительным директоров Павлом Ситкиным — прим.авт.) вопросы написания своих собственных компонент с нуля, и он требовал максимального использования фунционала платформы. В качестве функционала платформы были выбраны инфоблоки. Суть инфоблока в Битриксе такова — это объект некого типа, хранящийся в базе данных. У него есть набор свойств, часть из которых является неотъемлемой, а часть может задаваться пользователем. Организовано это очень просто: есть таблица с элементами инфоблоков (то есть теми самыми объектами и их неотъемлемыми свойствами вроде названия, автора, времени создания и так далее), таблица с перечнем свойств (название свойства и его тип), и таблицы-привязки элемента инфоблока к свойству, где хранится значение данного свойства данного элемента инфоблока.

Я сделал три инфоблока — факты авточмошничества, собственно авточмы, и марки машин.

Механизмы Битрикса позволяют выбирать нужные инфоблоки с очень гибко задаваемым фильтром, но этой гибкости фильтра достаточно только в самых примитивных случаях. У у меня случай был не примитивный — нужно было организовать фильтрацию элементов инфоблока, то есть фактов авточмошничества, по серии номера автомобиля. То есть у каждого элемента есть свойство «номер», в котором хранится строка вида «а000аа000», и нужно было выбирать её именно по буквам «ааа», которые являются серией номера. Знатоки SQL скажут, что нужно было задавать фильтр типа «а%аа%» или «а___а%». Нельзя сказать, что я не пытался это делать. По всей видимости, гибкости фильтра не хватило, поэтому я отошёл от пашиных указаний придерживаться стандартного функционала, и написал в функции CAvtochmo::GetList() SQL-запрос, выбирающий то, что мне нужно, из таблиц, содержащих элементы инфоблока, свойства и их значения. Я организовал собственный примитивный фильтр, чей функционал позже расширялся по мере необходимости.

Кстати, во время разработки мы везде писали «avtochmo» через V, а не через U по одной довольно дурацкой причине. Ещё в самом начале, когда я спросил:
- Ребят, а как авточмо пишется, через «вэ» или через «у»? - мне ответили, что надо посмотреть в интернете, дескать, там домен занят уже один какой-то. Я посмотрел в интернете. Домен autochmo.ru был занят, а avtochmo.ru — свободен, и я везде стал писать «avtochmo» через V. Только потом выяснилось, что тот домен, что писался через U, был занят нашим арт-директором специально под этот проект. Так что, можно сказать, что у нас исторически сложилась буква V в разработке, а U — в продакшене.

Примерно в то же время, когда это выяснилось, мы выпустили версию 0.2 бета. «Бета» потому, что, кроме шапки, так ничего ещё не было свёрстано. Точнее, что-то было, но я не особо заморачивался над вёрсткой, а реализовывал функционал. К тому времени он был полностью готов — можно было добавлять фотографию, писать номер машины и её марку, ставить метку на карте, и смотреть список ранее добавленных фотографий.

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

Откуда мы раздобыли список марок машин, я уж точно и не помню. Я взял первый попавшийся автосайт, на котором были перечислены модели, написал быстренько скриптик, и он насоздавал моделей автомобилей и марок, забрав их список с того сайта.

Все январь, февраль и март мы занимались улучшениями. Что-то довёрстывали, доделывали карту и форму добавления. Я сделал комментарии и рейтинг. Здесь я полностью пренебрёг требованиями Паши по использованию стандартного функционала, и всё сделал на своих собственных таблицах. Разумеется, это был не просто модуль с набором функций «добавить» и «удалить», но и своя административная часть. Комментарии и модули реализованы схожим образом. Есть таблица с перечисленными типами сущностей (разумеется, у модуля комментариев и у модуля рейтинга это свои отдельные таблицы), которые можно оценивать или комментировать. И есть таблицы собственно с голосами или комментариями. Устроены они следующим образом — в каждой четыре основных поля: пользователь, номер типа сущности, номер сущности и голос (или комментарий). Поясню на примере, как это работает. Есть тип сущности «факт авточмошничества». Пользователь заходит на сайт и видит, что там появились новые фотографии, и одна из них, под номером 7, вызывает у него приступ неудержимой ярости, он наводит мышку на значок с голосованием (там, кстати, во всплывающей подсказке написано «Ненависть, ненависть!») и жмёт на неё. В таблицу с рейтингом вносится запись: пользователь такой-то, факт номер 7, тип сущности «факт авточмошничества», голос -1. Дополнительные поле и таблица «тип сущности» нужны для того, чтоб можно было оценивать сущности разных типов — собственно авточмов, комментарии к ним, и так далее, а у сущностей разных типов могут быть одинаковые номера, и, если бы не было этого поля, была бы путаница.

С рейтингом там на самом деле немного посложнее. Так как голосовать может любой, даже незарегистрированный пользователь, там используются кукисы. А чтоб пользователь не злоупотреблял удалением кукисов и повторным голосованием, предлагается вводить капчу в том случае, если пользователь (если судить по кукисам) ещё не голосовал. Привязку к айпи-адресу я решил не делать, чтоб не лишать возможности голосовать разных пользователей, использующих один адрес. У меня сейчас есть идея, как помешать одному и тому же человеку голосовать несколько раз, удаляя кукисы, но не мешать при этом голосовать другим людям из этой же подсети.

Точную дату запуска проекта назвать сложно. Первое авточмо мы разместили там аж в январе, когда сайт был совсем сырой и недоделанный. Я не хотел никому о нём рассказывать до того, как перестанет быть стыдно его показывать не только друзьям, но и малознакомым людям, и бывшим коллегам, и бывшему начальству. Однако, Егор (генеральный директор — прим.авт.) был другого мнения, поэтому многие знакомые узнали про авточмо раньше, чем сайт стал более-менее красиво выглядеть. Наверное, официальным открытием, которое, правда, прошло без торжественных речей и разбивания бутылки шампанского о сервер, можно считать релиз версии 0.6, в которой появилась возможность добавлять несколько фотографий одного авточма, были исправлены некоторые недочёты и ошибки (я намеренно говорю «некоторые», а не «многие», как любят писать во всяких пресс-релизах, потому что у нас мало недочётов и ошибок). 29 марта, если мне не изменяет память.

Дальше началась промышленная эксплуатация :)

2 комментария:

  1. А я опечатку нашел - хинт "голосовать можно только зарег_е_стрированным пользователям"

    ОтветитьУдалить
  2. Спасибо! Пойду создам тикет.

    ОтветитьУдалить

Ублюдочный Гугл поломал форму комментариев. Извините.