Xaraya CMS — глава первая, «Введение»

CMS*
Xaraya (читается «Зарая») — не просто еще одна CMS. Она предоставляет вдумчивому администратору сайта, готовому потратить некоторое время на освоение архитектуры и понимание внутреннего устройства, фактически готовый фреймворк, позволяющий сделать все, что угодно.
Порог входа в Xaraya несколько выше, чем у других известных мне CMS, но, во-первых, ненамного, а во-вторых — поверьте, оно того стоит.
В данной статье я попытаюсь максимально упростить начало работы с Xaraya, а заодно — расскажу о том, как прикрутить к сайту всяких библиотекарш и шахматы. Все нижесказанное относится к ветке 1.* (последняя на данный момент версия — 1.2.3, качать имеет смысл сразу full, чтобы дополнительно не искать модули). Ветка 2.* как-то меня не впечатлила, очень многое переделано, обратной совместимости нет, многие модули еще не адаптированы — в общем, сыровато для стабильной работы.
Xaraya Logo

Установка


Установить Xaraya очень просто — нужно скачать дистрибутив, содержимое папки html распаковать, например, в корень сайта (или не в корень), подготовить пустую базу данных и браузером сходить по адресу XARAYA_HOME/install.php. Инсталлятор проведет вас через весь процесс и скоро у вас будет рабочий сайт (не забудьте после этого стереть файлы install.php и upgrade.php.

Ключевые моменты архитектуры


Xaraya — модульное MVC приложение. В базовую поставку входит все, нужное для развертывания обычного сайта. Единицей информации в Xaraya является «публикация». Публикация состоит из набора «полей» (например, «Заголовок», «Введение», «Текст», «Картинка»). У каждого типа публикаций — несколько шаблонов вывода (например: «в ленте», «на отдельной странице»). Посмотреть на предустановленные типы публикаций можно в (здесь и далее: XARAYA_HOME — это что-то наподобие mybestsite.ru/) XARAYA_HOME/index.php?module=articles&type=admin&func=pubtypes.
Набор шаблонов вывода — называется темой («theme») и располагается в папке themes. Управление осуществляется через XARAYA_HOME/index.php?module=themes&type=admin&func=list. Можно заметить, что RSS и «версия для печати» тоже сделаны через темы, что упрощает редактирование вывода для разных «устройств».

Темы Xaraya


Создание собственной темы — процесс поначалу нетривиальный, но захватывающий.
Язык шаблонов — XML с дополнительными свистелками (о них — чуть позже). Xaraya будет искать шаблон сначала в соответствующем каталоге вашей темы, потом — если такового там не окажется — в папке xartemplates соответствующего модуля. Поиск осуществляется по имени шаблона. Например, пытаясь отобразить запись в блоге (модуль articles, тип публикации news, вид отображения — display), Xaraya сначала заглянет в папку /themes/YOUR_THEME/modules/articles и поищет там файл user-display-news.xt. Если не найдет — возьмет стандартный из поставки (/modules/articles/xartemplates/user-display-news.xd). Таким образом обеспечивается каскадность — переписывать вам придется только те шаблоны, которые вас не устраивают в стандартном представлении.
Главные шаблоны — шаблоны страниц — лежат в папке /themes/YOUR_THEME/pages. Основных — три:
  • default.xt — на все про все,
  • frontpage.xt — отображение главной страницы, и
  • module.xt — отображение содержимого конкретного модуля (используется реже).

Вот более-менее стандартный вид файла default.xt:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE blocklayout PUBLIC "-//XAR//DTD BL 1.0 Strict//EN" "http://xaraya.com/bl1/DTD/bl1-strict.dtd">
<?xar type="page" ?>
<xar:blocklayout version="1.0" content="text/html" xmlns:xar="http://xaraya.com/2004/blocklayout" dtd="xhtml1-strict">

<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<head>
    <xar:set name="topnavblocksgroup"><xar:blockgroup name="topnav" id="topnav" /></xar:set>
    <xar:set name="rightblocksgroup"><xar:blockgroup name="right" id="right" /></xar:set>
    <xar:set name="leftblocksgroup"><xar:blockgroup name="left" id="left" /></xar:set>
    <xar:set name="centerblocksgroup"><xar:blockgroup name="center" id="center" /></xar:set>

    <xar:set name="themedir">#xarTplGetThemeDir()#</xar:set>
    <xar:set name="sitename"><xar:var scope="module" module="themes" name="SiteName" /></xar:set>
    <xar:template file="headtagcontent" type="theme" />
</head>
<body>
    <div id="xc-outer-wrapper">
        <xar:if condition="!empty($topnavblocksgroup)">
           <xar:var name="topnavblocksgroup" />
        </xar:if>
        <xar:template file="pageheader" type="theme" />
        <xar:template file="pageblockgroups" type="theme" />
        <xar:template file="pagefooter" type="theme" />
    </div>
    <xar:base-render-javascript position="body" />
</body>
</html>

</xar:blocklayout>

Блоки могут группироваться (см. xar:blockgroup name="*" id="*"). К переменным и функциям контроллера можно обращаться через конструкцию #PHP_CODE#. Переменные передаются из контроллера, который лежит в /modules/MODULE_NAME/xaruser. Модель располагается в /modules/MODULE_NAME/xaruserapi. В Xaraya почти все организовано через naming conventions; например, контроллер вывода отдельной публикации живет в /modules/articles/xaruser/display.php, в функции articles_user_display($args) и передает в шаблон данные вот так ($data и $template, разумеется, подготовлены собственно в коде функции):
return xarTplModule('articles', 'user', 'display', $data, $template);

На время написания и отладки шаблонов — рекомендую включить опцию «Show template filenames in HTML comments» на странице Admin ⇒ Themes ⇒ Modify Config (XARAYA_HOME/index.php?module=themes&type=admin&func=modifyconfig). Кстати, ЧПУ могут быть отдельно включены для каждого модуля в настройках, а русская локализация — скачана и распакована в папку /var/locales/.

Практика


Собственно, пора бы уже написать какой-нибудь шаблон. Рекомендую создать новую публикацию типа «news», чтобы шаблон проще было отлаживать. Вот код из темы моего блога:
<xar:template file="user-display-title" type="module"/>

<xar:if condition="!empty($data['summary'])">
		<div class="summary">#$data['summary']#</div>
</xar:if>
<xar:if condition="!empty($data['body'])">
		<div class="body">#$data['body']#</div>
</xar:if>
<xar:if condition="!empty($data['notes'])">
		<div class="notes"><p><em>#$data['notes']#</em></p></div>
</xar:if>

<xar:block module="base" type="html" instance="disqus" />

<xar:if condition="!empty($data['hooks'])">
		<xar:foreach in="$data['hooks']" key="$hookmodule">
				<xar:if condition="!empty($data['hooks'][$hookmodule])">
				<xar:template
					file="schild" type="module"
					subdata="array(
								'contentfile'=>'prevart-hooks', 
								'hookmodule'=>$hookmodule, 
								'data'=>$data
					  )"
				/>
				</xar:if>
		</xar:foreach>
