Для начала смотрим видео, а потом милости просим под кат.
В общем, как я и обещал, я таки сел писать свою социалку… Но хотя я думал выпустить первый релиз уже через пару дней, первый релиз я все-таки публикую только сегодня, не смотря на то, что за дело я взялся в тот же самый день. А дело в том, что первые дни практически полностью ушли на обдумывание модели. Я все время был в поиске такой золотой середины, чтобы и просто все было (раз-два, все встало, и работает), и при этом не имело каких-то жестких ограничений. Этот момент я разъясню подробней: вот у нас есть отдельно MODX, и отдельно Livestreet. MODX мы все любим за то, что на нем можно сделать что угодно. Это отличная платформа для проектов любого уровня. А вот Livestreet хорош тем, что на нем можно за несколько минут развернуть собственный аналог Хабрахабра. У MODX минус — отсутствие готовых решений, которые можно было бы кучу накидать как в Livestreet, и все они дружно бы работали без лишних хаков (не будем о багах). А в LS минус — узкопрофильность. Много хороших готовых компонентов, дружных и не очень, но когда дело доходит до тюнинга, вот тут начинаются серьезные проблемы (попробуйте на LS магазин замутить).
Так вот, вот эту золотую середину я и хотел найти, чтобы и логика готовая была, и гибкость. И здесь я пришел к выводу, что нельзя делать один компонент. Здесь должно быть минимум два. Этот момент тоже разъясню: MODX отлично подходит для создания сайтов-визиток, корпоративных сайтов, новостных лент и магазинов. Почему? Потому что элементарная информационная сущность этих ресурсов — документ (страница). Документ имеет поля (заголовок, контент, дату создания и т.п.). Просто документ позволяет реализовать бОльшую часть структуры и логики. А там, где не хватает какого-то поля, на помощь приходят TV-шки. Но давайте взглянем на тот же LS: у нас есть блоги, топики и пользователи. Блоги и топики имеют много статистической информации (просмотры, голоса, рейтинги и т.п.), и пользователи (кто за него голосовал, за кого голосовал и т.п.). В целом все это можно было бы и на TV-шках и прочих MODX-плюшках сделать, но сами знаете, что это и большая нагрузка, и много элементов, и целостность обеспечить надо… В общем тут много всего, и MODX-а как-то не хватает (именно каких-то базовых сущностей).
Если еще и на форумы посмотреть, то там тоже много общего с сущностями ливстрита есть: разделы — это блоги, топики — они и в Африке топики, и в свойствах пользователей есть общие моменты.
В общем, я думал-думал, и придумал: один пакет будет устанавливать именно недостающие MODX-у сущности: Блог, Топик, Юзер. Блог и Топик — это модифицированные объекты modResource (подробнее о CRC читаем здесь, если с буржуйским нормально). А Юзер — это модифицированный modUser (об этом даже почитать нечего, разве что только мои эксперименты
Поправка. Оффмануала: rtfm.modx.com/display/revolution20/Extending+modUser
В свое время неправильно перевел некоторые части статьи и думал, что там пример только с данными пользователей в отдельной таблице, а не в modx_users.).
Эти объекты и их дополнительные таблицы легли в основу базового пакета modSociety. Устанавливая этот пакет, вы получаете эти сущности в своей системе, но их наличия практически вообще не ощутите. Разве что появятся новые типы документов.
?
По задумке объекты этого пакета должны обеспечить основу для любых типов социалок, форумов и т.п.
А вот второй пакет (modBlog) — вот это уже модель готового сайта со своей уникальной логикой. Хотя пакет еще очень сырой, и это пока только заготовка, наверняка у многих, кто посмотрел видео, ассоциации возникли с Хабром или Ливстритом. Да, я хочу сделать свой вариант хабра-движка. И это будет готовое решение, которое будет устанавливаться в пару кликов, со всей структурой, готовым шаблоном и т.п. Но так же планируется, что будут появляться и другие пакеты, устанавливающие свои специализированные сайты. При этом для всех этих сайтов основа будет — modSociety. То есть если появляется какая-то сущность, которая может понадобиться большинству таких типовых движков, эта сущность переходит в modSociety. Если сущность специфическая для конкретного пакета, то там она и развивается, и устанавливается с конкретным пакетом. Таким образом будем держать такой баланс, чтобы и основа была богатая, и при этом ядро не сильно разрасталось.
А теперь перечислю некоторые фишки своих пакетов. Сразу скажу, что эти пакеты — сосредоточение всех моих знаний о MODX Revolution, и пока я их писал, в поисках оптимальных решений я такие фишки Ревы ковырял, что просто прозревал. Уверен, что освоив хотя бы малую часть этого, многие, кто до сих пор еще не решился перейти на Реву, всерьез об этом задумаются…
1. Пользовательские типы ресурсов (производные от modResource). Я об этом уже говорил выше, но хочу отдельно об этом рассказать.
Пользовательские ресурсы не только позволяют просто добавить какие-то свойства базовым объектам, а позволяют в принципе создавать совершенно другие объекты, и полностью менять логику. К примеру в моем пакете modBlog переопределяется папка контроллеров документов SocietyBlog и SocietyTopic, и при создании или обновлении этих ресурсов через админку как обычных документов, запросы отправляются не на системный коннектор самого MODX-а, а на коннекторы моего пакета, и там я уже дополнительно творю, что хочу. (Конечно и без этого можно обойтись, но очень яркий пример).
2. Переопределяемые контроллеры базовых классов SocietyBlog и SocietyTopic. Это вообще ураган! Хотя, как я и говорил выше, SocietyBlog и SocietyTopic — это базовые объекты, которые будут фигурировать в разных специализированных сайтах, логика этих объектов может отличаться. К примеру в своем Хабра-движке у меня будет какое-то ограничение на количество символов в топике (к примеру), а в другом типовом сайте у меня этого ограничения не будет, или оно просто будет отличаться. Так вот, используя то, что нам дает MODX, мы можем переопределять контроллеры этих объектов. К примеру в одном контексте одна папка контроллеров будет, а в другом другая. И на уровне контроллеров и процессоров я уже могу рулить логику при сохранении объектов, обновлении и т.п. При этом логика может быть или общая и для бэкэнда и для фронтэнда, или отличаться. К примеру, я хочу, чтобы ограничения на количество символов учитывались и в паблике, и в админке. Я могу это сделать, и даже в админке через редактор документов пользователь не сможет сохранить документ с нарушением правил, и получит соответствующие сообщения об ошибках.
При этом мы не плодим объекты или таблицы, у нас все единое, просто логика различается в разных пакетах.
3. Шаблонизация. Я много раз говорил, что MODX-шаблоны — это не шаблоны, а чанки-контроллеры. Реальной же шаблонизации нет в MODX. Я сразу заложил основу под шаблонизации в пакете modBlog, потому можно будет легко менять скины сайта.
4. Инсталяха с менюшкой. Вот эта часть наверно самая сильная здесь. Я наверно выжал возможности менеджера пакетов MODX-а на 120%. У меня не только пакет устанавливает все политики безопасности, группы пользователей, контексты, структуру, элементы и т.п., но еще и позволяет на этапе установки выбрать какие-то особые действия, к примеру создать новый контекст, или обновить существующий. То есть даже имея несколько разных сайтов на разных контекстах с разной логикой, можно накатить новый пакет с обновлением уже существующих отдельных контекстов. В общем слов нет, одни слюни.
А 120% — это потому что сам по себе менеджер пакетов не предусматривает исполнение javascript-а на этапе установки пакетов, но я использовал одну хитрость, которая позволила это.
5. 100% MODX-технологии. Да, все это — 100% функционал Рево из коробки. Да, свои объекты я дописал, но они используют таблицы, контроллеры, процессоры и т.п. самой Ревы. То есть ядро я не зацепил ни на байт, и ничего со стороны не взял.
Я рассчитываю на то, что заинтересованные члены сообщества так же подключатся к доработке этих пакетов. Самое главное — основу — я уже заложил и ее и буду развивать. Но есть полно задач, которые можно разбить. К приму скины для него нужны и т.п. То есть все мы сможем создать отличный движок, который наверняка сможет стать ключом для MODX в мир блого-социальных движков.
Гарантирую каждому участнику огромный опыт на выходе.