Мой движок (на примере сайта usemac.ru)
Приветствую вас! Материал, к чтению которого вы приступили, не является рекламой в обычном понимании слова, но скорее рассказом о создании собственного движка на манер Хабра, такого, который мечтают изобразить многие энузиасты с помощью Drupal. На создание движка мне потребовалось четыре месяца работы. Если вам интересно, как происходила работа над движком, и какие плоды она принесла — милости прошу под хабракат.Позвольте представится. Меня зовут Дима. Мне 22 года. Мой ник — CuamckuyKot. Многие, должно быть, знают меня, как парня в тельняшке с уточкой, который любит работать на Mac’ах настолько, что готов найти приключения на свою пятую точку, чтобы получить опыт покупки Mac’а за границей.
Чтобы читатель более полно представлял картину происходящего, позволю себе небольшой экскурс в историю. После окончания СПб ИТМО по специальности слабо связанной с программированием, мне повезло устроиться работать в одну из самых привлекательных для меня на то время IT-компаний — Spb Software House. Проработав в стенах Spb около полугода, пришел к выводу, что принадлежу к тому небольшому проценту людей, которым реализовывать свои планы и идеи намного более важно, чем исполнять волю работодателя, поэтому ушел из Spb, приступив к реализации своей мечты. В данном случае слово «стартап» не подходит, потому что мечтал создать свой движок, на базе которого уже эти самые «стартапы» можно было бы строить. Движок был создан в период с марта по июль 2008 года. Процесс разработки потребовал знание следующих технологий: HTML, CSS, Javascript, AJAX, PHP, MySQL, FreeBSD, Photoshop. Так распорядилась судьба, что к моменту зарождения мысли о создании своего чуда, мне повезло владеть хорошей базой знаний и опыта по всем вышеперечисленным технологиям. Не скажу, что себя выдающимся специалистом в какой-либо сфере, но знание всех технологий вместе, пусть даже не на самом высоком уровне, одарило меня возможностью создавать проекты в одиночку, получая бесценный опыт разработки и понимание полной картины происходящего в деталях.
Как неоднократно писали авторитетные умы Хабра — не стоит изобретать велосипед, поэтому, руководствуясь напутствием более опытных специалистов, в качестве основы своей работы выбрал ряд готовых решений:
- CodeIgniter — замечательный PHP-framework. Довольно давно ему симпатизировал, изучал. Решил опробовать его в деле, и очень рад своему выбору — эластичная, удобная и производительная модель CI легла в основу движка. Конечно, пришлось вносить много корректив, чтобы добиться всего необходимого, но результат не заставил себя ждать.
- MooTools. Судя по последним опросам, мутулсы сильно отстают по популярности от JQuery, но для меня это — дело привычки. Неоднократно использовал MooTools, знаю множество нужных плагинов, поэтому выбор пал именно на эту библиотеку. Использовал версия 1.2beta, совместимую с 1.1. Жаль, что новейшая 1.2 не совместима со многими используемыми плагинами. Жду обновлений.
- Smarty. Сколько людей — столько мнений. Для меня было важно, чтобы работать с шаблонизатором было просто и легко. Поскольку до того также был знаком с Smarty, то решил пожертвовать производительностью (хотя при правильном кэшировании библиотека лишь немногим медленнее шаблонов в первозданном PHP) ради комфорта.
- TinyMCE. Писать тегами здорово, но не всегда есть широкий канал (бесплатный трафик) связи для предпросмотра, а также сайты могут быть рассчитаны на менее умную аудиторию, которая тегов отродясь не видела.
Конечно, это только основные библиотеки, но к ним также были подключены разнообразные плагины.
Если вам интересен процесс разработки — попросите меня написать о них отдельно, ибо это займет слишком много места для ознакомительного материала, коим является данная статья.
В начале июля движок был готов. Первый сайт, который использует его — это мой проект «Используй Mac!», который на базе нового движка переродился в тематическую социальную сеть.

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

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

Обратим внимание на форуму регистрации. Перед вами типичный пример того, как были реализован формы. Каждое поле проверяется дважды — при помощи JS-валидации, и при помощи валидатора CodeIgniter, на случай если кто-то особо умный решит обойти JS.На поддоменах располагаются разделы сайта (users, blogs, pulse, etc), а также все сообщества пользователей (они же — коллективные блоги).
Создание креатива

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

Пользователь может создавать разные виды постов, но возможность выбора типов можно ограничить, используя Access Control List (ACL), который руководствуется значениями кармы, рейтинга и т.д.

Интерфейс создания материала будет отличаться в зависимости от типа поста, но некоторые поля будут оставаться неизменными. Одно из них сразу же обращает на себя внимание — визуальный редактор TinyMCE. Приятная особенность редактора — работа во всех браузерах (привет, Safari). Были написаны необходимые модули — загрузка изображений, вставка видео (YouTube, RuTube, Vimeo) и т.д. Текст cut’а можно делать произвольным, как здесь.