</xar:if>

Сначала я «подключаю» шаблон вывода заголовка — он у меня одинаковый для всех типов публикаций, а дублировать код я не люблю. Потом вывожу поля записи (если они не пусты). Затем вывожу блок комментариев (я пользуюсь DISQUS для этого, в вызываемом блоке — просто сниппет, который они мне выдали). Затем вызываю хуки преобразований (о хуках нужно писать отдельно, пока же ограничусь тем, что они есть; теги, например, выводятся здесь через соответствующий хук, поскольку модуль articles ничего не знает о тегах). Вот как это выглядит в результате:
Xaraya rendering
Обратите внимание: комментарии выводятся через свой шаблон, теги — через свой, и они все могут быть разными.

The Summing Up


Для введения, мне кажется, достаточно. Какая-то слегка сумбурная получилась заметка, но я честно пытался рассказать про основную архитектуру, дать, что ли, введение.
Если тема окажется интересной — могу продолжить (например, рассказать про создание темы с нуля до «рабочего варианта», либо провести через процедуру «создания модуля»). Свои модули — это то, что превращает Xaraya во фреймворк. Ну а уж своя тема — она настолько легко настраиваема в мельчайших подробностях, что, зачастую, «узнать» движок становится просто невозможно.
Если я упустил что-то важное для понимания механизма работы этой CMS — обязательно спрашивайте в комментариях. Апдейты к статьям пока еще разрешены.

