Задача: сделать модуль с новостями и вывести одну новость на главной странице сайта.
С целью учебного упрощения договоримся, что на главной странице выводится только заголовок, дата публикации и текст новости. HTML-источник должен выглядеть следующим образом:
Прежде всего создадим модуль, в котором у нас будут храниться узлы новостей: один узел – одна новость. Узлы всегда существуют в рамках модуля, не может быть узлов вне модуля.
Рисунок 1
Общая схема редакторского интерфейса
Для того, чтобы создать новый модуль, в дереве проектов (см. Рис. 1) раскройте пункт дерева, обозначающий ваш проект, щелкните правой кнопкой мыши на появившемся пункте "Модули" и выберите в появившемся контекстном меню пункт "Добавить модуль". В появившейся справа форме "Создать модуль" заполним следующие поля:
Название – системное название модуля. Название должно соответствовать стандарту на системные названия XS2. Мы назовем наш модуль news.
Псевдоним – это свободное название модуля, более удобное для понимания человеком. Именно оно показывается в редакторском интерфейсе XS2. В нем можно использовать любые символы. Псевдоним является необязательным свойством модуля. Если он не задан, в интерфейсе будет показываться системное название модуля. Мы дадим нашему модулю псевдоним "Новости".
Описание – произвольный текст, описывающий модуль. Это поле необязательно и служит исключительно для справки.
Нажав на кнопку "Сохранить", мы увидим, что новый модуль появился в дереве проектов в подпункте "Модули" нашего проекта. Обратите внимание, что каждый проект имеет свой набор модулей.
Теперь нам необходимо сделать так, чтобы в модуль "Новости" можно было добавлять узлы-новости. Нам нужно, чтобы у каждой новости был заголовок, дата публикации и текст. Щелкнем правой кнопкой на только что появившемся в дереве проектов пункте "Новости" и в появившемся контекстном меню выберем пункт "Добавить тип". Здесь необходимо сделать небольшое теоретическое отступление:
Что такое тип? Тип – это описание свойств, отличающих одни виды узлов от других. Например, наши узлы-новости относятся к типу "Новость", и этот тип содержит указание на то, что у любого узла, описываемого им, есть название, дата публикации и текст. Таким образом, когда мы говорим "узел типа "Новость"" мы имеем в виду такой узел, который описан типом "Новость". Те, кто знаком с объектно-ориентированным программированием (ООП), наверняка, заметили, что связка тип – узел очень похожа на классическую связку класс – объект. Действительно, тип и узел соотносятся так же, как в классических объектно-ориентированных языках соотносятся класс и объект.
Тип также можно сравнить с образцом, а узел с конкретным предметом, изготавливаемым по этому образцу. Таким образом становится очевидным, что не описав тип, мы не можем создавать узлы.
Итак вернемся к практике. В появившейся справа форме мы заполним следующие поля:
Название – системное название типа. Оно должно соответствовать стандарту на системные названия XS2. Мы назовем наш тип "news_post".
Псевдоним – как и в случае с псевдонимом модуля, это удобное для пользователя название типа. Мы назначим нашему типу псевдоним "Новостное сообщение".
Остальные поля в секции "Основные свойства типа" мы пока пропускаем. В секции "Дополнительные свойства типа" мы видим три поля: "Идентификатор", "Имя узла", "Видимость". Эти свойства обязательно присутствуют в любом типе. Их системные названия: "NodId", "NName" и "NFlag". В отношении этих полей мы можем изменять только их псевдонимы. Для новости нам удобно использовать поле "Название" для хранения заголовка, поэтому зададим ему псевдоним "Заголовок".
Теперь добавим в тип остальные поля новости. Начнем с поля "Дата публикации". Для этого нажимем кнопку "Добавить поле" – в списке дополнительных свойств появится новая строка, в которой нам необходимо задать следующие характеристики поля:
Название – системное название поля, соответствующее стандрату на системные имена XS2. Мы назовем наше поле "Date".
Псевдоним – удобное для пользователя название поля. В нашем случае мы дадим ему псевдоним "Дата публикации". Это поле необязательно для заполнения.
Тип – тип данных, которые будут хранится в этом поле. Здесь снова необходимо сделаем небольшое теоретическое отступление.Тип поля – это указание на свойства данных, для хранения которых предназначено поле. Эти свойства, в частности, определяют, как физически будут хранится данные поля в базе данных, как будет происходить сортировка и поиск по этому полю, как будет выглядеть это поле в интерфейсе радактора, в какой форме данные можно загружать в это поле (файл, текст, url и т.п.) и многое другое. В XS2 имеется заранее заданный набор типов полей. Подробнее о каждом из типов см. Типы полей.Для нашего поля "Дата публикации" подходит два из имеющихся в списке типа поля: "date" и "datetime". Оба этих типа позволяют хранить данные о дате, разница между ними состоит лишь в том, что "date" хранит только день, месяц и год, в то время как "datetime" еще и час, минуту и секунду. Мы выберем для нашего поля тип "datetime", как более полный.
Остальные характеристики поля ("По умолчанию", "Обязательное поле") мы пока пропустим.
Аналогичным полю "Дата публикации" способом мы добавляем поле "Текст". Зададим ему системное название "Text", псевдоним "Текст" и тип "html". Теперь можно нажать кнопку "Сохранить". В дереве проектов в модуле "Новости" должен был появится только что созданный тип "Новостное сообщение". Теперь мы можем добавлять узлы типа "Новость". Попробуем создать наш первый узел.
Для того, чтобы добавить узел, в дереве проектов щелкнем правой кнопкой мыши на модуле "Новости" и в появившемся контекстном меню выберем пункт "Загрузить".
Небольшое отступление: при щелчке левой кнопкой на любом пункте дерева проектов выполнится первое по счету действие из контекстного меню данного пункта. Таким образом, команду "Загрузить" на модуле можно выполнить просто левым щелчком мыши на модуле.
В дереве модуля (см. Рис. 1) откроется пока еще не содержащий ни одного узла модуль "Новости". Для того, чтобы добавить узел, щелкнем правой кнопкой на корневом узле модуля и выберем пункт "Добавить узел". При этом справа откроется форма для добавления нового узла типа "Новость". Как видим, в форме присутствуют помимо обязательные для всех узлов полей ("ID объекта", "Заголовок", "Видимость объекта") и те поля, которые мы описали в типе: "Дата публикации" и "Текст". Установим у узла поле "Видимость объекта" в состояние "узел виден" (в противном случае узел не будет показываться на сайте), зададим заголовок новости, а также заполним поля "Дата публикации" и "Текст". Обратим внимание, что для поля "Дата публикации" система предлагает выбрать дату с помощью специального элемента управления "Календарь", а для поля текст в интерфейсе показывается удобный WYSIWYG-редактор. Такое поведение полей определяется их типом ("datetime" и "html" соответственно). Нажав кнопку "Сохранить", мы увидим, что в дереве модуля в корневом узле появился новый узел типа "Новость". В правой панели только что созданный узел доступен для редактирования. Обратите внимание, что в поле "ID объекта" появился идентификатор. Это автоматически присваиваемый номер узла – по нему можно легко найти конкретный узел в модуле. Номер узла уникален в рамках одного модуля. Сохраните или запомните этот номер – он понадобится нам через пару абзацев.
Итак мы создали модуль, тип и узел данного типа. Теперь мы можем приступить к основной части задачи – выводу созданного узла на главной странице сайта.
Вспомним, что для вывода объектов на страницах сайта служат методы. Грубо говоря, для того, чтобы создать страницу на сайте (часто, не одну страницу, а целую группу однотипных страниц), необходимо создать метод, который ее формирует. В XS2 существует договоренность, что метод, который выводит главную страницу сайта, имеет название index и прикрепляется непосредственно к пункту проекта в дереве проектов.
В дереве проектов щелкните правой кнопкой на пункте, обозначающем ваш проект, и в появившемся контекстном меню выберите действие "Методы". Справа откроется пустой список методов. Нажмите кнопку "Добавить". В открывшемся окошке необходимо указать имя метода, которое должно соответствовать стандарту на системные названия XS2 (в нашем случае это index). Далее необходимо указать в полях "Шаблон" и "Процессор" файлы на локальном диске. Мы можем создать с помощью любого текстового редактора (например, Notepad) пустой файл с произвольным названием (например, index.htm) и выбрать его в поле "Шаблон". Для решения нашей задачи нам не понадобится процессор, поэтому поле "Процессор" мы оставим пустым. Подробно о том, как соотносятся шаблоны и процессоре, см. Глава 5. Теперь можно нажать кнопку "Ок". В списке методов должен был появится метод с названием "index", в графе "Шаблон" у него должен быть указан "+", а в графе "Процессор" — "-".
Теперь нам необходимо написать код шаблона. Для этого щелкнем правой кнопкой на методе "index" в списке. В открывшемся окне выберем действие "Редактировать" и нажмем кнопку "Ок". Откроется окно для редактирования кода шаблона. Для того, чтобы вывести новость на странице, наберем следующий код:
В строке №6 в параметре "NodId" вместо "2" необходимо указать номер объекта типа "Новость", который мы только что создали. Давайте разберем нехитрый код нашего шаблона поподробнее. Он представляет собой смесь обычного HTML и инструкций шаблонного языка Smarty. Подробнее о синтаксисе Smarty можно прочитать в документации Smarty, здесь же мы поясним лишь следующее:
Строка №6 {xs2GetNode mod="news" NodId=2 var="my_news_post"}
Мы выбираем в смарти-переменную $my_news_post узел из модуля "news" с идентификатором 2.
Строки №№8,9,11 {$my_news_post.<…>}
Мы выводим содержимое полей "NName" ("Заголовок"), "Date" ("Дата публикации") и "Text" ("Текст"), обращаясь к ним по системным именам.
Теперь мы можем сохранить шаблон метода и наконец-то посмотреть результат на сайте. Для того, чтобы увидеть результат выполнения метода "index", просто наберите в адресной строке браузера адрес вашего сайта (URL, указанный в поле "Домен проекта" при создании проекта.). Вы должны увидеть заголовок, дату и текст созданной вами новости.
Поздравляем! Вы только что прошли весь цикл от проектирования структуры данных до изготовления страницы сайта. Конечно, ваш путь был максимально упрощен, но, тем не менее, даже при создании сложных веб-приложений, вы все равно раз за разом будете проходить именно его. Различаться будет лишь количество создаваемых модулей, типов и узлов, а также сложность кода методов. Ваша первая страница на XS2 сделана.