Введение в технологии создания Интернет-узлов

Разработка шаблонов оформления (skins) для DNN

Разбить на страницы
Показывать лекцию целиком

Теоретическое введение

Понятие шаблона оформления (skin)

Архитектура шаблонов оформления в DNN позволяет профессиональным web-дизайнерам создавать пользовательские интерфейсы, которые легко интегрируются с приложением-порталом, создавая визуально привлекательные web-сайты.

Термин "шаблон оформления" (skin) относится к архитектуре программного обеспечения, которая предоставляет управляемый способ отделения логики приложения и контента от его представления. Абстрактные понятия формы и функции целесообразно рассматривать в виде двухуровневой модели представления.

Преимущество технологии шаблонов оформления состоит в том, что логика приложения и внешний вид web-страницы могут разрабатываться и модифицироваться независимо. Разработчик программного обеспечения и web-дизайнер могут работать параллельно, без риска повлиять на деятельность друг друга.

Однако технология шаблонов оформления имеет свои недостатки. Процесс слияния многочисленных файлов в одну страницу может вести к существенному снижению быстродействия. Кроме того, разработчики должны быть оповещены о необходимости разделять логику приложения и средства визуализации результатов его работы.

Технология создания шаблонов оформления в DNN

Абстрагирование пользовательских элементов управления от страницы может реализовываться при помощи нескольких стратегий. Каждая из них неизменно включает определенный уровень синтаксического разбора для слияния уровней представления и бизнес-логики.

Одна из популярных техник, используемая в скриптовых языках, заключается в применении токенов, или идентификаторов в файлах пользовательского интерфейса для представления динамической функциональности.

Несмотря на то, что элементы управления ASP.NET представляют собой мощную концепцию, они появились сравнительно недавно и используются только на платформе Microsoft. Некоторые инструментальные средства, такие как MS Frontpage и Dreamweaver, имеют встроенную поддержку этих элементов управления. Однако многие профессиональные web-дизайнеры по разным причинам эту технологию не используют. Одной из таких причин является то, что пользовательские элементы управления содержат ссылки на серверные элементы управления, и существует опасность, что web-дизайнер исказит или удалит соответствующий элемент управления.

Поэтому при разработке технологии шаблонов оформления в DNN была применена наиболее универсальная технология. Такой технологией является HTML. Основной проблемой HTML является его статичность. Поэтому web-дизайнерам была предоставлена возможность включения в HTML-разметку заполнителей (placeholders), которые предназначены для представления динамической функциональности. Это обеспечивает возможность абстрагирования формы и функции.

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

Заполнители представляют собой фрагменты текста вида [Token], включенные в HTML-разметку. Чтобы устранить задержку в быстродействии, связанную с обработкой заполнителей в процессе выполнения, механизм загрузки шаблона оформления производит замену заполнителей пользовательскими элементами управления ASP.NET, которые и обрабатываются в дальнейшем ядром системы управления контентом.

В терминах расположения элементов, DNN использует подход, предполагающий возможность произвольного расположения элементов на странице. Для добавления модулей с контентом дизайнер может определить произвольное количество панелей содержимого, которые могут быть связаны со сведениями о размещении модулей, хранящимися в БД. Этот подход гарантирует максимальную гибкость.

Организация файлов

Шаблоны оформления могут быть применены на уровне узла, портала или страницы. Они также могут применяться на уровне модулей. В этом случае они называются контейнерами. Все файлы шаблонов оформления хранятся в каталогах порталов. Специальный подкаталог _default используется для обозначения дерева каталогов узла. Каждый портал имеет собственное дерево каталогов, имя которого соответствует его идентификатору ID в БД. Эта структура централизует требование прав доступа на запись, которое применяется к единственному каталогу в структуре сайта (рис. 14.1).

(рис 14.1) Организация каталогов порталов

Каталоги Skins и Containers могут содержать неограниченное количество подкаталогов, каждый из которых представляет собой набор файлов, необходимый для визуализации шаблона оформления или контейнера. Названия подкаталогов соответствуют названию шаблонов оформления.

Обработка страницы