Upd: я в легком шоке. Меня попросили рассказать, что я знаю о Xaraya — и теперь я не могу опубликовать ссылку из-за 22 свалившихся минусов в карму.
Ну и сидите без ссылки ;-)
–11
8 марта 2011, 10:45
6

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

0
Prometheus #
Жаль нет демки.
Опять придется качать, ставить, ковыряться и смотреть…
+1
matiouchkine #
xaraya.org — демка.
+3
Prometheus #
>>xaraya.org
Колхоз. MVC дурацкий.
Вообщем фигня это, аля Nuke и еще с ними…
–4
matiouchkine #
На вашем сайте (информация взята из профиля) — MVC гораздо круче, это правда:

MVC as it is to be
0
Prometheus #
Этот сайт счас выключен.

Что касается MVC, смотрите в сторону ZendFramework — там настоящий MVC.
А у xaraya — это пародия на MVC.
0
matiouchkine #
Спасибо за совет. Расскажите, как на Zend в течение получаса развернуть готовый блог?
0
Prometheus #
>>Расскажите, как на Zend в течение получаса развернуть готовый блог?
Если вы не умеете программировать — то никак.
Если умеете — то читайте мануалы или тот же quickstar.
–2
matiouchkine #
А если умею, но не хочу?

Иными словами, ваши претензии к Xaraya распространяются на Wordpress? Если да — то я слегка обескуражен. Если нет — при чем тут Zend?
0
Prometheus #
>>А если умею, но не хочу?
Не хотите и дальше, только не нужно писать про MVC в xaraya.
И не нужно путать CMS и Framework — совершенно разные вещи.

Ваша xaraya — это CMS.
0
matiouchkine #
Хорошо, не буду. Ни писать, ни путать. Спасибо, что открыли глаза.
+5
tzlom #
убогий шаблонизатор
ЧПУ потерялось, формы размазаны, список модулей организован неудачно, мелкие огрехи

вообщем очередная CMS толком ни на что не пригодная
–6
matiouchkine #
Приведите, пожалуйста, пример хорошего шаблонизатора.

Куда потерялось ЧПУ, можно узнать? Что значит «формы размазаны, список модулей организован неудачно, мелкие огрехи» — мне не хватило интеллекта понять.

В общем, пока все, кто высказался негативно, имеют склонность писать «вообщем», вместо «в общем» — как суррогат объективной критики, видимо.
+1
Kicker #
«Куда потерялось ЧПУ, можно узнать?» — это нужно у Вас спросить xaraya.org/index.php?module=dynamicdata

«Приведите, пожалуйста, пример хорошего шаблонизатора.» — каждому свое, tzlom высказал свое мнение

Мое мнение — всё, начиная с дизайна заканчивая шаблонизатором, еще слишком сырое. Особо хочу выделить дизайн демо сайта — он Вам самому то нравится?
0
matiouchkine #
Я написал, возможно — недостаточно подробно, что каждый модуль сам отвечает за решение о предоставлении ЧПУ. В админке за это отвечает модуль base.
xaraya.org/index.php?module=base&type=admin&func=modifyconfig — если включить тут «Поддержку коротких URL», то внезапно начинает работать xaraya.org/index.php/dynamicdata. Как убрать из адреса /index.php/ — можно легко сообразить (могу написать отдельно).

