Pull to refresh

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

Reading time6 min
Views2K
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 свалившихся минусов в карму.
Ну и сидите без ссылки ;-)
Tags:
Hubs:
Total votes 25: ↑7 and ↓18-11
Comments27

Articles