DNN использует единственную ASPX-страницу default.aspx для визуализации всех элементов управления и содержимого. Этот подход обеспечивает следующие преимущества:

  • централизация всей логики управления пользовательским интерфейсом на одной странице;
  • уменьшается количество входных точек приложения, что позволяет построить более безопасное решение.
  • Страница default.aspx содержит очень ограниченную логику - она включает код для управления элементом страницы <head> и содержит заполнитель для шаблона оформления.

    Когда пользователь первый раз обращается к приложению DNN, оно анализирует URL и заголовок запроса, чтобы определить, какой шаблон оформления следует использовать. В ходе этого процесса осуществляется запрос к таблице БД Skins, в которой хранятся сведения обо всех шаблонах оформления и контейнерах. Снижение быстродействия из-за обращения к БД компенсируется кэшированием объектов данных на уровне ядра системы управления контентом.

    После того, как шаблон оформления выбран, динамически загружается соответствующий пользовательский элемент управления, который добавляется на страницу вместо заполнителя. Каждый пользовательский элемент управления ссылается на файл кода skin.vb, который хранится в каталоге admin\Skins. Этот файл осуществляет всю обработку шаблонов оформления для поддержания безопасности и внедрения контента.

    Пакет шаблона оформления

    Пакет шаблона оформления состоит из многочисленных файлов:

  • файлы *.htm, *.html - файлы определения шаблона оформления, которые обрабатываются загрузчиком шаблона оформления для получения файла .ascx ;
  • файлы *.ascx - пользовательские элементы управления, определяющие шаблон оформления, в формате, который использует ядро шаблонов оформления;
  • файлы *.css - каскадные таблицы стилей, связанные с шаблонами оформления;
  • *.gif, *.jpg, *.png, *.jpeg - вспомогательные файлы графики;
  • *.* - другие файлы ресурсов, требуемые для шаблона оформления (обратите внимание, что расширения файлов, доступных для загрузки, контролируются настройками компонента File Upload на уровне узла).
  • Требуемые файлы упаковываются в zip -архив.

    Структура каталогов шаблона оформления

    Рекомендуется размещать файлы шаблона оформления согласно следующей структуре каталогов:

    \Skins\SkinName\...

    где SkinName - название создаваемого шаблона оформления. В этом каталоге создаются zip -архивы для последующего распространения шаблона оформления.

    \Skins\SkinName\containers - каталог для размещения файлов контейнера.

    \Skins\SkinName\skins - каталог для размещения файлов шаблона оформления.

    Пример размещения файлов шаблона оформления с названием DNN приведен на рис. 14.2.

    (рис 14.2) Структура каталогов для шаблона оформления DNN

    Способы создания шаблона оформления

    Шаблоны оформления DNN могут быть созданы двумя способами - HTML или ASCX (при помощи пользовательских элементов управления). Вариант HTML больше подходит для web-дизайнеров, не знакомых с технологией ASP.NET. Для ASP.NET-разработчиков, использующих Visual Studio, оптимальным является использование способа ASCX. Основное различие будет состоять в расширении получающегося файла и использовании токенов вместо пользовательских элементов управления.

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

    Графика в шаблонах оформления

    Произвольная форма шаблонов оформления в DNN открывает свободу для творчества. Дизайнеры обычно создают прототипы шаблонов оформления как графические файлы с использованием таких приложений, как Adobe Photoshop. При создании шаблонов оформления следует включать в них элементы пользовательского интерфейса, такие как меню сайта и ссылки для входа на сайт. Поскольку ядро портала внедряет в шаблон оформления динамическое содержимое в процессе работы, следует оставлять место для соответствующего контента.

    После создания графического прототипа он разрезается на части, которые помещаются в ячейки HTML-таблицы. Получаемая HTML-разметка должна быть правильно сформирована. Это означает, что все HTML-тэги, являющиеся контейнерами, должны иметь соответствующий закрывающийся тэг. Все атрибуты тэгов не должны иметь пробелов вокруг знака " = ". Значения атрибутов должны указываться в двойных кавычках. В обычной ситуации профессиональный WYSIWYG-редактор генерирует правильно сформированную разметку, но его настройки могут быть изменены, поэтому необходимо проверить получаемую HTML-разметку.

    Панели контента в шаблонах оформления

    При создании шаблона оформления используется концепция панелей контента. Панели контента являются контейнерами для модулей контента, которые автоматически добавляются в них во время выполнения. Панели контента представляют собой HTML-тэги с некоторыми специфическими пользовательскими атрибутами, позволяющими им взаимодействовать с ядром DNN. В качестве панелей контента могут использоваться HTML-тэги <td>, <div>, <span>, и <p>. Должна присутствовать, по меньшей мере, одна панель контента, которая должна называться " Content Pane ". Панели контента могут располагаться в любом месте страницы. Панели контента являются свертываемыми - если во время выполнения в них не было добавлено ни одного модуля, то они становятся невидимыми. Для их добавления используется токен [CONTENTPANE].

    Объекты шаблонов оформления используют концепцию именованных экземпляров. Например, если необходимо использовать два элемента управления типа "меню", то они задаются токенами [MENU:1] и [MENU:2]. В том случае, если требуется только один экземпляр объекта, то он задается без цифр: [MENU].

    Атрибуты объектов шаблона оформления

    Объекты шаблона оформления также могут иметь атрибуты, которые позволяют настроить внешний вид объекта в шаблоне. Каждый объект имеет собственный набор атрибутов. Если создается ASCX-шаблон оформления, то атрибуты должны быть указаны непосредственно в файле шаблона (например, <dnn:Login runat="server" id="dnnLogin" Text="Signin" / ). При создании HTML-шаблона спецификация атрибутов должна включаться в специальный файл. Пакет шаблонов оформления может содержать глобальную спецификацию атрибутов, в виде файла skin.xml для шаблона и container.xml для контейнеров, которая применяется для всех шаблонов и контейнеров в пакете. Имеется возможность переопределения глобальной спецификации атрибутов в файле skinfilename.xml. Следующий xml-фрагмент представляет собой пример спецификации атрибутов:

    <Objects>
      <Object>
        <Token>[LOGIN]</Token>
        <Settings>
          <Setting>
            <Name>Text</Name>
            <Value>Signin</Value>
          </Setting>
        </Settings>
      </Object>
    </Objects>

    Должно существовать однозначное соответствие объявлений объектов шаблона оформления в файле шаблона (например, [MENU] ) со спецификацией атрибутов в xml-файле. Это же справедливо для именованных экземпляров. Например, если необходимо включить в шаблон оформления вертикальное и горизонтальное меню, то можно создать именованные экземпляры [MENU:1] и [MENU:2], и в xml-файле задать различные определения для их атрибутов.

    При создании нескольких панелей контента необходимо указывать значение атрибута ID:

    <Objects>
      <Object>
        <Token>[CONTENTPANE:1]</Token>
        <Settings>
          <Setting>
            <Name>ID</Name>
            <Value>LeftPane</Value>
          </Setting>
        </Settings>
      </Object>
    </Objects>

    Таблица стилей в шаблонах оформления

    DNN использует внешний способ задания таблицы стилей (CSS). Это значит, что DNN может иметь множественные ссылки на таблицы стилей на одной странице. Каждая ссылка задается в порядке приоритета, поэтому реализуется иерархическое переопределение. Иерархия следующая (каждая ссылка переопределяет предыдущую):

  • модули - стили для пользовательских модулей определяются в свойстве PortalModuleControl.StyleSheet ;
  • по умолчанию - стили, использующиеся по умолчанию на уровне узла - default.css ;
  • шаблон оформления - стили шаблона оформления - skin.css или skinfilename.css ;
  • контейнер - стили контейнера - container.css или containerfilename.css ;
  • портал - пользовательские стили, определенные администратором портала - portal.css ;
  • Пакет шаблонов оформления может содержать глобальную таблицу стилей - skin.css (или container.css для контейнеров), которая применяется ко всем файлам шаблонов в пакете. Глобальная таблица стилей может переопределяться путем задания таблицы стилей для конкретного шаблона в пакете. Соответствующая таблица стилей имеет название, совпадающее с названием конкретного шаблона оформления - skinfilename.css.

    Таблица стилей "по умолчанию" ( /Portals/_default/default.css ) содержит набор CSS-классов, которые портал использует для формирования пользовательского интерфейса.

    Публикация шаблона оформления

    Для того чтобы шаблон оформления можно было просмотреть в Галерее шаблонов оформления (Skin Gallery), необходимо создать его высококачественную экранную копию, которая должна храниться в формате JPEG с расширением .jpg и иметь то же имя файла, что и шаблон оформления (например, если шаблон оформления называется skin.htm, то экранная копия должна называться skin.jpg ).

    Упаковка шаблона оформления

    Все файлы, относящиеся к шаблону оформления, упаковываются в ZIP -архив skin.zip, а файлы контейнера - в архив container.zip. Далее оба архива упаковываются в общий архив с требуемым названием. Это позволит установить шаблон оформления и соответствующие ему контейнеры при помощи единственного файла, используя инструмент Skin Uploader.

    Создание контейнеров

    Контейнеры являются определениями шаблонов оформления, которые применяются к модулям. Контейнер создается точно так же, как и шаблон оформления, за исключением используемого набора токенов. Единственным ограничением является то, что в контейнере должен содержаться элемент управления Actions. Этот элемент управления необходим для реализации функциональности модуля. Общие функции этого элемента заключаются в возможности редактировать настройки модуля и управления размещением модуля на панелях контента. Могут также реализовываться пользовательские функции, относящиеся например, к редактированию контента модуля. В DNN включен набор элементов управления типа Actions. Элемент управления по умолчанию - SolPartActions отвечает за всплывающее меню, которое появляется при наведении мыши на иконку в левом верхнем углу модуля. Этот элемент управления предназначен для современных браузеров. Для устаревших браузеров используется элемент управления DropDownActions, реализованный в виде раскрывающегося списка.

    Несмотря на то, что шаблоны оформления и контейнеры создаются, упаковываются и распространяются независимо, дизайнер обычно создает их комбинацию, которая предназначена для совместной работы. Это реализовывается путем совместной закачки шаблона оформления и контейнера на сайт и применения их к пользовательскому интерфейсу. Чтобы упростить эту операцию и обеспечить высокий уровень модульности, используется концепция применения шаблонов оформления на уровне панелей контента. Использование шаблонов оформления для панелей может быть сконфигурировано только на этапе дизайна, при создании шаблона. Реализуется это путем использования пользовательских атрибутов, которые могут быть включены в разметку панели. Используются атрибуты ContainerType, ContainerName и ContainerSrc для идентификации контейнера, который будет использоваться для всех модулей, добавляемых на панель. В том случае, если указанный контейнер отсутствует, используется контейнер по умолчанию.

    Пример определения контейнера для панели:

    <Objects>
      <Object>
        <Token>[CONTENTPANE:1]</Token>
        <Settings>
          <Setting>
            <Name>ID</Name>
            <Value>LeftPane</Value>
          </Setting>
          <Setting>
            <Name>ContainerType</Name>
            <Value>G</Value>
          </Setting>
          <Setting>
            <Name>ContainerName</Name>
            <Value>DNN</Value>
          </Setting>
          <Setting>
            <Name>ContainerSrc</Name>
            <Value>standard.ascx</Value>
          </Setting>
        </Settings>
      </Object>
    </Objects>

    Загрузка шаблонов оформления

    Поскольку шаблоны оформления основываются на ASCX-файлах, которые, будучи добавленными на ASPX-страницу, становятся исполняемыми, существует определенный риск, связанный с возможностью включения в них вредоносного кода. По этой причине существует возможность настройки права загрузки шаблонов оформления. Это право может быть предоставлено администраторам порталов, или же зарезервировано только за пользователем host.

    Объекты шаблонов оформления

    Объекты шаблонов оформления приведены в табл. 14.1.

    Объекты шаблонов оформления
    Токен Элемент управления Описание
    [BANNER] < dnn: Banner runat="server" id="dnnBanner"> Отображает случайный рекламный баннер .
    [BREADCRUMB] < dnn: Breadcrumb runat="server" id="dnnBreadcrumb"> Отображает путь к выбранной странице в виде Название страницы 1 > Название страницы 2 > Название страницы 3
    [CONTENTPANE] <div runat= " server " id= " ContentPane " > Добавляет заполнитель для контента модуля .
    [COPYRIGHT] < dnn: Copyright runat="server" id="dnnCopyright"> Отображение информации о правах интеллектуальной собственности ( .
    [CURRENTDATE] < dnn: CurrentDate runat="server" id="dnnCurrentDate"> Отображает текущую дату .
    [DOTNETNUKE] < dnn: DotNetNuke runat="server" id="dnnDotnetNuke"> Отображение информации о правах интеллектуальной собственности DNN.
    [HELP] < dnn: Help runat="server" id="dnnHelp"> Отображает ссылку с просьбой о помощи . При ее выборе у клиента открывается почтовый клиент с заполненным электронным адресом администратора портала DNN.
    [HOSTNAME] < dnn: HostName runat="server" id="dnnHostName"> Отображает заголовок узла, связанный с .
    [LANGUAGE] <dnn: Language runat="server" id="dnnLanguage" / > Отображает раскрывающийся список, позволяющий выбрать используемый язык .
    [LINKS] < dnn: Links runat="server" id="dnnLinks"> Отображает плоское меню ссылок, связанное с текущей страницей и родительским узлом . Полезно для поисковых машин .
    [LOGIN] < dnn: Login runat="server" id="dnnLogin"> Элемент управления с двумя состояниями . Отображает .
    [LOGO] < dnn: Logo runat="server" id="dnnLogo"> Отображает логотип портала .
    [PRIVACY] < dnn: Privacy runat="server" id="dnnPrivacy"> Выводит ссылку на страницу о собственнике портала .
    [SEARCH] < dnn: Search runat="server" id="dnnSearch"> Отображает строку поиска по порталу .
    [SIGNIN] < dnn: Signin runat="server" id="dnnSignin"> Отображает элемент управления, предназначенный для ввода имени пользователя и пароля .
    [SOLPARTMENU] < dnn: SolPartMenu runat="server" id="dnnSolPartMenu"> Отображает иерархическое навигационное меню .
    [TERMS] < dnn: Terms runat="server" id="dnnTerms"> Выводит ссылку на соглашение об использовании портала .
    [TREEVIEWMENU] < dnn: TreeViewMenu runat="server" id="dnnTreeViewMenu"> Отображает иерархическое навигационное меню с использованием элемента управления Treeview.
    [USER] < dnn: User runat="server" id="dnnUser"> Элемент управления с двумя состояниями . Отображает .

    Атрибуты шаблонов оформления

    Атрибуты шаблонов оформления, которые могут использоваться в файле skin.xml, приведены в табл.7.2

    Атрибуты шаблона оформления
    Токен Атрибут Значение по умолчанию Описание
    [BANNER] BorderWidth 0 Ширина границы вокруг баннера
    [BREADCRUMB] Separator breadcrumb.gif Разделитель между ссылками в меню . Может включать ссылки на пользовательские изображения, текст или HTML (например, <![CDATA[nbsp;<img src="file.gif">nbsp;]]> )
    CssClass SelectedTab Имя таблицы стилей для ссылок в меню .
    RootLevel 1 Корневой уровень отображения ссылок в меню . Возможные значения: .
    [CONTENTPANE] ID ContentPane Идентификатор панели контента, которая будет отображаться в пользовательском интерфейсе и храниться в БД .
    [COPYRIGHT] CssClass SelectedTab Имя таблицы стилей для ссылки на страницу с информацией о правах интеллектуальной собственности .
    [CURRENTDATE] CssClass SelectedTab Имя таблицы стилей для ссылки для отображения текущей даты .
    DateFormat MMMM dd, yyyy Формат текущей даты .
    [DOTNETNUKE] CssClass Normal Имя таблицы стилей для ссылки на страницу с информацией о правах интеллектуальной собственности DNN .
    [HELP] CssClass OtherTabs Имя таблицы стилей для ссылки на помощь .
    [HOSTNAME] CssClass OtherTabs Имя таблицы стилей ссылки Host ( Powered By xxxxxxxxx )
    [LANGUAGE] CssClass Имя таблицы стилей для раскрывающегося списка выбора языка .
    [LINKS] CssClass CommandButton Имя таблицы стилей для ссылок .
    Separator nbsp;nbsp; Разделитель между ссылками . Может включать ссылки на пользовательские изображения, текст или HTML (например, <![CDATA[nbsp;<img src="file.gif">nbsp;]]> )
    Alignment Horizontal Стиль меню " Ссылки " (" Horizontal" или " Vertical" )
    Level Same Определяет отображаемый уровень меню (" Same" - тот же, " Child" - дочерний, " Parent" - родительский, " Root" - корневой)
    [LOGIN] Text Login Текст ссылки " Вход ".
    CssClass OtherTabs Имя таблицы стилей для ссылки " Вход ".
    LogoffText Logoff Текст ссылки " Выход ".
    [LOGO] BorderWidth 0 Ширина границы вокруг логотипа сайта .
    [PRIVACY] Text Privacy Statement Текст ссылки о собственнике портала .
    CssClass OtherTabs Имя таблицы стилей для ссылки о собственнике портала .
    [SEARCH] Submit Submit HTML -разметка для активации поиска (например, "Найти " или <img src= " mybutton.gif">
    CssClass Имя таблицы стилей для элемента управления " Поиск ".
    [SOLPARTMENU] separatecss true Использовать CSS, определенный в таблице стилей ( .
    backcolor #333333 Цвет фона .
    forecolor white Цвет элемента меню .
    highlightcolor white Цвет левой и верхней границы, дающий эффект подсвечивания .
    iconbackgroundcolor #333333 Цвет фона в области отображения иконки .
    selectedbordercolor Цвет границы, окружающий выбранный элемент меню .
    selectedcolor #CCCCCC Цвет фона выбранного элемента меню .
    selectedforecolor white Цвет выбранного элемента меню .
    display horizontal Способ отображения элементов меню ( .
    menubarheight 16 Высота прямоугольника меню в пикселях .
    menuborderwidth 1 Ширина границы меню в пикселях .
    menuitemheight 21 Высота элемента меню в пикселях .
    forcedownlevel false Полное отображение вложенных пунктов меню .
    moveable false Возможность перемещения меню .
    iconwidth 0 Ширина колонки с иконкой в пикселях .
    menueffectsshadowcolor dimgray Цвет тени .
    menueffectsmouseouthidedelay 500 Количество миллисекунд анимации эффекта сворачивания меню ( .
    mouseouthidedelay 1 Количество миллисекунд ожидания, после которого меню сворачивается при уводе мыши с него ( .
    menueffectsmouseoverdisplay Highlight Настройка визуального эффекта при наведении мыши на элемент меню ( .
    menueffectsmouseoverexpand true Задает необходимость разворачивания меню при наведении на него мыши .
    fontnames Arial Шрифт
    fontsize 12 Размер шрифта
    fontbold false Жирность шрифта
    menueffectsshadowstrength 3 Ширина эффекта .
    menueffectsmenutransition None Способ исчезания тени (Значения: .
    menueffectsmenutransitionlength 0.3 Количество миллисекунд, требуемое на преобразование .
    menueffectsshadowdirection Lower Right Направление, в котором будет исчезать тень (Значения: .
    menucontainercssclass MainMenu _ MenuContainer CSS-класс для контейнера меню .
    menubarcssclass MainMenu _ MenuBar CSS-класс для прямоугольника меню .
    menuitemcssclass MainMenu _ MenuItem CSS-класс для элемента меню .
    menuiconcssclass MainMenu _ MenuIcon CSS-класс для иконки меню .
    menuitemselcssclass MainMenu _ MenuItemSel CSS-класс для элемента меню, на который наведена мышь .
    menubreakcssclass MainMenu _ MenuBreak CSS-класс для разрыва в меню .
    submenucssclass MainMenu _ SubMenu CSS-класс для подменю .
    menuarrowcssclass MainMenu _ MenuArrow CSS-класс для стрелки в меню .
    … остальные атрибуты элемента .
    [TERMS] Text Terms of Use Текст ссылки соглашения об использовании .
    CssClass OtherTabs CSS-класс для ссылки соглашения об использовании .
    [USER] Text Register Текст ссылки " Регистрация "
    CssClass OtherTabs CSS-класс для ссылки " Регистрация ".

    Объекты контейнеров

    Описание объектов контейнеров приведены в табл. 14.3

    Объекты контейнеров
    Токен Элемент управления Описание
    [ACTIONBUTTON] <dnn: ActionButton runat="server" id="dnnActionButton"> Кнопка, используемая в модуле для вызова определенных действий .
    [CONTENTPANE] <div runat="server" id="ContentPane"> Вставляет заполнитель для контента модулей .
    [DROPDOWNACTIONS] < dnn: DropDownActions runat="server" id="dnnDropDownActions"> Раскрывающийся список для выбора определенных действий в модуле .
    [ICON] < dnn: Icon runat="server" id="dnnIcon"> Отображает иконку, связанную с модулем .
    [LINKACTIONS] < dnn: LinkActions runat="server" id="dnnLinkActions"> Список ссылок на действия в модуле .
    [SOLPARTACTIONS] < dnn: SolPartActions runat="server" id="dnnSolPartActions"> Всплывающее меню действий с модулем .
    [TITLE] < dnn: Title runat="server" id="dnnTitle"> Отображает заголовок модуля .
    [VISIBILITY] < dnn: Visibility runat="server" id="dnnVisibility"> Отображает иконку, означающую, свернут модуль или развернут .

    Атрибуты объектов контейнеров

    Токен Атрибут Значение по умолчанию Описание
    [ACTIONBUTTON] CommandName Тип предпринимаемого с модулем действия ( AddContent | EditContent | ContentOptions | SyndicateModule | ImportModule | ExportModule | OnlineHelp | ModuleHelp | HelpText | PrintModule | ModuleSettings | DeleteModule | ClearCache | MoveTop | MoveUp | MoveDown | MoveBottom | MovePane | MoveRoot )
    CssClass CommandButton CSS-класс для кнопки
    DisplayLink True Необходимость отображения локализованного текста команды ( True | False )
    DisplayIcon False Необходимость отображения иконок для команд ( .
    IconFile Файл, используемый в качестве иконки .
    [CONTENTPANE] ID ContentPane Ключевой идентификатор панели конента .
    [ICON] BorderWidth 0 Ширина границы вокруг иконки .
    [TITLE] CssClass Head CSS-класс для заголовка .

    Практические задания

    Разработка шаблона оформления

    В данной лабораторной работе будет разработан шаблон оформления для DNN, приведенный на рис. 14.3.

    (рис 14.3) Шаблон оформления

    Приведенный шаблон оформления следует создать в любом визуальном редакторе, таком, как MS Frontpage или MS Visual Studio. Можно использовать собственный дизайн шаблона. При создании шаблона можно использовать следующую HTML-разметку в качестве примера:

    <table style="BORDER-COLLAPSE: collapse" cellpadding="0" width="100%" height="100%" border="0">
      <tr>
        <td valign="top">
        <table style="BORDER-COLLAPSE: collapse" cellpadding="0" width="100%" border="0">
          <tr>
            <td background="tile_top.gif" valign="top" style="height: 10px">
            <img src="top_left.gif" height="10" width="10" border="0">
            </td>
            <td background="tile_top.gif" valign="top" align="right" colspan="2" style="height: 10px">
            <img src="top_right.gif" height="10" width="10" border="0">
            </td>
          </tr>
          <tr>
            <td valign="bottom" width="100%" colSpan="2">
            <table style="BORDER-COLLAPSE: collapse" cellpadding="0" width="100%" border="0">
              <tr>
                <td vAlign="top" width="100%">
                <p dir="ltr">
                  <img src="header_logo1.jpg" height="35" width="130" border="0">
                </p>
                </td>
                <td valign="top" nowrap width="181">
                <img src="header_metalbar_top.jpg" height="35" width="181" border="0">
                </td>
              </tr>
              <tr>
                <td colspan="2">
                <img src="header_logo2.jpg" height="13" width="243" border="0">
                </td>
              </tr>
            </table>
            </td>
            <td>
            <table style="BORDER-COLLAPSE: collapse" cellPadding="0" width="100%" border="0">
              <tr>
                <td valign="top" align="right" bgColor="#ffffff" colSpan="3">
                <img src="login_line_right.gif" height="10" width="60" border="0">
                </td>
              </tr>
              <tr>
                <td rowSpan="3">
                <img src="login_lefttop.gif" height="38" width="27" border="0">
                </td>
                <td background="tile_login_top.gif" height="7">
                <img src="spacer.gif" height="7" width="7" border="0">
                </td>
                <td rowSpan="3">
                <img src="login_righttop.gif" height="38" width="61" border="0">
                </td>
              </tr>
              <tr>
                <td noWrap bgColor="#000000" height="25">
                <p>
                  <font color="#FFFFFF">
                    [USER]nbsp;nbsp;
                    <span class="OtherTabs">|</span>
                    nbsp;nbsp;
                    [LOGIN]
                  </font>
                </p>
                </td>
              </tr>
              <tr>
                <td background="tile_login_bottom.gif" height="6">
                <img src="spacer.gif" height="6" width="6" border="0">
                </td>
              </tr>
            </table>
            </td>
          </tr>
        </table>
        </td>
      </tr>
      <tr>
      <td valign="top">
        <table style="BORDER-COLLAPSE: collapse" cellPadding="0" bgColor="#ae2726" border="0">
        <tr>
          <td background="tile_main.jpg" vAlign="top" width="100%">
            <img src="header_logo3.jpg" height="74" width="620" border="0">
          </td>
          <td align="right">
            <img src="header_right.jpg" height="74" width="61" border="0">
          </td>
        </tr>
       </table>
       </td>
      </tr>
      <tr>
        <td valign="top">
        <table style="BORDER-COLLAPSE: collapse" cellPadding="0" width="100%" bgColor="#000000" border="0">
          <tr>
            <td vAlign="top" noWrap width="369">
            <img src="menu_left.jpg" height="40" width="369" border="0">
            </td>
            <td background="tile_menu.jpg" nowrap width="100%">
            <font color="#FFFFFF">
              [SOLPARTMENU]
            </font>
            </td>
            <td vAlign="top" noWrap width="61">
            <img src="menu_right.jpg" height="40" width="61" border="0">
            </td>
          </tr>
          <tr>
            <td vAlign="top" noWrap width="369">
            <img src="breadcrumbs_left.jpg" height="33" width="369" border="0">
            </td>
            <td width="100%" nowrap bgColor="#000000">
            <font color="#FFFFFF">
              [BREADCRUMB]
            </font>
            </td>
            <td vAlign="top" noWrap width="61">
            <img src="breadcrumbs_right.jpg" height="33" width="61" border="0">
            </td>
          </tr>
          <tr>
            <td vAlign="top" noWrap bgColor="#FFFFFF" width="369">
            nbsp;nbsp;
            <a href="/default.aspx?tabid=125">
              <img src="download.gif" height="32" width="191" border="0" alt="Download the Code!">
            </a>
            </td>
            <td width="100%" nowrap bgColor="#FFFFFF">
            nbsp;
            </td>
            <td vAlign="top" noWrap bgColor="#FFFFFF" width="61">
            nbsp;
            </td>
          </tr>
        </table>
        </td>
      </tr>
      <tr>
        <td height="100%" valign="top">
        <table style="BORDER-COLLAPSE: collapse" cellPadding="0" width="100%" border="0">
          <tr>
            <td vAlign="top" align="middle" colspan="3">
            [CONTENTPANE:3]
            </td>
          </tr>
          <tr>
            <td vAlign="top" align="middle">
            [CONTENTPANE:1]
            </td>
            <td vAlign="top" align="middle">
            [CONTENTPANE]
            </td>
            <td vAlign="top" align="middle">
            [CONTENTPANE:2]
            </td>
          </tr>
          <tr>
            <td vAlign="top" align="middle" colspan="3">
            [CONTENTPANE:4]
            </td>
          </tr>
        </table> <br/>
        </td>
      </tr>
      <tr>
        <td vAlign="bottom">
        <table style="BORDER-COLLAPSE: collapse" cellPadding="0" width="100%" border="0">
          <tr>
            <td align="middle" bgColor="#000000" colSpan="3" height="25">
            <font color="#FFFFFF">
              [LINKS]
            </font>
            </td>
          </tr>
          <tr>
            <td background="tile_footer.jpg" align="middle" colSpan="3" height="25">
            <font color="#FFFFFF">[HOSTNAME]nbsp;nbsp;
              <span class="OtherTabs">|</span>
              nbsp;nbsp;[TERMS]nbsp;nbsp;
              <span class="OtherTabs">|</span>
              nbsp;nbsp;[PRIVACY]
            </font>
            </td>
          </tr>
          <tr>
            <td background="tile_body_bottom.jpg" vAlign="top" align="left">
            <img src="body_corner_left_bottom.jpg" height="26" width="20" border="0">
            </td>
            <td background="tile_body_bottom.jpg" align="middle">
            <font color="#000000">[DOTNETNUKE]</font>
            </td>
            <td background="tile_body_bottom.jpg" vAlign="top" align="right">
            <img src="body_corner_right_bottom.jpg" height="26" width="20" border="0">
            </td>
          </tr>
        </table>
        </td>
      </tr>
    </table>

    Соответствующий файл атрибутов ( skin.xml ):

    <Objects>
      <Object>
        <Token>[LINKS]</Token>
        <Settings>
          <Setting>
            <Name>Separator</Name>
            <Value><![CDATA[nbsp;nbsp;|nbsp;nbsp;]]></Value>
          </Setting>
        </Settings>
      </Object>
      <Object>
        <Token>[CONTENTPANE:1]</Token>
        <Settings>
          <Setting>
            <Name>ID</Name>
            <Value>LeftPane</Value>
          </Setting>
        </Settings>
      </Object>
      <Object>
        <Token>[CONTENTPANE:2]</Token>
        <Settings>
          <Setting>
            <Name>ID</Name>
            <Value>RightPane</Value>
          </Setting>
        </Settings>
      </Object>
      <Object>
        <Token>[CONTENTPANE:3]</Token>
        <Settings>
          <Setting>
            <Name>ID</Name>
            <Value>TopPane</Value>
          </Setting>
        </Settings>
      </Object>
      <Object>
        <Token>[CONTENTPANE:4]</Token>
        <Settings>
          <Setting>
            <Name>ID</Name>
            <Value>BottomPane</Value>
          </Setting>
        </Settings>
      </Object>
    </Objects>

    Созданный HTML-файл, использованные в нем графические файлы, а также файл skin.xml следует упаковать в архив skin.zip.

    Разработка контейнера

    Далее следует создать контейнер, соответствующий шаблону оформления (рис. 14.4).

    (рис 14.4) Контейнер

    В качестве примера можно использовать следующую HTML-разметку:

    <table style="BORDER-COLLAPSE: collapse" cellPadding="0" width="100%" border="0">
      <tr>
        <tr vAlign="top" noWrap align="middle" colSpan="9">
        <img src="spacer.gif" height="15" width="1" border="0">
        </td>
      </tr>
      <tr>
        <td vAlign="top" noWrap width="10">
        <img src="spacer.gif" height="1" width="10" border="0">
        </td>
        <td vAlign="top" noWrap width="20" colspan="2">
        <img src="body_corner_left.jpg" height="42" width="20" border="0">
        </td>
        <td background="tile_body_top.jpg" align="middle" noWrap>
        [SOLPARTACTIONS]
        </td>
        <td background="tile_body_top.jpg" align="middle" width="100%" nowrap>
        [TITLE]
        </td>
        <td background="tile_body_top.jpg" align="middle" noWrap>
        [VISIBILITY]
        </td>
        <td vAlign="top" noWrap align="right" width="20" colspan="2">
        <img src="body_corner_right.jpg" height="42" width="20" border="0">
        </td>
        <td vAlign="top" noWrap width="10">
        <img src="spacer.gif" height="1" width="10" border="0">
        </td>
      </tr>
      <tr>
        <td vAlign="top" noWrap width="10">
        <img src="spacer.gif" height="1" width="10" border="0">
        </td>
        <td vAlign="top" noWrap width="1" bgColor="#c0c0c0">
        <img src="spacer.gif" height="1" width="1" border="0">
        </td>
        <td vAlign="top" noWrap width="19">
        nbsp;
        </td>
        <td colspan="3" align="middle">
        <br/>[CONTENTPANE]
        </td>
        <td vAlign="top" noWrap width="19">
        nbsp;
        </td>
        <td vAlign="top" noWrap width="1" bgColor="#c0c0c0">
        <img src="spacer.gif" height="1" width="1" border="0">
        </td>
        <td vAlign="top" noWrap width="10">
        <img src="spacer.gif" height="1" width="10" border="0">
        </td>
      </tr>
      <tr>
        <td vAlign="top" noWrap width="10">
        <img src="spacer.gif" height="1" width="10" border="0">
        </td>
        <td vAlign="top" noWrap width="1" bgColor="#c0c0c0">
        <img src="spacer.gif" height="1" width="1" border="0">
        </td>
        <td colspan="5">
        nbsp;
        </td>
        <td vAlign="top" noWrap width="1" bgColor="#c0c0c0">
        <img src="spacer.gif" height="1" width="1" border="0">
        </td>
        <td vAlign="top" noWrap width="10">
        <img src="spacer.gif" height="1" width="10" border="0">
        </td>
      </tr>
      <tr>
        <td vAlign="top" noWrap width="10">
        <img src="spacer.gif" height="1" width="10" border="0">
        </td>
        <td vAlign="top" noWrap width="20" colspan="2">
        <img src="body_corner_left_bottom.jpg" height="26" width="20" border="0">
        </td>
        <td background="tile_body_bottom.jpg" colspan="3" align="right">
        [PRINTMODULE]
        </td>
        <td vAlign="top" noWrap align="right" width="20" colspan="2">
        <img src="body_corner_right_bottom.jpg" height="26" width="20" border="0">
        </td>
        <td vAlign="top" noWrap width="10">
        <img src="spacer.gif"height="1" width="10" border="0">
        </td>
      </tr>
    </table>

    После создания контейнера соответствующий HTML-код и графику следует упаковать в архив container.zip.

    Контрольные вопросы

  • Дайте определение понятию "шаблон оформления".
  • В чем преимущества использования шаблонов оформления? В чем недостаток?
  • Опишите технологию, используемую в DNN для создания шаблонов оформления.
  • Каким образом организуется структура каталогов в шаблоне DNN?
  • Каким образом происходит формирование страницы в DNN?
  • Файлы каких типов могут включаться в шаблон оформления?
  • Какие способы создания шаблонов оформления существуют? На какую категорию пользователей ориентирован каждый из них?
  • Опишите концепцию панелей контента в DNN.
  • Для чего предназначены атрибуты объектов в шаблоне оформления? Как они задаются?
  • Каким образом используются таблицы стилей в шаблонах оформления DNN?
  • Каким образом шаблон оформления подготавливается к публикации?
  • Для чего предназначены контейнеры? В чем специфика их создания?
  • Страницы:

    Теоретическое введение

    Понятие шаблона оформления (skin)

    Архитектура шаблонов оформления в DNN позволяет профессиональным web-дизайнерам создавать пользовательские интерфейсы, которые легко интегрируются с приложением-порталом, создавая визуально привлекательные web-сайты.

    Термин "шаблон оформления" (skin) относится к архитектуре программного обеспечения, которая предоставляет управляемый способ отделения логики приложения и контента от его представления. Абстрактные понятия формы и функции целесообразно рассматривать в виде двухуровневой модели представления.

    Преимущество технологии шаблонов оформления состоит в том, что логика приложения и внешний вид web-страницы могут разрабатываться и модифицироваться независимо. Разработчик программного обеспечения и web-дизайнер могут работать параллельно, без риска повлиять на деятельность друг друга.

    Однако технология шаблонов оформления имеет свои недостатки. Процесс слияния многочисленных файлов в одну страницу может вести к существенному снижению быстродействия. Кроме того, разработчики должны быть оповещены о необходимости разделять логику приложения и средства визуализации результатов его работы.

    Технология создания шаблонов оформления в DNN

    Абстрагирование пользовательских элементов управления от страницы может реализовываться при помощи нескольких стратегий. Каждая из них неизменно включает определенный уровень синтаксического разбора для слияния уровней представления и бизнес-логики.

    Одна из популярных техник, используемая в скриптовых языках, заключается в применении токенов, или идентификаторов в файлах пользовательского интерфейса для представления динамической функциональности.

    Несмотря на то, что элементы управления ASP.NET представляют собой мощную концепцию, они появились сравнительно недавно и используются только на платформе Microsoft. Некоторые инструментальные средства, такие как MS Frontpage и Dreamweaver, имеют встроенную поддержку этих элементов управления. Однако многие профессиональные web-дизайнеры по разным причинам эту технологию не используют. Одной из таких причин является то, что пользовательские элементы управления содержат ссылки на серверные элементы управления, и существует опасность, что web-дизайнер исказит или удалит соответствующий элемент управления.

    Поэтому при разработке технологии шаблонов оформления в DNN была применена наиболее универсальная технология. Такой технологией является HTML. Основной проблемой HTML является его статичность. Поэтому web-дизайнерам была предоставлена возможность включения в HTML-разметку заполнителей (placeholders), которые предназначены для представления динамической функциональности. Это обеспечивает возможность абстрагирования формы и функции.

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

    Заполнители представляют собой фрагменты текста вида [Token], включенные в HTML-разметку. Чтобы устранить задержку в быстродействии, связанную с обработкой заполнителей в процессе выполнения, механизм загрузки шаблона оформления производит замену заполнителей пользовательскими элементами управления ASP.NET, которые и обрабатываются в дальнейшем ядром системы управления контентом.

    В терминах расположения элементов, DNN использует подход, предполагающий возможность произвольного расположения элементов на странице. Для добавления модулей с контентом дизайнер может определить произвольное количество панелей содержимого, которые могут быть связаны со сведениями о размещении модулей, хранящимися в БД. Этот подход гарантирует максимальную гибкость.

    Организация файлов

    Шаблоны оформления могут быть применены на уровне узла, портала или страницы. Они также могут применяться на уровне модулей. В этом случае они называются контейнерами. Все файлы шаблонов оформления хранятся в каталогах порталов. Специальный подкаталог _default используется для обозначения дерева каталогов узла. Каждый портал имеет собственное дерево каталогов, имя которого соответствует его идентификатору ID в БД. Эта структура централизует требование прав доступа на запись, которое применяется к единственному каталогу в структуре сайта (рис. 14.1).

    (рис 14.1) Организация каталогов порталов

    Каталоги Skins и Containers могут содержать неограниченное количество подкаталогов, каждый из которых представляет собой набор файлов, необходимый для визуализации шаблона оформления или контейнера. Названия подкаталогов соответствуют названию шаблонов оформления.

    Обработка страницы

    DNN использует единственную ASPX-страницу default.aspx для визуализации всех элементов управления и содержимого. Этот подход обеспечивает следующие преимущества:

  • централизация всей логики управления пользовательским интерфейсом на одной странице;
  • уменьшается количество входных точек приложения, что позволяет построить более безопасное решение.
  • Страница default.aspx содержит очень ограниченную логику - она включает код для управления элементом страницы <head> и содержит заполнитель для шаблона оформления.

    Когда пользователь первый раз обращается к приложению DNN, оно анализирует URL и заголовок запроса, чтобы определить, какой шаблон оформления следует использовать. В ходе этого процесса осуществляется запрос к таблице БД Skins, в которой хранятся сведения обо всех шаблонах оформления и контейнерах. Снижение быстродействия из-за обращения к БД компенсируется кэшированием объектов данных на уровне ядра системы управления контентом.

    После того, как шаблон оформления выбран, динамически загружается соответствующий пользовательский элемент управления, который добавляется на страницу вместо заполнителя. Каждый пользовательский элемент управления ссылается на файл кода skin.vb, который хранится в каталоге admin\Skins. Этот файл осуществляет всю обработку шаблонов оформления для поддержания безопасности и внедрения контента.

    Пакет шаблона оформления

    Пакет шаблона оформления состоит из многочисленных файлов:

  • файлы *.htm, *.html - файлы определения шаблона оформления, которые обрабатываются загрузчиком шаблона оформления для получения файла .ascx ;
  • файлы *.ascx - пользовательские элементы управления, определяющие шаблон оформления, в формате, который использует ядро шаблонов оформления;
  • файлы *.css - каскадные таблицы стилей, связанные с шаблонами оформления;
  • *.gif, *.jpg, *.png, *.jpeg - вспомогательные файлы графики;
  • *.* - другие файлы ресурсов, требуемые для шаблона оформления (обратите внимание, что расширения файлов, доступных для загрузки, контролируются настройками компонента File Upload на уровне узла).
  • Требуемые файлы упаковываются в zip -архив.

    Структура каталогов шаблона оформления

    Рекомендуется размещать файлы шаблона оформления согласно следующей структуре каталогов:

    \Skins\SkinName\...

    где SkinName - название создаваемого шаблона оформления. В этом каталоге создаются zip -архивы для последующего распространения шаблона оформления.

    \Skins\SkinName\containers - каталог для размещения файлов контейнера.

    \Skins\SkinName\skins - каталог для размещения файлов шаблона оформления.

    Пример размещения файлов шаблона оформления с названием DNN приведен на рис. 14.2.

    (рис 14.2) Структура каталогов для шаблона оформления DNN

    Способы создания шаблона оформления

    Шаблоны оформления DNN могут быть созданы двумя способами - HTML или ASCX (при помощи пользовательских элементов управления). Вариант HTML больше подходит для web-дизайнеров, не знакомых с технологией ASP.NET. Для ASP.NET-разработчиков, использующих Visual Studio, оптимальным является использование способа ASCX. Основное различие будет состоять в расширении получающегося файла и использовании токенов вместо пользовательских элементов управления.

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

    Графика в шаблонах оформления

    Произвольная форма шаблонов оформления в DNN открывает свободу для творчества. Дизайнеры обычно создают прототипы шаблонов оформления как графические файлы с использованием таких приложений, как Adobe Photoshop. При создании шаблонов оформления следует включать в них элементы пользовательского интерфейса, такие как меню сайта и ссылки для входа на сайт. Поскольку ядро портала внедряет в шаблон оформления динамическое содержимое в процессе работы, следует оставлять место для соответствующего контента.

    После создания графического прототипа он разрезается на части, которые помещаются в ячейки HTML-таблицы. Получаемая HTML-разметка должна быть правильно сформирована. Это означает, что все HTML-тэги, являющиеся контейнерами, должны иметь соответствующий закрывающийся тэг. Все атрибуты тэгов не должны иметь пробелов вокруг знака " = ". Значения атрибутов должны указываться в двойных кавычках. В обычной ситуации профессиональный WYSIWYG-редактор генерирует правильно сформированную разметку, но его настройки могут быть изменены, поэтому необходимо проверить получаемую HTML-разметку.

    Панели контента в шаблонах оформления

    При создании шаблона оформления используется концепция панелей контента. Панели контента являются контейнерами для модулей контента, которые автоматически добавляются в них во время выполнения. Панели контента представляют собой HTML-тэги с некоторыми специфическими пользовательскими атрибутами, позволяющими им взаимодействовать с ядром DNN. В качестве панелей контента могут использоваться HTML-тэги <td>, <div>, <span>, и <p>. Должна присутствовать, по меньшей мере, одна панель контента, которая должна называться " Content Pane ". Панели контента могут располагаться в любом месте страницы. Панели контента являются свертываемыми - если во время выполнения в них не было добавлено ни одного модуля, то они становятся невидимыми. Для их добавления используется токен [CONTENTPANE].

    Объекты шаблонов оформления используют концепцию именованных экземпляров. Например, если необходимо использовать два элемента управления типа "меню", то они задаются токенами [MENU:1] и [MENU:2]. В том случае, если требуется только один экземпляр объекта, то он задается без цифр: [MENU].

    Атрибуты объектов шаблона оформления

    Объекты шаблона оформления также могут иметь атрибуты, которые позволяют настроить внешний вид объекта в шаблоне. Каждый объект имеет собственный набор атрибутов. Если создается ASCX-шаблон оформления, то атрибуты должны быть указаны непосредственно в файле шаблона (например, <dnn:Login runat="server" id="dnnLogin" Text="Signin" / ). При создании HTML-шаблона спецификация атрибутов должна включаться в специальный файл. Пакет шаблонов оформления может содержать глобальную спецификацию атрибутов, в виде файла skin.xml для шаблона и container.xml для контейнеров, которая применяется для всех шаблонов и контейнеров в пакете. Имеется возможность переопределения глобальной спецификации атрибутов в файле skinfilename.xml. Следующий xml-фрагмент представляет собой пример спецификации атрибутов:

    <Objects>
      <Object>
        <Token>[LOGIN]</Token>
        <Settings>
          <Setting>
            <Name>Text</Name>
            <Value>Signin</Value>
          </Setting>
        </Settings>
      </Object>
    </Objects>

    Должно существовать однозначное соответствие объявлений объектов шаблона оформления в файле шаблона (например, [MENU] ) со спецификацией атрибутов в xml-файле. Это же справедливо для именованных экземпляров. Например, если необходимо включить в шаблон оформления вертикальное и горизонтальное меню, то можно создать именованные экземпляры [MENU:1] и [MENU:2], и в xml-файле задать различные определения для их атрибутов.

    При создании нескольких панелей контента необходимо указывать значение атрибута ID:

    <Objects>
      <Object>
        <Token>[CONTENTPANE:1]</Token>
        <Settings>
          <Setting>
            <Name>ID</Name>
            <Value>LeftPane</Value>
          </Setting>
        </Settings>
      </Object>
    </Objects>

    Таблица стилей в шаблонах оформления

    DNN использует внешний способ задания таблицы стилей (CSS). Это значит, что DNN может иметь множественные ссылки на таблицы стилей на одной странице. Каждая ссылка задается в порядке приоритета, поэтому реализуется иерархическое переопределение. Иерархия следующая (каждая ссылка переопределяет предыдущую):

  • модули - стили для пользовательских модулей определяются в свойстве PortalModuleControl.StyleSheet ;
  • по умолчанию - стили, использующиеся по умолчанию на уровне узла - default.css ;
  • шаблон оформления - стили шаблона оформления - skin.css или skinfilename.css ;
  • контейнер - стили контейнера - container.css или containerfilename.css ;
  • портал - пользовательские стили, определенные администратором портала - portal.css ;
  • Пакет шаблонов оформления может содержать глобальную таблицу стилей - skin.css (или container.css для контейнеров), которая применяется ко всем файлам шаблонов в пакете. Глобальная таблица стилей может переопределяться путем задания таблицы стилей для конкретного шаблона в пакете. Соответствующая таблица стилей имеет название, совпадающее с названием конкретного шаблона оформления - skinfilename.css.

    Таблица стилей "по умолчанию" ( /Portals/_default/default.css ) содержит набор CSS-классов, которые портал использует для формирования пользовательского интерфейса.

    Публикация шаблона оформления

    Для того чтобы шаблон оформления можно было просмотреть в Галерее шаблонов оформления (Skin Gallery), необходимо создать его высококачественную экранную копию, которая должна храниться в формате JPEG с расширением .jpg и иметь то же имя файла, что и шаблон оформления (например, если шаблон оформления называется skin.htm, то экранная копия должна называться skin.jpg ).

    Упаковка шаблона оформления

    Все файлы, относящиеся к шаблону оформления, упаковываются в ZIP -архив skin.zip, а файлы контейнера - в архив container.zip. Далее оба архива упаковываются в общий архив с требуемым названием. Это позволит установить шаблон оформления и соответствующие ему контейнеры при помощи единственного файла, используя инструмент Skin Uploader.

    Создание контейнеров

    Контейнеры являются определениями шаблонов оформления, которые применяются к модулям. Контейнер создается точно так же, как и шаблон оформления, за исключением используемого набора токенов. Единственным ограничением является то, что в контейнере должен содержаться элемент управления Actions. Этот элемент управления необходим для реализации функциональности модуля. Общие функции этого элемента заключаются в возможности редактировать настройки модуля и управления размещением модуля на панелях контента. Могут также реализовываться пользовательские функции, относящиеся например, к редактированию контента модуля. В DNN включен набор элементов управления типа Actions. Элемент управления по умолчанию - SolPartActions отвечает за всплывающее меню, которое появляется при наведении мыши на иконку в левом верхнем углу модуля. Этот элемент управления предназначен для современных браузеров. Для устаревших браузеров используется элемент управления DropDownActions, реализованный в виде раскрывающегося списка.

    Несмотря на то, что шаблоны оформления и контейнеры создаются, упаковываются и распространяются независимо, дизайнер обычно создает их комбинацию, которая предназначена для совместной работы. Это реализовывается путем совместной закачки шаблона оформления и контейнера на сайт и применения их к пользовательскому интерфейсу. Чтобы упростить эту операцию и обеспечить высокий уровень модульности, используется концепция применения шаблонов оформления на уровне панелей контента. Использование шаблонов оформления для панелей может быть сконфигурировано только на этапе дизайна, при создании шаблона. Реализуется это путем использования пользовательских атрибутов, которые могут быть включены в разметку панели. Используются атрибуты ContainerType, ContainerName и ContainerSrc для идентификации контейнера, который будет использоваться для всех модулей, добавляемых на панель. В том случае, если указанный контейнер отсутствует, используется контейнер по умолчанию.

    Пример определения контейнера для панели:

    <Objects>
      <Object>
        <Token>[CONTENTPANE:1]</Token>
        <Settings>
          <Setting>
            <Name>ID</Name>
            <Value>LeftPane</Value>
          </Setting>
          <Setting>
            <Name>ContainerType</Name>
            <Value>G</Value>
          </Setting>
          <Setting>
            <Name>ContainerName</Name>
            <Value>DNN</Value>
          </Setting>
          <Setting>
            <Name>ContainerSrc</Name>
            <Value>standard.ascx</Value>
          </Setting>
        </Settings>
      </Object>
    </Objects>

    Загрузка шаблонов оформления

    Поскольку шаблоны оформления основываются на ASCX-файлах, которые, будучи добавленными на ASPX-страницу, становятся исполняемыми, существует определенный риск, связанный с возможностью включения в них вредоносного кода. По этой причине существует возможность настройки права загрузки шаблонов оформления. Это право может быть предоставлено администраторам порталов, или же зарезервировано только за пользователем host.

    Объекты шаблонов оформления

    Объекты шаблонов оформления приведены в табл. 14.1.

    Объекты шаблонов оформления
    Токен Элемент управления Описание
    [BANNER] < dnn: Banner runat="server" id="dnnBanner"> Отображает случайный рекламный баннер .
    [BREADCRUMB] < dnn: Breadcrumb runat="server" id="dnnBreadcrumb"> Отображает путь к выбранной странице в виде Название страницы 1 > Название страницы 2 > Название страницы 3
    [CONTENTPANE] <div runat= " server " id= " ContentPane " > Добавляет заполнитель для контента модуля .
    [COPYRIGHT] < dnn: Copyright runat="server" id="dnnCopyright"> Отображение информации о правах интеллектуальной собственности ( .
    [CURRENTDATE] < dnn: CurrentDate runat="server" id="dnnCurrentDate"> Отображает текущую дату .
    [DOTNETNUKE] < dnn: DotNetNuke runat="server" id="dnnDotnetNuke"> Отображение информации о правах интеллектуальной собственности DNN.
    [HELP] < dnn: Help runat="server" id="dnnHelp"> Отображает ссылку с просьбой о помощи . При ее выборе у клиента открывается почтовый клиент с заполненным электронным адресом администратора портала DNN.
    [HOSTNAME] < dnn: HostName runat="server" id="dnnHostName"> Отображает заголовок узла, связанный с .
    [LANGUAGE] <dnn: Language runat="server" id="dnnLanguage" / > Отображает раскрывающийся список, позволяющий выбрать используемый язык .
    [LINKS] < dnn: Links runat="server" id="dnnLinks"> Отображает плоское меню ссылок, связанное с текущей страницей и родительским узлом . Полезно для поисковых машин .
    [LOGIN] < dnn: Login runat="server" id="dnnLogin"> Элемент управления с двумя состояниями . Отображает .
    [LOGO] < dnn: Logo runat="server" id="dnnLogo"> Отображает логотип портала .
    [PRIVACY] < dnn: Privacy runat="server" id="dnnPrivacy"> Выводит ссылку на страницу о собственнике портала .
    [SEARCH] < dnn: Search runat="server" id="dnnSearch"> Отображает строку поиска по порталу .
    [SIGNIN] < dnn: Signin runat="server" id="dnnSignin"> Отображает элемент управления, предназначенный для ввода имени пользователя и пароля .
    [SOLPARTMENU] < dnn: SolPartMenu runat="server" id="dnnSolPartMenu"> Отображает иерархическое навигационное меню .
    [TERMS] < dnn: Terms runat="server" id="dnnTerms"> Выводит ссылку на соглашение об использовании портала .
    [TREEVIEWMENU] < dnn: TreeViewMenu runat="server" id="dnnTreeViewMenu"> Отображает иерархическое навигационное меню с использованием элемента управления Treeview.
    [USER] < dnn: User runat="server" id="dnnUser"> Элемент управления с двумя состояниями . Отображает .

    Атрибуты шаблонов оформления

    Атрибуты шаблонов оформления, которые могут использоваться в файле skin.xml, приведены в табл.7.2

    Атрибуты шаблона оформления
    Токен Атрибут Значение по умолчанию Описание
    [BANNER] BorderWidth 0 Ширина границы вокруг баннера
    [BREADCRUMB] Separator breadcrumb.gif Разделитель между ссылками в меню . Может включать ссылки на пользовательские изображения, текст или HTML (например, <![CDATA[nbsp;<img src="file.gif">nbsp;]]> )
    CssClass SelectedTab Имя таблицы стилей для ссылок в меню .
    RootLevel 1 Корневой уровень отображения ссылок в меню . Возможные значения: .
    [CONTENTPANE] ID ContentPane Идентификатор панели контента, которая будет отображаться в пользовательском интерфейсе и храниться в БД .
    [COPYRIGHT] CssClass SelectedTab Имя таблицы стилей для ссылки на страницу с информацией о правах интеллектуальной собственности .
    [CURRENTDATE] CssClass SelectedTab Имя таблицы стилей для ссылки для отображения текущей даты .
    DateFormat MMMM dd, yyyy Формат текущей даты .
    [DOTNETNUKE] CssClass Normal Имя таблицы стилей для ссылки на страницу с информацией о правах интеллектуальной собственности DNN .
    [HELP] CssClass OtherTabs Имя таблицы стилей для ссылки на помощь .
    [HOSTNAME] CssClass OtherTabs Имя таблицы стилей ссылки Host ( Powered By xxxxxxxxx )
    [LANGUAGE] CssClass Имя таблицы стилей для раскрывающегося списка выбора языка .
    [LINKS] CssClass CommandButton Имя таблицы стилей для ссылок .
    Separator nbsp;nbsp; Разделитель между ссылками . Может включать ссылки на пользовательские изображения, текст или HTML (например, <![CDATA[nbsp;<img src="file.gif">nbsp;]]> )
    Alignment Horizontal Стиль меню " Ссылки " (" Horizontal" или " Vertical" )
    Level Same Определяет отображаемый уровень меню (" Same" - тот же, " Child" - дочерний, " Parent" - родительский, " Root" - корневой)
    [LOGIN] Text Login Текст ссылки " Вход ".
    CssClass OtherTabs Имя таблицы стилей для ссылки " Вход ".
    LogoffText Logoff Текст ссылки " Выход ".
    [LOGO] BorderWidth 0 Ширина границы вокруг логотипа сайта .
    [PRIVACY] Text Privacy Statement Текст ссылки о собственнике портала .
    CssClass OtherTabs Имя таблицы стилей для ссылки о собственнике портала .
    [SEARCH] Submit Submit HTML -разметка для активации поиска (например, "Найти " или <img src= " mybutton.gif">
    CssClass Имя таблицы стилей для элемента управления " Поиск ".
    [SOLPARTMENU] separatecss true Использовать CSS, определенный в таблице стилей ( .
    backcolor #333333 Цвет фона .
    forecolor white Цвет элемента меню .
    highlightcolor white Цвет левой и верхней границы, дающий эффект подсвечивания .
    iconbackgroundcolor #333333 Цвет фона в области отображения иконки .
    selectedbordercolor Цвет границы, окружающий выбранный элемент меню .
    selectedcolor #CCCCCC Цвет фона выбранного элемента меню .
    selectedforecolor white Цвет выбранного элемента меню .
    display horizontal Способ отображения элементов меню ( .
    menubarheight 16 Высота прямоугольника меню в пикселях .
    menuborderwidth 1 Ширина границы меню в пикселях .
    menuitemheight 21 Высота элемента меню в пикселях .
    forcedownlevel false Полное отображение вложенных пунктов меню .
    moveable false Возможность перемещения меню .
    iconwidth 0 Ширина колонки с иконкой в пикселях .
    menueffectsshadowcolor dimgray Цвет тени .
    menueffectsmouseouthidedelay 500 Количество миллисекунд анимации эффекта сворачивания меню ( .
    mouseouthidedelay 1 Количество миллисекунд ожидания, после которого меню сворачивается при уводе мыши с него ( .
    menueffectsmouseoverdisplay Highlight Настройка визуального эффекта при наведении мыши на элемент меню ( .
    menueffectsmouseoverexpand true Задает необходимость разворачивания меню при наведении на него мыши .
    fontnames Arial Шрифт
    fontsize 12 Размер шрифта
    fontbold false Жирность шрифта
    menueffectsshadowstrength 3 Ширина эффекта .
    menueffectsmenutransition None Способ исчезания тени (Значения: .
    menueffectsmenutransitionlength 0.3 Количество миллисекунд, требуемое на преобразование .
    menueffectsshadowdirection Lower Right Направление, в котором будет исчезать тень (Значения: .
    menucontainercssclass MainMenu _ MenuContainer CSS-класс для контейнера меню .
    menubarcssclass MainMenu _ MenuBar CSS-класс для прямоугольника меню .
    menuitemcssclass MainMenu _ MenuItem CSS-класс для элемента меню .
    menuiconcssclass MainMenu _ MenuIcon CSS-класс для иконки меню .
    menuitemselcssclass MainMenu _ MenuItemSel CSS-класс для элемента меню, на который наведена мышь .
    menubreakcssclass MainMenu _ MenuBreak CSS-класс для разрыва в меню .
    submenucssclass MainMenu _ SubMenu CSS-класс для подменю .
    menuarrowcssclass MainMenu _ MenuArrow CSS-класс для стрелки в меню .
    … остальные атрибуты элемента .
    [TERMS] Text Terms of Use Текст ссылки соглашения об использовании .
    CssClass OtherTabs CSS-класс для ссылки соглашения об использовании .
    [USER] Text Register Текст ссылки " Регистрация "
    CssClass OtherTabs CSS-класс для ссылки " Регистрация ".

    Объекты контейнеров

    Описание объектов контейнеров приведены в табл. 14.3

    Объекты контейнеров
    Токен Элемент управления Описание
    [ACTIONBUTTON] <dnn: ActionButton runat="server" id="dnnActionButton"> Кнопка, используемая в модуле для вызова определенных действий .
    [CONTENTPANE] <div runat="server" id="ContentPane"> Вставляет заполнитель для контента модулей .
    [DROPDOWNACTIONS] < dnn: DropDownActions runat="server" id="dnnDropDownActions"> Раскрывающийся список для выбора определенных действий в модуле .
    [ICON] < dnn: Icon runat="server" id="dnnIcon"> Отображает иконку, связанную с модулем .
    [LINKACTIONS] < dnn: LinkActions runat="server" id="dnnLinkActions"> Список ссылок на действия в модуле .
    [SOLPARTACTIONS] < dnn: SolPartActions runat="server" id="dnnSolPartActions"> Всплывающее меню действий с модулем .
    [TITLE] < dnn: Title runat="server" id="dnnTitle"> Отображает заголовок модуля .
    [VISIBILITY] < dnn: Visibility runat="server" id="dnnVisibility"> Отображает иконку, означающую, свернут модуль или развернут .

    Атрибуты объектов контейнеров

    Токен Атрибут Значение по умолчанию Описание
    [ACTIONBUTTON] CommandName Тип предпринимаемого с модулем действия ( AddContent | EditContent | ContentOptions | SyndicateModule | ImportModule | ExportModule | OnlineHelp | ModuleHelp | HelpText | PrintModule | ModuleSettings | DeleteModule | ClearCache | MoveTop | MoveUp | MoveDown | MoveBottom | MovePane | MoveRoot )
    CssClass CommandButton CSS-класс для кнопки
    DisplayLink True Необходимость отображения локализованного текста команды ( True | False )
    DisplayIcon False Необходимость отображения иконок для команд ( .
    IconFile Файл, используемый в качестве иконки .
    [CONTENTPANE] ID ContentPane Ключевой идентификатор панели конента .
    [ICON] BorderWidth 0 Ширина границы вокруг иконки .
    [TITLE] CssClass Head CSS-класс для заголовка .

    Практические задания

    Разработка шаблона оформления

    В данной лабораторной работе будет разработан шаблон оформления для DNN, приведенный на рис. 14.3.

    (рис 14.3) Шаблон оформления

    Приведенный шаблон оформления следует создать в любом визуальном редакторе, таком, как MS Frontpage или MS Visual Studio. Можно использовать собственный дизайн шаблона. При создании шаблона можно использовать следующую HTML-разметку в качестве примера:

    <table style="BORDER-COLLAPSE: collapse" cellpadding="0" width="100%" height="100%" border="0">
      <tr>
        <td valign="top">
        <table style="BORDER-COLLAPSE: collapse" cellpadding="0" width="100%" border="0">
          <tr>
            <td background="tile_top.gif" valign="top" style="height: 10px">
            <img src="top_left.gif" height="10" width="10" border="0">
            </td>
            <td background="tile_top.gif" valign="top" align="right" colspan="2" style="height: 10px">
            <img src="top_right.gif" height="10" width="10" border="0">
            </td>
          </tr>
          <tr>
            <td valign="bottom" width="100%" colSpan="2">
            <table style="BORDER-COLLAPSE: collapse" cellpadding="0" width="100%" border="0">
              <tr>
                <td vAlign="top" width="100%">
                <p dir="ltr">
                  <img src="header_logo1.jpg" height="35" width="130" border="0">
                </p>
                </td>
                <td valign="top" nowrap width="181">
                <img src="header_metalbar_top.jpg" height="35" width="181" border="0">
                </td>
              </tr>
              <tr>
                <td colspan="2">
                <img src="header_logo2.jpg" height="13" width="243" border="0">
                </td>
              </tr>
            </table>
            </td>
            <td>
            <table style="BORDER-COLLAPSE: collapse" cellPadding="0" width="100%" border="0">
              <tr>
                <td valign="top" align="right" bgColor="#ffffff" colSpan="3">
                <img src="login_line_right.gif" height="10" width="60" border="0">
                </td>
              </tr>
              <tr>
                <td rowSpan="3">
                <img src="login_lefttop.gif" height="38" width="27" border="0">
                </td>
                <td background="tile_login_top.gif" height="7">
                <img src="spacer.gif" height="7" width="7" border="0">
                </td>
                <td rowSpan="3">
                <img src="login_righttop.gif" height="38" width="61" border="0">
                </td>
              </tr>
              <tr>
                <td noWrap bgColor="#000000" height="25">
                <p>
                  <font color="#FFFFFF">
                    [USER]nbsp;nbsp;
                    <span class="OtherTabs">|</span>
                    nbsp;nbsp;
                    [LOGIN]
                  </font>
                </p>
                </td>
              </tr>
              <tr>
                <td background="tile_login_bottom.gif" height="6">
                <img src="spacer.gif" height="6" width="6" border="0">
                </td>
              </tr>
            </table>
            </td>
          </tr>
        </table>
        </td>
      </tr>
      <tr>
      <td valign="top">
        <table style="BORDER-COLLAPSE: collapse" cellPadding="0" bgColor="#ae2726" border="0">
        <tr>
          <td background="tile_main.jpg" vAlign="top" width="100%">
            <img src="header_logo3.jpg" height="74" width="620" border="0">
          </td>
          <td align="right">
            <img src="header_right.jpg" height="74" width="61" border="0">
          </td>
        </tr>
       </table>
       </td>
      </tr>
      <tr>
        <td valign="top">
        <table style="BORDER-COLLAPSE: collapse" cellPadding="0" width="100%" bgColor="#000000" border="0">
          <tr>
            <td vAlign="top" noWrap width="369">
            <img src="menu_left.jpg" height="40" width="369" border="0">
            </td>
            <td background="tile_menu.jpg" nowrap width="100%">
            <font color="#FFFFFF">
              [SOLPARTMENU]
            </font>
            </td>
            <td vAlign="top" noWrap width="61">
            <img src="menu_right.jpg" height="40" width="61" border="0">
            </td>
          </tr>
          <tr>
            <td vAlign="top" noWrap width="369">
            <img src="breadcrumbs_left.jpg" height="33" width="369" border="0">
            </td>
            <td width="100%" nowrap bgColor="#000000">
            <font color="#FFFFFF">
              [BREADCRUMB]
            </font>
            </td>
            <td vAlign="top" noWrap width="61">
            <img src="breadcrumbs_right.jpg" height="33" width="61" border="0">
            </td>
          </tr>
          <tr>
            <td vAlign="top" noWrap bgColor="#FFFFFF" width="369">
            nbsp;nbsp;
            <a href="/default.aspx?tabid=125">
              <img src="download.gif" height="32" width="191" border="0" alt="Download the Code!">
            </a>
            </td>
            <td width="100%" nowrap bgColor="#FFFFFF">
            nbsp;
            </td>
            <td vAlign="top" noWrap bgColor="#FFFFFF" width="61">
            nbsp;
            </td>
          </tr>
        </table>
        </td>
      </tr>
      <tr>
        <td height="100%" valign="top">
        <table style="BORDER-COLLAPSE: collapse" cellPadding="0" width="100%" border="0">
          <tr>
            <td vAlign="top" align="middle" colspan="3">
            [CONTENTPANE:3]
            </td>
          </tr>
          <tr>
            <td vAlign="top" align="middle">
            [CONTENTPANE:1]
            </td>
            <td vAlign="top" align="middle">
            [CONTENTPANE]
            </td>
            <td vAlign="top" align="middle">
            [CONTENTPANE:2]
            </td>
          </tr>
          <tr>
            <td vAlign="top" align="middle" colspan="3">
            [CONTENTPANE:4]
            </td>
          </tr>
        </table> <br/>
        </td>
      </tr>
      <tr>
        <td vAlign="bottom">
        <table style="BORDER-COLLAPSE: collapse" cellPadding="0" width="100%" border="0">
          <tr>
            <td align="middle" bgColor="#000000" colSpan="3" height="25">
            <font color="#FFFFFF">
              [LINKS]
            </font>
            </td>
          </tr>
          <tr>
            <td background="tile_footer.jpg" align="middle" colSpan="3" height="25">
            <font color="#FFFFFF">[HOSTNAME]nbsp;nbsp;
              <span class="OtherTabs">|</span>
              nbsp;nbsp;[TERMS]nbsp;nbsp;
              <span class="OtherTabs">|</span>
              nbsp;nbsp;[PRIVACY]
            </font>
            </td>
          </tr>
          <tr>
            <td background="tile_body_bottom.jpg" vAlign="top" align="left">
            <img src="body_corner_left_bottom.jpg" height="26" width="20" border="0">
            </td>
            <td background="tile_body_bottom.jpg" align="middle">
            <font color="#000000">[DOTNETNUKE]</font>
            </td>
            <td background="tile_body_bottom.jpg" vAlign="top" align="right">
            <img src="body_corner_right_bottom.jpg" height="26" width="20" border="0">
            </td>
          </tr>
        </table>
        </td>
      </tr>
    </table>

    Соответствующий файл атрибутов ( skin.xml ):

    <Objects>
      <Object>
        <Token>[LINKS]</Token>
        <Settings>
          <Setting>
            <Name>Separator</Name>
            <Value><![CDATA[nbsp;nbsp;|nbsp;nbsp;]]></Value>
          </Setting>
        </Settings>
      </Object>
      <Object>
        <Token>[CONTENTPANE:1]</Token>
        <Settings>
          <Setting>
            <Name>ID</Name>
            <Value>LeftPane</Value>
          </Setting>
        </Settings>
      </Object>
      <Object>
        <Token>[CONTENTPANE:2]</Token>
        <Settings>
          <Setting>
            <Name>ID</Name>
            <Value>RightPane</Value>
          </Setting>
        </Settings>
      </Object>
      <Object>
        <Token>[CONTENTPANE:3]</Token>
        <Settings>
          <Setting>
            <Name>ID</Name>
            <Value>TopPane</Value>
          </Setting>
        </Settings>
      </Object>
      <Object>
        <Token>[CONTENTPANE:4]</Token>
        <Settings>
          <Setting>
            <Name>ID</Name>
            <Value>BottomPane</Value>
          </Setting>
        </Settings>
      </Object>
    </Objects>

    Созданный HTML-файл, использованные в нем графические файлы, а также файл skin.xml следует упаковать в архив skin.zip.

    Разработка контейнера

    Далее следует создать контейнер, соответствующий шаблону оформления (рис. 14.4).

    (рис 14.4) Контейнер

    В качестве примера можно использовать следующую HTML-разметку:

    <table style="BORDER-COLLAPSE: collapse" cellPadding="0" width="100%" border="0">
      <tr>
        <tr vAlign="top" noWrap align="middle" colSpan="9">
        <img src="spacer.gif" height="15" width="1" border="0">
        </td>
      </tr>
      <tr>
        <td vAlign="top" noWrap width="10">
        <img src="spacer.gif" height="1" width="10" border="0">
        </td>
        <td vAlign="top" noWrap width="20" colspan="2">
        <img src="body_corner_left.jpg" height="42" width="20" border="0">
        </td>
        <td background="tile_body_top.jpg" align="middle" noWrap>
        [SOLPARTACTIONS]
        </td>
        <td background="tile_body_top.jpg" align="middle" width="100%" nowrap>
        [TITLE]
        </td>
        <td background="tile_body_top.jpg" align="middle" noWrap>
        [VISIBILITY]
        </td>
        <td vAlign="top" noWrap align="right" width="20" colspan="2">
        <img src="body_corner_right.jpg" height="42" width="20" border="0">
        </td>
        <td vAlign="top" noWrap width="10">
        <img src="spacer.gif" height="1" width="10" border="0">
        </td>
      </tr>
      <tr>
        <td vAlign="top" noWrap width="10">
        <img src="spacer.gif" height="1" width="10" border="0">
        </td>
        <td vAlign="top" noWrap width="1" bgColor="#c0c0c0">
        <img src="spacer.gif" height="1" width="1" border="0">
        </td>
        <td vAlign="top" noWrap width="19">
        nbsp;
        </td>
        <td colspan="3" align="middle">
        <br/>[CONTENTPANE]
        </td>
        <td vAlign="top" noWrap width="19">
        nbsp;
        </td>
        <td vAlign="top" noWrap width="1" bgColor="#c0c0c0">
        <img src="spacer.gif" height="1" width="1" border="0">
        </td>
        <td vAlign="top" noWrap width="10">
        <img src="spacer.gif" height="1" width="10" border="0">
        </td>
      </tr>
      <tr>
        <td vAlign="top" noWrap width="10">
        <img src="spacer.gif" height="1" width="10" border="0">
        </td>
        <td vAlign="top" noWrap width="1" bgColor="#c0c0c0">
        <img src="spacer.gif" height="1" width="1" border="0">
        </td>
        <td colspan="5">
        nbsp;
        </td>
        <td vAlign="top" noWrap width="1" bgColor="#c0c0c0">
        <img src="spacer.gif" height="1" width="1" border="0">
        </td>
        <td vAlign="top" noWrap width="10">
        <img src="spacer.gif" height="1" width="10" border="0">
        </td>
      </tr>
      <tr>
        <td vAlign="top" noWrap width="10">
        <img src="spacer.gif" height="1" width="10" border="0">
        </td>
        <td vAlign="top" noWrap width="20" colspan="2">
        <img src="body_corner_left_bottom.jpg" height="26" width="20" border="0">
        </td>
        <td background="tile_body_bottom.jpg" colspan="3" align="right">
        [PRINTMODULE]
        </td>
        <td vAlign="top" noWrap align="right" width="20" colspan="2">
        <img src="body_corner_right_bottom.jpg" height="26" width="20" border="0">
        </td>
        <td vAlign="top" noWrap width="10">
        <img src="spacer.gif"height="1" width="10" border="0">
        </td>
      </tr>
    </table>

    После создания контейнера соответствующий HTML-код и графику следует упаковать в архив container.zip.

    Контрольные вопросы

  • Дайте определение понятию "шаблон оформления".
  • В чем преимущества использования шаблонов оформления? В чем недостаток?
  • Опишите технологию, используемую в DNN для создания шаблонов оформления.
  • Каким образом организуется структура каталогов в шаблоне DNN?
  • Каким образом происходит формирование страницы в DNN?
  • Файлы каких типов могут включаться в шаблон оформления?
  • Какие способы создания шаблонов оформления существуют? На какую категорию пользователей ориентирован каждый из них?
  • Опишите концепцию панелей контента в DNN.
  • Для чего предназначены атрибуты объектов в шаблоне оформления? Как они задаются?
  • Каким образом используются таблицы стилей в шаблонах оформления DNN?
  • Каким образом шаблон оформления подготавливается к публикации?
  • Для чего предназначены контейнеры? В чем специфика их создания?
  • Вернуться к учебному плану