Дизайн сайта мне не нравится, но к движку как таковому он имеет весьма опосредованное отношение, насколько могу судить. Возможно, он призван подстегнуть написать свою тему, не берусь думать за создателей.
xaraya.com — на том же движке, и там дизайн мне более симпатичен.

Слова «сырое», «убогое» и «не пригодное» — мне не кажутся конструктивной объективной критикой. Про «сырость» — судить вообще странно, не покатав на сайтах с 10000+ уников в день, хотя бы.
0
socialNoob #
1. простой XSLT был бы предпочтительней. (это если предпочитаете использовать XML для формирования страниц)
Но здесь, я так понял, идет прекомпиляция в PHP. И здесь лидер, конечно же, smarty — его поддерживает подавляющее большинство IDE, он прост в отладке и еще куча других преимуществ. Смысл изобретать велосипед.

2. xaraya.org/index.php?module=dynamicdata&func=view&itemtype=2 — это не ЧПУ ни капли. Я понимаю, что самим можно настроить .htaccess и и сделать что-то вроде xaraya.org/dynamicdata/view/2/, или, что было бы идеально xaraya.org/dynamicdata/view/sample_data/. Но хочется чтобы эти вещи были «из коробки» или хотя бы настраивались из админки.

3. при клике на пункт меню постоянно обновляется страница. Во времена повсеместного распространения AJAX и удобных интерфейсов это выглядит убого и очень неудобно в обращении.

Вообще, при использовании данной CMS у меня возникло ощущение, что я вновь попал в 2005 год, все такое же медленное, внешний вид, никакого Drag & Drop и удобных способов настройки.

–1
matiouchkine #
1. Мы все-таки про CMS, а не про фреймворк. Образно говоря, на мой вкус, Xaraya — это CMS с возможностью вырасти во фреймворк, а Smarty — это фреймворк, на котором придется написать CMS.
2. Оно есть из админки.
3. Угу, это есть. Но я (NB! лично я) мало хожу по пунктам меню, я меняю шаблоны.

Я согласен с вами, да. С одной стороны. С другой стороны — я файловым менеджерам предпочитаю консоль, возможно, дело в этом.
0
socialNoob #
Смарти — далеко не фреймворк. Аргументирую:
1. Не навязываются стандарты кодирования.
2. Экспортируется минимальный набор функций.
3. Независим от остальных элементов реализации системы.

Увидел, но разрешать каждому модулю делать что он хочет — не очень хорошая идея. Сказать «пусть будет так и никак иначе» было бы
1. проще со стороны реализации
2. проще для программистов, которые пишут модули (не нужно думать о том, чтобы реализовывать ЧПУ)
3. Проще в отладке, т.к. в случае возникновения проблем файл с ошибкой можно быстро локализовать, а не разбираться в реализации ЧПУ отдельно взятого модуля.

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

ЗЫ: Мне все равно, командная строка или GUI, мне надо чтобы было удобно.

0
matiouchkine #
2. Отвечает за решение о представлении, а не за имплементацию.

Да, я согласен, что такой интерфейс вызовет уныние при необходимости развития каких-либо новых возможностей. Но уж никак не могу согласиться с «Вы будете вынуждены работать хелпдеском и по сто раз объяснать, как добавить товар или вбить поле в каталог» — я просто однажды напишу очень удобный интерфейс для этого.
0
socialNoob #
Тогда лучше было бы подождать когда «однажды» наступит, а не выкладывать сырую версию на суд ощественности
0
tzlom #
ваш шаблонизатор это тупо php код в непривычной и бессмысленной обёртке
вместо то чтобы его реализовывать было бы проще реализовать функцию подгрузки шаблонов и скинуть шаблоны на чистый PHP, я не вижу никакого смысла прятать if внутрь XML тегов, зато подозреваю что HTML шаблоны не совместимые с XML под вашу CMS писать нельзя

