h3> selectedxsl:text> xsl:attribute> xsl:if> span> a> li> xsl:for-each> ul> div> xsl:template> xsl:stylesheet>* This source code was highlighted with
Source Code Highlighter.
Обработка основана на атрибутах документа. При этом есть системные атрибуты, общие для всех документов, например, nodeName (имя документа), level (уровень вложенности) и id (числовой идентификатор любого документа в ветке сайта, по нему устанавливаются связи документов). Кстати, что удобно, ссылки можно строить с использованием имен документов. Т.е. если на сайте есть узел «стулья», а в нем расположен документ «табуретка обычная», то мы можем использовать следующий URL:
http://сайт/стулья/табуретка-обычная.aspx Более того, такая задача, равно как и ряд других, уже решены в библиотеке Umbraco. В показанном выше примере это делается следующим образом:
href="{umbraco.library:NiceUrl(current()/@id)}"
До кучи стоит сказать, что в шаблонах мы можем подключить все необходимые стили и скрипты JS, учитывая их в том же XSLT. Конечно, обработка AJAX-обращений к серверу потребует дополнительных усилий, но при этом разработчики не обязывают, использовать ли jQuery или прибегнуть к AJAX ASP.NET.
Использование контролов и вообще дополнительных сборок, т. е. работа в Visual Studio нужна только для реализации какого-то дополнительного функционала, который не укладывается в сам движок и работу с документами. Тому примеры: рассылка писем, обращения к внешним системам.
Чтобы работа с такими дополнительными сборками была максимально эффективна, модули не просто могут подцепляться в шаблонах и работать согласно стандартному жизненному циклу ASP.NET, но и их публичные свойства могут определяться Umbraco и использоваться для передачи модулю информации из шаблона.
Для этого нужно сделать несколько простых действий. Сначала, объявить сами свойства (для примера небольшая часть кода):
public string EmailTo
{
get
{
return _EmailTo;
}
set
{
_EmailTo = value;
}
}
public string EmailSubject
{
get
{
return _EmailSubject;
}
set
{
_EmailSubject = value;
}
}
public string EmailBody
{
get
{
return _EmailBody;
}
set
{
_EmailBody = value;
}
}
* This source code was highlighted with
Source Code Highlighter.
Далее, после подключения модуля, нажать Browse Properties и выбрать те свойства, которые должны задаваться на страницах.
После этого можно указывать значения этих свойств прямо в шаблоне, в качестве значений передавая конкретные значения или алиасы полей документа, которые будут вычисляться для передачи:
EmailBody="[#emailBody]" EmailReplyFrom="[#emailReplyFrom]"
EmailReplySubject="[#emailReplySubject]" EmailReplyBody="[#emailReplyBody]"
EnableSSL="[#enableSSL]" FormHeader="[#headerText]" FormText="[#formText]"
ThankYouHeaderText="[#thankYouHeaderText]"
ThankYouMessageText="[#thankYouMessageText]"
Alias="CWS_ContactForm" runat="server">umbraco:Macro>
* This source code was highlighted with
Source Code Highlighter.
А далее к моменту загрузки контрола для обработки событий и его рендеринга эти свойства будут определены, и их можно будет использовать как для работы с API Umbraco, так и для собственных нужд.
Итог
В Umbraco живёт и здравствует принцип: создал раз, используешь часто. Основной ориентир на работу с документами здесь дополнен потрясающей лёгкостью разработки. Но есть одно важное условие: нужно хорошо представлять работу самого ASP.NET, т. к. система лишь дополняет и очень качественно использует эту платформу. Если с этим всё в порядке, остаётся только для каждого конкретного проекта поддерживать общие архитектурные принципы для поддержания единообразия используемых решений.
Большая часть действий может быть выполнена в админке. А когда необходимая структура и функционал готовы, все составляющие можно упаковать в отдельный модуль (здесь это package) для распространения и установки на других серверах.
Проблемы
У этой системы есть только две проблемы настроечного плана, которые устранимы, хотя в некоторых случаях могут доставить немало проблем. Во-первых, работает Umbraco только в корневом узле. Единственный способ обойти это ограничение заключается в создании поддомена. Не всегда это подходящий вариант.
Другая проблема в конфиг-файле. Блоки конфигурационных файлов в ASP.NET наследуются от узлов более высокого уровня вложенным узлам. Это легко
исправимо для раздела : делаем для этого узла обертку location с атрибутом inheritInChildApplications=«false». Но для блока лёгкого пути нет. В моём случае проблема возникла со ScrewTurn Wiki. Эта вики, как и Umbraco, использует одни и те же AJAX-расширения, но разные их версии. Т.е. подключаемые модули одной системы подключаются и к другой, что вырубает её. Перестраиваю всё под wiki, получаю отруб корневой системы. Единственный способ обойти эту проблему состоит в создании отдельного домена для проблемного приложения.
Оставшиеся вопросы
Я еще не успел рассмотреть вопрос локализации, однако могу сказать, что словари его решают. В нужных местах шаблонов можно указывать нужные ключи словарей, а определение локали пользователя лежит на браузере и ASP.NET в паре с дополнительной доработкой функционала. Впрочем, я ещё не пощупал, как подключать новые языки.
Также я не успел изучить работу с пользователями. В системе предусмотрены отдельно пользователи админки и зарегистрированные участники сайта. Umbraco предоставляет модель работы с ролями и доступами. Скорее всего, каркас даёт всю нужную информацию, как шаблонам, так и макросам. Но опять же: надо пробовать. В ближайшее время разберусь с этим, т. к. предстоит обеспечить интеграцию Umbraco с Active Directory. Кстати, для AD нужный провайдер существует и
настройка весьма проста.
Back- и Front-Office
Пока не могу точно сказать, как лучше распределять функционал работы с документами между админкой и самим сайтом. Но пока считаю, что вешать всё на административную часть неправильно: всё, что касается пользовательского функционала, должно быть на самом сайте, тем более есть все возможности использовать API для работы с документами. Но для небольшого числа относительно сообразительных юзеров подойдёт и сама админка. Расширяемость этой части я пока не изучал.
Creative Website Starter
Знакомство с Umbraco было для меня особенно ускорено изучением и доработкой под свой сайт набора Creative Website Starter (
CWS). В процессе раскопок в файлах этого модуля до меня и дошёл непривычный дзен разработки в этой системе. Я особенно упорно пытался найти скрипты для БД прежде, чем до меня дошло, как там надо работать с данными.
Дополнение от 12 февраля 2010
Проработав с Umbraco уже почти полгода, ни чуть не разочаровался. Все делается очень просто.
Для добавления новых элементов админки, создаются простые ascx-файлы с деталями интерфейса и вместе с кодом закидываются в каталог usercontrols/dashboard. Обработка данных внутри может быть какой угодно, но самое главное: надо предусмотреть и связать эту логику с каким-то дополнительным контролом самого сайта. Приведу пример. Пользователь заполняет форму на странице. Контрол, отвечающий за ее сохранение, отправляет все в какую-то дополнительную таблицу в базе сайта, или в общий xml-файл. Чтобы админ смог прочитать обращение пользователя, надо добавить контрол, который по такой же логике прочитает и выведет сохраненное ранее обращение пользователя. Все очень просто и пример можно подсмотреть в том же CWS.
Другой момент - стандартная обработка каких-то документов. Для этого создается обычный cs-файл, в котором прописываются обработчики событий и привязываются к документной модели. Привязка делается в событии Page_Load, а обработчики должны соответствовать определенной сигнатуре. Файл должен быть размещен в каталоге App_Code корневого узла сайта. Одновременно можно держать несколько файлов. Есть
простой пример привязки обработчика на сайте Umbraco. Типы событий можно подсмотреть в объектной модели в Visual Studio. В проекте потребуется поставить ссылки на несколько основных библиотек CMS: businesslogic.dll, cms.dll и umbraco.dll. И ещё одно: в настоящее время есть очень неприятный баг умбрако, в результате которого Before-события выполняются всегда после изменения документа, поэтому использовать пока надо только After.
Notas del Terrible.