Поскольку скоро я выложу на всеобщее обозрение первую публичную рабочую версию своей системы, то решил в последние дни более плотно заняться дефолтный шаблоном.
На самом деле это очень важная часть любой CMS. Такой шаблон должен решить две задачи. Во-первых он должен показать пользователю на что способна система. То есть пользователь выполнил только установку и еще не разбирается во всех тонкостях (и это естественно), но уже на этом этапе должен получить нечто рабочее и похожее на конечный продукт. Здесь конечно же следует обратить внимание на дизайн. Если бы разработчики систем придавали бы этому вопросу большее значение, то наверное их истемы были более популярны. Для примера можно взять тот же CodeIgniter или CakePHP. С таким дефолтным шаблоном первое впечатление создается более чем тягостное.
Вторая задача - это продемонстрировать сторонним разработчикам функциональные возможности системы и дать возможность «поковыряться» внутри. Тут, конечно же важно сделать так, чтобы процесс ознакомления проходил в «естественной» (для программистов) последовательности.
Дефолтным шаблоном я занялся пару месяцев назад и сейчас он потянет как минимум на нормальный сайт. (Конечно же мое мнение субьективно, но все-таки мой опыт позволяет мне так утверждать.)
В итоге я пришел к шаблону, который вы видите на этом сайте. Он и будет идти в комплекте. Я исходил из-того, что сейчас модна именно такая стуртура блоков: верхнее меню, три сайдбара, тексты, подвал. При этом я решил, что некоторые настройки шаблона можно вынести в админ-панель.
В частности можно сменить изображение в шапке (5 вариантов), стиль меню (15 вариатов), стиль (style) текста названия сайта и стиль текста описания. Это все уже прописано в ini-файле и при желании легко добавляется свой вариант. В общем, путем несложных телодвижений, можно получить сразу несколько вариантов внешнего вида.
Теоретически можно было бы кастомизировать и прочие элементы и блоки, но всегда должен быть разумный компромис. Мне кажется, что тот, кто захочет изменить или расширить функциональность, сможет без труда понять, каким образом это всё реализуется. А дальше можно делать по аналогии.
Для программиста важна будет возможность быстро оценить внутреннее устройство шаблона. Ну например я могу сказать, что любой шаблон начинается с index.php. Данного сообщения более чем достаточно, чтобы открыть этот файл и увидеть, что дальше подключаются файлы по типу данных. Например для главной страницы это home.php. Дальше - по цепочке.
То есть дефолтный шаблон, помимо демонстрации системы, несет еще и некую справочную функцию. Именно по этой причине я не стал сокращать или убирать какие-то «дубли», поскольку это усложнило бы логику самого шаблона. К слову сказать, для шаблона существует только один обязательный файл - index.php. Всё остальное на выбор программиста.
Так же я сознательно постарался использовать привычные имена файлов: home.php, page.php, category.php, header.php и т.д. Любой, кто хоть раз сталкивался с WordPress, поймет для чего предназначаются эти файлы.
Дальше пойдет техническая информация, в которой я расскажу как «физически» работает шаблон.
Итак, после отработки и инициализации системы (подключается БД, сессии, плагины, основные функции), управление передается на index.php текущего шаблона. Грубо говоря, можно сделать шаблон вообще только из одного этого файла. Но в нашем случае лучше разделить логику шаблона по разным файлам. Так будет проще.
В index.php выполняется проверка на типы данных, но перед этим смотрится is_feed() - то есть нужно ли отдавать RSS-ленту. Если нужно, то подключаем feed-файл соответствующего типа данных. Например для главной страницы - rss-лента содержит все последние записи. А в рубриках - только записи этой рубрики. Лента какой-то страницы содержит её комментарии.
Аналогично проверяется и другие типы данных. Сам тип определяется на основе входящего URL и служит для того, чтобы показать системе какие именно данные нужно выводить.
Сам же вывод осуществляется в отдельных файлах для каждого типа. (В принципе это не обязательно - можно просто добавить условие is_type() и получать/выводит данные в одном файле.)
Поскольку у нас единый шаблон для всех типов данных (кроме rss - он вообще «бесшаблонный»), то сам шаблон с точки зрения HTML разбивается на три части: main-start.php, файл типа, main-end.php. В main-start.php мы подключаем header.php, который содержит секцию <head> (до <body>). В main-end.php подключается footer.php. Естественно, что все эти файлы содержат какой-то html, который зависит от дизайна.
Таким образом у нас получается так, что изменяемая часть - это только файл типа данных. Именно в этом файле мы и выполняем получение данных для вывода. Примерно так:
- Получение данных для вывода (mso_get_pages)
- Подключение require('main-start.php')
- Вывод данных в цикле (foreach)
- Подключение require('main-end.php')
Почему нужно получать данные до main-start.php? Всё очень просто. Поскольку в main-start.php мы подключаем и секцию <head>, где указываются title, description и keywords, которые зависят от полученных данных. Например для конктерной страницы можно указать свой титул. Поэтому, пока мы не получим сами данные, выводить что-либо в браузер нет смысла.
Если сравнить с WordPress, то принципиальное отличие здесь именно в этом. WordPress получает данные до шаблона. С одной стороны мы делаем тоже самое, но с другой - какие именно данные мы решаем сами. Я, естественно, предусмотрел специальную функцию (mso_get_pages), которая значительно упрощает этот процесс, но в принципе можно указать и свой SQL-запрос. Более того, какие-то страницы можно вообще выводить без получения данных. Например «contact» - здесь располагается форма обратной связи и получать какие-либо данные не требуется.
Комментариев: 18 RSS
1Роман29-05-2008 19:02
Новый шаблон заметно похорошел, но я предпочитаю другой стиль (habrahabr.ru, 4dle.ru). Для своего сайта тоже смастерил нечто похожее ;)
2Krimal30-05-2008 09:29
Как скоро появится версия для тестирования ?
3Максим30-05-2008 10:09
1 июня.
4Роман31-05-2008 08:31
Макс, а зачем нужны категории, если есть тэги? :D
5Максим31-05-2008 09:09
А так чтобы выбор был. ;)
6Wave31-05-2008 10:41
Вот чего не очень понимаю, чем категории от тэгов отличаются. Хотя бы в терминологии того же вордпресса.
И категорий и тэгов на одну и ту же сущность можно назначить несколько. И по категориям, и по тэгам можно получить все обозначенные ими сущности. В чём разница? Зачем пользоваться одновременно и тем и тем?
7Максим31-05-2008 16:25
Рубрики - это предопределенные отметки, которые можно выстраивать в разные иерархические структуры. Поэтому посетитель сможет сразу понять, что «Шаблоны» - подраздел «MaxSite CMS».
Метки же не допускают аналогичного обобщения.
Еси вы не хотите использовать метки, можете их и не использовать. ;)
8Wave31-05-2008 23:57
Спасибо за объяснение.
Это как с облаком тэгов - долго не мог понять, нафига оно нужно и чем оно лучше обычной карты сайта. А потом ничего, привык.
Так и здесь. Рубриками ведь тоже можно выстроить плоскую иерархию, совершенно аналогичную тэгам (вы имеете в виду конкретно вашу систему, или вообще? Если конкретно вашу - допускается ли у вас назначение нескольких рубрик одной заметке?). И?
Полагаю, это полезно, если рубриками выстраивать-метить заметки по одним признакам (девелопмент, тонкий клиент, толстый клиент, дизайн), а тэгами по другим (опубликовано, черновик, личное, подумать). Так?
9Максим01-06-2008 07:26
Если конктретно мою ссистему, то можно указать несколько рубрик для одной записи. Так же можно указывать несколько меток. А также допускается вообще не указывать ни рубрики, ни метки. То есть любые варианты. :)
Что касается использовать или нет, то тут всё зависит от структуры сайта. Мне очень не хватало в WordPress возможности ввести какие-то особые типы страниц. Поэтому у меня сейчас реализованы следующие возможности: рубрики, метки, типы. Сейчас есть типы «blog» (аналог записи) и static (аналог постоянных страниц). Но в админке можно сделать сколько угодно своих типов.
10RWMan13-08-2008 20:58
А есть где в Интернете еще шаблоны на эту ЦМС или только дефолтный?
Спасибо :)
11Максим13-08-2008 21:17
Пока нет. Еще и этот не до конца доделан. :)
12ilya_leoСайт24-09-2008 05:06
Максим, есть небольшое замечание. Я пользуюсь Firefox 3 под Linux. В дефолтном шаблоне форма поиска не влезает в одну строчку (кнопка "Поиск" переносится вниз, что не очень красиво). А настройки никакой нет.
И еще немного по другой теме: может быть лучше в форме комментирования радиобатон по умолчанию ставить на вариант с e-mail и паролем? А то комюзеры будут часто ошибаться и отправлять комментарии анонимно (я сегодня так уже ошибся).
13Максим24-09-2008 07:25
У меня линукса нет, поэтому я проверить не могу. Вообще я тестировал на всех браузерах: FireFox, IE6-7, Opera, Safari, Chrome. Если не считать специфичного только для FireFox скругления углов виджетов - выглядит одинаково.
По форме подумаю.
14ilya_leoСайт24-09-2008 10:58
Понятно, но на всякий случай вот скриншот:
http://xora.ru/uploads/maxsite.png
15Максим24-09-2008 11:29
Похоже, что у вас увеличенные поля для input. Или может шрифт такой. Точнее я ничего не скажу.
16Pretorean28-09-2008 20:23
баг который заявляет ilya_leo подтверждаю
Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.1) Gecko/2008072820 Firefox/3.0.1
однако однако если глянуть скрины на browsershots
виндовс
http://browsershots.org/screenshots/c118e1e3740f1375c4412bd30c7cb25f/
линукс
http://browsershots.org/screenshots/ac93c179f052402371e12ab96a5ea9e6/
то проблеммы вроде как нету
17Ренат30-10-2009 10:58
:smirk: Прикольный движок! Респект тебе Максим!;-)
18Аноним20-10-2012 03:57
эх... придется помучится со своим макетом... :coolgrin:
Как мне казало будет все проще: установил cms, раскидал php переменные в своем шаблоне, подкорректировал css виджитей и ништяк... :)