Порой мне не нравилось, что редактор, в зависимости от браузера, создает много лишних тегов, но проведенный среди пользователь опрос показал, что он полюбился многим из них, и поэтому был написан парсер, который просто-напросто чистил все пустые p и прочий мусор.
Также есть возможность указывать ключевые слова, описание, которая также работает через ACL (поэтому простым пользователям она не предоставляется).
Интересные момент — реализация указания тегов.

Реализовал свою старую задумку — теги с автоподбором из уже используемых на сайте.
Любой материал можно сохранить (тогда он будет виден только пользователю в его личном блоге) или опубликовать. Разумеется, есть предпросмотр.

Модератор (о них позже), редактирующий материал пользователя, может прямо в процессе редактирования написать автору сообщение, чтобы последний знал, что исправил первый, и как следует правильно писать в будущем.
Комментарии
Реализованы при помощи Nested Sets, то есть многомерных деревьях, хранящихся в двумерной таблице. На осознание теории метода ушло несколько дней, но после преимущества способа радовали на каждом этапе работы. Один запрос выводит все комментарии и сортирует их в нужном порядке. Как и на Хабре, новые комментарии (с момента последнего визита) выделены цветной рамкой.
Возможность ответа на каждый комментарий, предпросмотр — этим сейчас никого не удивишь. Комментарий можно оценить, и недостойные будут скрыты (отображены при клике по соответствующей ссылке).

Приятные особенности — рост поля вода по мере ввода содержимого, парсинг ссылок и смайликов.
Личные сообщения

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

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

Оповещения


Маленький помошник, который всегда подскажет что да как. Реализовал на базе собственноручного написанного класса (на MooTools). Сообщения набиваются стек, и через пару секунд после появления уезжают наверх — за пределы экрана.
Сообщества

Каждый пользователь может создавать сообщества, если ему это позволяет ACL.
Создавший сообщество становится его смотрителем — может назначать модераторов сообщества, и приглашать/исключать участников.
Сообщества бывают трех видов:
- Открытое. Вступить может каждый.
- По приглашениям.Читать его может каждый (за исключением контента в теге [hide][/hide]), но участие в нем — только по приглашениям, которые рассылаются смотрителем и модераторами.
- Закрытое. Читать посты целиком (то что после ката) могут только участиники. Стать участником можно только по приглашению.
Модераторы и смотрители обладают возможностью править посты в сообществе (как писал выше — попутно отправляя замечания в личку автору).
Сообщества обладают кармой, суть которой в сумме всех его постов.
Саморегулирование
Принципиальное отличие от Хабра — нельзя просто прийти и “настрать” человеку за то, что он вам не понравился. Можно влиять на карму пользователя только отдавая свой голос за его посты/комментарии. Изначально пользователь обладает некоторым количеством голосов за карму/комментарии, которые может потратить. Голосуют за ваш пост/коммент — вы получаете соответствующий голос.
Поля профиля

В настройках профиля помимо стандартных полей используются произвольные поля, реализованные с помощью таксономии. Причем они могут быть разных видов (строки, списки, иконки и т.д.). В данном случае сайт про Mac, поэтому пользователь может указать, какой продукцией Apple он владеет.
Google Adsense

Идея не новая, но верю в кармический закон — чем больше отдаешь, тем больше получаешь. Поэтому по примеру redhummer’овской «Большой Улицы» предоставил пользователям возможность установить баннер Google Adsense под своими постами.
Дополнительные модули
В процессе отладки возникли новые идеи, поэтому создал дополнительные модули.
Статус

При помощи блока в сайдбаре можно легко поведать посетителям сайтам планы на будущее (например, “пишу статью на Хабр”) или же сообщить друзьям о своем настроении. Также можно просмотреть статусы друзей при помощи одного клика. Все релизованно асинхронной передачей данных.

Чат

Позволил себе слабость создать маленький чат для друзей первого и второго круга. Мелочь, но приятная.
Онлайн

Приятно осознавать, сколько посетителей смотрят сайт и сколько пользователей на нем находятся.
Камни
Одним из главных подводных камней как обычно является
Производительность
Поскольку изначально предполагалась высокая посещаемость будущих проектов, был сделан упор на оптимизацию:
- Минимум запросов, денормализация базы данных.
- Несколько вариантов кэша:
- Кэширование вывода в CodeIgniter.
- Кэширование запросов к базе в CodeIgniter.
- Кэширование шаблонов в Smarty.
- Кэширование запросов в базу с помощью Memcached (пока что обхожусь только этим вариантом).
- Возможность использовать nginx+fastcgi без apache, поскольку нужно лишь одно rewrite-правило, результат которого препарируется уже внутри движка.
- Автоматическая упаковка всех JS в один файл. Тоже самое касается и CSS.
Особенно радуют размеры gzip-ованного nginx-ом файла на выходе. - Спрайты иконок. Мелочь, но приятно, когда все иконки грузятся одним файлом.



комментарии (320)