как организовать заполнение и отправку форм? с рассылкой по email?
–1
matiouchkine #
Шаблонизатор не мой, это во-первых. Во-вторых я просил пример, а не ваши соображения, по поводу того, каким он должен быть.

Заполнение и отправка форм с рассылкой по e-mail прекрасно реализованы (см. модуль Mail). В представлении лежит форма, контроллер ее обрабатывает.
+1
PQR #
Давно когда-то работал c Xaraya во времена беты первой версии. Тогда CMS выглядела перспективно, но грянула «эпоха веб 2.0» и она сразу устарела на мой вкус — никакого ajax, никакого js, всё как-то очень статично. Предполагаю, что на данном этапе разработчики каким-то образом добавили динамики в пользовательский интерфейс, но всё это должно быть костыли, которые, скорее всего, пытается решить вторая версия CMS.

По поводу обзора, хотелось бы больше сравнения с другими CMS, какие «киллер фичи» (про каскадные шаблоны на XML понял, но хочу больше фич!), какие слабые места…

Наконец какую-нибудь статистику и истории успеха!
0
matiouchkine #
Я постараюсь, да. Ajax и JS, разумеется, решены, и не костылями — они нативно вписались в оригинальную модульную схему. Про киллер-фичи — тоже есть, что сказать. Если окончательно не заминусуют — я раскрою тему.
0
matiouchkine #
Я, к сожалению, совсем не специалист по созданию сайтов, чтобы сделать релевантное сравнение с другими CMS.

Меня лично очень радует вот что:
— хуки (каждый модуль может зарегистрировать хук на какой-нибудь event; а админке можно «прихучить»один модуль к другому); когда мне потребовался кросс-постинг в Lj — я написал модуль буквально за полчаса, потом указал модулю «articles» вызывать хуки моего модуля после «add article» и получил готовый, легко отстегивающийся кросс-постинг с отдельным оформлением для каждого типа публикаций; так же я вставляю жж-уродцев перед именем пользователя жж (другой модуль с хуком на articles заменяет [lj username] на правильный контент.
— возможность прозрачных вызовов API других модулей (так я строю, например, список заметок с теми же ключевыми словами, что у показываемой).
— возможность быстро написать сколь угодно сложное представление лент (например, сверху крупная заметка типа «статья», под ней — две колонки «записей из блога», затем — пять фотографий).
— полная обособленность моих модулей от core.
— Прекомпилированные шаблоны и возможность указать время протухания для каждого шаблона в отдельности (ну и оптом, разумеется, тоже).

Не исключаю, что все это давно существует во всех остальных CMS; я недавно упомянул Xaraya и меня попросили про нее рассказать. Я не претендую на то, что она чем-то лучше.
+1
megahertz #
Бегло посмотрел код. Что не нравится:
— Много глобальных констант и переменных
— Процедурный стиль и ООП вперемешку
— Нет единой системы наименования классов
— Лишний функционал в index.php
— Не нравится шаблонизатор, имхо стандартными средствами PHP при наличии готовых хелперов намного приятнее. Но это субъективное мнение, никому его не навязываю)
— Передача структур в виде ассоциативных массивов вместо объектов
— Везде "?>"
— В целом, не чувствуется единой организации кода, с ходу мало в чем разобраться можно

Все это субъективно и после поверхностного ознакомления, может в чем-то я ошибаюсь. В общем, никаких преимуществ перед популярными фреймворками нет. Если рассматривать как CMS, то код все-же получше большинства популярных открытых решений, но зато админка в таких CMS как правило красивее и понятнее.
0
matiouchkine #
Да, согласен фактически со всем.

Меня, в основном, привлекает то, что CMS обычно мало позволяет сделать «за рамками» идеологии, а фреймворк — требует дублирования кода из предыдущего проекта. А тут — как бы CMS, но когда надо — почти фреймворк.
+1
zupernintendo #
Xarya (читается «Харя») — просто еще одна ненужная CMS.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.