Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие-DNN-для лаб.doc
Скачиваний:
26
Добавлен:
07.05.2019
Размер:
5.54 Mб
Скачать
  • На странице Storefront добавьте модули “Store Catalog” (предлагает ContentPane),

    “Store Menu” (предлагает LeftPane),

    “Store Mini Cart” (предлагает ContentPane или RightPane);

    • На странице My Account добавьте модуль “Store Account”;

    • На странице Store Admin добавьте модуль “Store Admin”.

    1. Конфигурирование модулей Store

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

    Сначала необходимо настроить модуль Store Admin:

    - основная информация о магазине:

    Рисунок 5 - Ввод основной информации о магазине

    В настройках установите имена "Store Page" и "Store Account Page".

    Поле "Description" - краткий текст о том, что вы продаете, а поле "Keywords" должно содержать ключевые слова, разделенные запятыми. Оба поля необходимы для поисковых систем.

    “SEO feature” - мощная настройка, которая позволяет автоматически генерировать скрытый код для индексирования сайта поисковыми системами (механизм мета-тэгов).

    Флажок для поля “Portal Templates” означает, что файлы шаблона будут скопированы из основного хост-сервера с распределенным хранилищем файлов в специальный портал, который вы можете настроить. Все изменения, которые вы сделаете, будут иметь отношение только к текущему порталу и будут сохранены при дальнейшем обновлении модуля Store. Не выбирайте эту опцию, если вы хотите использовать стандартные шаблоны или хотите, чтобы внесенные изменения были применены ко всем порталам внутри вашей системы. Сделайте копию этих файлов, чтобы избежать потери изменений при обновлении.

    - Store Tax Admin

    Замечание: Если настроена работа с налогами, то налоговая ставка является общей для всех продуктов. Так, в текущей версии модуля (Store 2.2) невозможно установить налог для отдельных товаров или категорий товаров.

    - Shipping Admin

    Замечание: Необходимо настроить по крайней мере одну строку в панели администрирования Shipping Admin. Если вы не хотите назначать цены за перевозку товаров, установите следующие значения: минимальный вес=0, максимальный вес= 99999 и цена=0.

    - Store Category Admin

    - Product Admin

    Здесь вы можете вы можете выбрать первоначальную категорию для продукта, ввести имя, производителя, установить цену для продукта и указать другие настройки (рис. 6).

    Рисунок 6 - Ввод данных о товаре

    Также можно установить периоды действия предложения, выбрать изображение для продукта, которое будет отображаться в виде иконки, если настроено соответствующее свойство в модуле Store Catalog (рис.7).

    Рисунок 7 - Настройка дополнительных свойств продукта в Product Admin

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

    Затем необходимо настроить модуль Store Catalog, с помощью которого можно управлять настройками отображения, установленными по умолчанию, для новых продуктов, популярных товаров, категорий товаров и т.д. (рис. 8).

    Рисунок 8 - Настройка параметров Store Catalog

    Настройки Store Menu позволяют конфигурировать число столбцов для отображения категорий и страниц со ссылками на них. Это позволяет вам перемещать данный модуль на все страницы вашего сайта и перенаправлять покупателей на страницу каталога с выбранной категорией.

    Настройки модуля Mini Cart позволяют управлять тем, как это отображается.

    Замечание: Поле ”Include VAT” позволяет включить отображение цен с учетом всех налогов. Для магазинов, относящихся к категории e-commerce b2b, можно пропустить эту опцию и отображать цены без включения VAT.

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

    Настройки модуля Store Account (My Account) позволяют конфигурировать SSL-настройки и просматривать опции.

    Задание для выполнения лабораторной работы: в данной лабораторной работе необходимо изучить принципы изменения дизайна сайта с помощью скинов, установки дополнительных модулей для расширения функциональных возможностей, разграничения прав доступа для пользователей. Для вашего тематического сайта, созданного ранее, установите новый скин; установите дополнительный модуль и опишите его назначение, функциональные возможности и принципы работы. Выбор модуля и скина осуществляется студентом самостоятельно. Создайте несколько дополнительных ролей на сайте (не менее трех новых ролей; например, менеджер, дизайнер) и настройте для них права доступа.

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

    1. Назовите основные элементы для управления дизайном в системе DNN.

    2. Опишите основные принципы работы со скинами.

    3. Опишите назначение и основные принципы работы с контейнерами.

    4. Перечислите основные модули, входящие в состав ядра DNN; кратко поясните их назначение.

    5. Механизм разграничения прав доступа пользователей с помощью ролей: краткая характеристика; описание ролей, установленных в системе по умолчанию.

    6. Основные отличия между ролями «администратор» и «суперпользователь». Возможно ли в системе DNN создание несколько Host-аккаунтов?

    7. Перечислите способы установки модулей DNN.

    8. Опишите этапы конфигурирования электронного магазина с помощью модуля Store.

    Лабораторная работа №4 Программирование модулей

    Цель работы: получение практических навыков разработки собственного модуля DotNetNuke.

    Задачи:

    1. Создание нового модуля DNN с помощью шаблона;

    2. Добавление нового модуля в проект;

    3. Создание пользовательского интерфейса;

    4. Изменение базы данных;

    5. Модификация Data Access Layer;

    6. Изменение объектов бизнес-логики.

    Web-платформы, такие как DotNetNuke (DNN), хорошо выполняют низкоуровневую работу: обеспечение безопасности, управление пользователями, восстановление паролей, разметка страниц, резервное копирование и т.д. CMS позволяют вам делать все это, однако их возможности небезграничны. К счастью DNN позволяет расширить базовую функциональность путем запуска пользовательских программ на страницах сайта. Вы можете сделать это, не вдаваясь в подробности функционирования ядра системы. Модули в DNN - это автономные компоненты бизнес-приложения.

    Для создания модуля в DNN необходимы:

    • Visual Studio Express edition или выше

    • SQL Server Express edition или выше

    • DotNetNuke Starter Kit http://www.dotnetnuke.com/tabid/125/default.aspx

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

    Рисунок 1 – Модуль «Список задач»

    Спецификация модуля «Список задач»:

    • Пользователь должен иметь следующие возможности:

    - просматривать список задач;

    - создавать/удалять задачи;

    - отмечать задачи как выполненные.

    • Задача должна иметь следующие поля:

    - "Название" (строка);

    - "Завершено" (логическое значение).

    • Только зарегистрированные пользователи сайта должны иметь возможность редактировать задачи.

    • Анонимные пользователи должны иметь возможность просматривать задачи.

    Настоятельно рекомендуется сначала создать и протестировать модуль на отдельном веб-сайте DNN.

    Создание нового модуля DNN с помощью шаблона:

    File-> New -> Project…

    В окне "New Project " выберите "C# DNN Module Template" (рисунок 2).

    Рисунок 2 – Создание нового модуля с помощью шаблона

    В каталоге DesktopModules расположены подкаталоги с модулями, в который мы и добавим свой (рисунок 3).

    Рисунок 3 – Solution Explorer после создания модуля с помощью шаблона

    Добавление нового модуля в проект

    Выберем корневую директорию проекта и в меню File->New->File…(рисунок 4) отобразится диалоговое окно "Add New Item".

    Рисунок 4 – Создание нового модуля

    Как вы можете видеть в диалоговом окне, DotNetNuke Starter Kit добавил новый шаблон DotNetNuke Dynamic Module в раздел "My Templates" (рисунок 5)

    Рисунок 5 – Диалоговое окно "Add New Item"

    Выберите язык (Visual Basic или C #) и шаблон DotNetNuke Dynamic Module, введите имя модуля (ToDoTaskList) и нажмите кнопку Add.

    Смешивание C# / VB web-проекта

    Если внимательно посмотреть на рисунок выше, можно заметить, что добавлен C# модуль для VB web-проекта. И естественный вопрос: "Возможно ли, сделать это на самом деле"? Ответ "да", но для этого необходимо выполнить дополнительную работу.

    Для добавления VB модуля можно пропустить этот раздел, но если добавлен C# модуль, то необходимо сделать изменения в файле web.config, чтобы компилятор знал, какие директории из App_Code содержат модуль. Он будет относиться к папке модуля, как "другой", и во время сборки на этапе компиляции будет определен правильный компилятор для использования.

    Откройте файл web.config и найдите узел <compilation>. Внесите следующие изменения в соответствующий раздел:

    <codeSubDirectories>

    <add directoryName="ToDoTaskList"/></codeSubDirectories>

    Переименование папки

    Первое, что нужно сделать - переименовать добавленные папки, которые содержат скелет нашего модуля. Переименуйте папки App_Code\ModuleName и DesktopModules\ModuleName в ToDoTaskList (рисунок 6).

    Рисунок 6 - Переименование папок модуля

    Регистрация модуля DotNetNuke

    Для добавления модуля в DNN, его необходимо зарегистрировать. После входа на сайт DotNetNuke под аккаунтом "host" в строке меню выберите пункт "Host", затем выберите "Module Definitions" (рисунок 7).

    Рисунок 7 - "Module Definitions"

    Нажмите черную стрелку, указывающую вниз, для вызова выпадающего меню и выберите пункт "Create New Module" (рисунок 8).

    Рисунок 8 – «Create New Module»

    В меню Edit Module Definitions:

    • Введите "ToDoTaskList" для MODULE NAME

    • Введите "ToDoTaskList" для FOLDER TITLE

    • Введите "ToDoTaskList" для FRIENDLY TITLE

    • Введите "ToDoTaskList" для DESCRIPTION

    • Введите "01.00.00" для VERSION

    Затем нажмите кнопку UPDATE (рисунок 9)

    Рисунок 9 – Заполнение параметров «Module Definitions»

    Введите "ToDoTaskList" для NEW DEFINITION

    Затем нажмите кнопку "Add Definition" (рисунок 10)

    Рисунок 10

    Затем нажмите "Add Control" (рисунок 11)

    Рисунок 11

    В меню Edit Module Control:

    • Введите "ToDoTaskList" в поле Title;

    • Выберите в выпадающем списке SOURCE значение "DesktopModule / ToDoTaskList / ViewToDoTaskList.ascx";

    • Выберите в выпадающем списке TYPE значение "View";

    • Затем нажмите кнопку "Обновить (рисунок 12).

    Рисунок 12

    Для добавления контролов нажмите кнопку "Add Control" и зайдите в Edit Module Control:

    • Введите "Edit" в поле KEY;

    • Введите “Edit ToDoTaskList" для TITLE;

    • Выберите в выпадающем списке SOURCE значение "DesktopModule / ToDoTaskList / EditToDoTaskList.ascx";

    • Выберите в выпадающем списке TYPE значение "Edit";

    • Затем нажмите кнопку UPDATE (рисунок 13).

    Рисунок 13

    Подготовка контрола

    В Visual Studio откройте файл пользовательского элемента управления ViewToDoTaskList.ascx из папки DesktopModules \ ToDoTaskList и переключитесь в режим конструктора. Этот пользовательский элемент управления добавлен шаблоном модуля и зарегистрирован как главное отображение (view) для модуля. Этот элемент управления будет отображаться DNN, в случае добавление модуля на веб-страницу.

    Мы не будем использовать созданные элементы по умолчанию. Выберите ASP:dataList и удалите его (рисунок 14).

    Рисунок 14

    Теперь добавим Label, установим значение Text="My ToDo Task List" и установим размер шрифта – большой (рисунок 15).

    Рисунок 15

    Следующее, что нужно сделать - удалить код, вставляемый шаблоном для заполнения ASP:dataList, который только что был удален. Код, вставленный шаблоном, был помещен в код-файл. Вы можете получить доступ к код-файлу, нажав на символ "+" рядом с узлом ViewToDoTaskList.ascx в обозревателе решений, а затем двойным щелчком открыть файл ViewToDoTaskList.ascx.cs (рисунок 16).

    Рисунок 16

    Найдите функцию lstContent_ItemDataBound и удалите ее, а также удалите содержимое функции Page_Load. Запустите проект без отладки, войдите в качестве Host и добавьте модуль в верхней части окна (рисунок 17).

    Рисунок 17

    Выберите ToDoTaskList в выпадающем списке модулей, установите название "Tasks", нажмите на ссылку Add - после этого модуль будет добавлен на страницу (рисунок 18).

    Рисунок 18

    Изменение базы данных

    Теперь, когда пользовательский интерфейс готов для дальнейшей модификации, настало время строить поддержку баз данных для модуля. Начнем с открытия базы данных DNN. Первый шаг состоит в нахождении Database.mdf в Solution Explorer (папка App_Data) и откройте этот файл (рисунок 19).

    Рисунок 19

    Теперь база данных отображается в Server Explorer (рисунок 20).

    Рисунок 20

    Добавление таблицы ToDoTask

    Нажмите правой кнопкой мыши на узел Tables под Database.mdf в Server Explorer и нажмите кнопку Add New Table (рисунок 21).

    Рисунок 21

    • Добавьте целочисленный столбец с именем ID, установите его как Identity / Primary key;

    • добавьте булевый столбец с именем Completed, установите значение по умолчанию 0 и снимите галочку allow nulls;

    • добавьте столбец типа VARCHAR (MAX) с именем Subject, установите значение по умолчанию «пустая строка» и снимите галочку allow nulls.

    Назовите таблицу ToDoTask (рисунок 22).

    Рисунок 22

    Создание SUID процедур

    Необходимо добавить хранимые процедуры Select, Update, Insert и Delete для списка задач. Добавление хранимых процедур осуществляется так же, как добавление новых таблиц: щелкните правой кнопкой мыши на узле Stored Procedures под Database.mdf в Server Explorer и нажмите кнопку Add New Stored Procedure (рисунок 23).

    Рисунок 23

    Следующие пять процедур позволяют получить данные для конкретной задачи по идентификатору, извлечь данные для всех задач в таблице, обновить значение задачи, вставить новую задачу, и, наконец, удалить определенную задачу. Добавьте эти процедуры в базу данных.

    CREATE PROCEDURE ToDoTaskSelect

    @ID int

    AS

    BEGIN

    SELECT

    ID AS ItemId,

    Completed,

    Subject

    FROM [ToDoTask]

    WHERE ID = @ID

    END

    CREATE PROCEDURE ToDoTaskListSelect

    AS

    BEGIN

    SELECT

    ID AS ItemId,

    Completed,

    Subject

    FROM [ToDoTask]

    END

    CREATE PROCEDURE ToDoTaskUpdate

    @ID int,

    @Completed bit,

    @Subject varchar(MAX)

    AS

    BEGIN

    UPDATE [ToDoTask]

    SET

    [Completed] = @Completed,

    [Subject] = @Subject

    WHERE [ID] = @ID

    END

    CREATE PROCEDURE ToDoTaskInsert

    @Completed bit,

    @Subject varchar(MAX)

    AS

    BEGIN

    INSERT INTO [ToDoTask]

    ([Completed], [Subject])

    VALUES

    (@Completed, @Subject)

    END

    CREATE PROCEDURE ToDoTaskDelete

    @ID int

    AS

    BEGIN

    DELETE FROM [ToDoTask]

    WHERE [ID] = @ID

    END

    Модули DNN. N-уровневая архитектура

    DNN имеет N-уровневую архитектуру с четким разделением между слоями. Ранее мы изменили контрол, который является одним из элементов слоя пользовательского интерфейса. Слой пользовательского интерфейса общается с конкретным контроллером и бизнес-объектами нашего модуля, а контроллер, в свою очередь, - с Data Access Layer (рисунок 24).

    Рисунок 24

    Несмотря на то, что DNN зависит от SQL Server, для реализации собственной внутренней логики возможности разработчиков модулей не ограничиваются SQL Server. Если вы хотите, чтобы ваш модуль использовал базу данных MySQL, Oracle или даже просто текстовые файлы, у вас есть такая возможность.

    Как именно архитектура DNN добивается этой гибкости? Рассмотрим код, созданный шаблоном модуля, - класс бизнес-уровня, который находится в файле ToDoTaskListController.cs. Вы можете найти этот файл в папке App_Code \ ToDoTaskList (рисунок 25).

    Рисунок 25

    Открытый код класса контроллера:

    public void AddToDoTaskList(ToDoTaskListInfo objToDoTaskList)

    {

    if (objToDoTaskList.Content.Trim() != "")

    {

    DataProvider.Instance().AddToDoTaskList(objToDoTaskList.ModuleId,

    objToDoTaskList.Content, objToDoTaskList

    .CreatedByUser);

    }

    }

    DataProvider - это абстрактный класс, определяющий методы, который контроллер может использовать для взаимодействия со слоем данных, а Instance() - метод, который вернет DataProvider для конкретного типа доступа к данным. Контроллер работает с DataProvider, который обеспечивает доступ к конкретным данным. В нашем случае мы будем поддерживать только SQL Server, поэтому мы не должны вносить изменения в метод Instance(). Для поддержки иных источников данных необходимо реализовать собственный DataProvider, который будет возвращать необходимые данные и переопределять метод Instance() для возращения нового DataProvider.

    Модификация SQL Data Provider и классов Data Provider в проекте

    Начнем с изменения файла DataProvider.cs, который находится в App_Code \ ToDoTaskList (рисунок 26).

    Рисунок 26

    Мы не будем вносить изменения в регионе Shared/Static Methods, но выполним некоторые модификации в регионе Abstract Methods. Этот регион в классе DataProvider определяет функции доступа к данным, которые мы будем использовать в дальнейшем для подключения объектов бизнес-слоя.

    Стандартные методы, созданные шаблоном модуля:

    • AddToDoTaskList(int ModuleId, string Content, int UserId)

    • GetToDoTaskList(int ModuleId, int ItemId)

    • GetToDoTaskLists(int ModuleId)

    • UpdateToDoTaskList(int ModuleId, int ItemId, string Content, int UserId)

    • DeleteToDoTaskList(int ModuleId, int ItemId)

    Изменим этот список следующим образом:

    • AddToDoTask(bool Completed, string Subject)

    • GetToDoTask(int ItemId)

    • GetToDoTaskList()

    • UpdateToDoTask(int ItemId , bool Completed , string Subject)

    • DeleteToDoTask(int ItemId)

    Помимо изменения имен функций, которые теперь отображают их суть, также был удален параметр Int ModuleID.

    Для большинства модулей, которые добавлены, содержание страницы является уникальным и отличается от содержимого экземпляра модуля на других страницах. Если добавить модуль на страницу 1, то его содержимое будет отличаться от модуля на странице 2. Исключением из этого правила является указание “add to every page” (добавить на каждую страницу) в опциях модуля. При загрузке страницы большинство модулей получают уникальный идентификатор (ModuleID), который возможно использовать для определения того, что нужно отобразить в модуле. Однако в нашем случае мы не будем беспокоиться об этом. Для нашей задачи необходимо отображать список задач, вне зависимости от того, где бы не находился модуль.

    Теперь, когда мы изменили абстрактного класса DataProvider, необходимо изменить SqlDataProvider, который наследуется от DataProvider. Наши изменения в абстрактных методах означают, что любой класс, который наследуется от класса DataProvider, должен быть обновлен ​​для поддержки этих изменений.

    Откройте файл SqlDataProvider.cs и посмотрите регион Public Methods. Необходимо изменить методы так, чтобы они совпадали с методами абстрактного класса DataProvider.

    • AddToDoTask(bool Completed , string Subject)

    • DeleteToDoTask(int ItemId)

    • GetToDoTask(int ItemId)

    • GetToDoTaskList()

    • UpdateToDoTask(int ItemId , bool Completed , string Subject)

    Теперь необходимо модифицировать сами методы.

    Изначально UpdateToDoTaskList выглядит следующим образом:

    public override void UpdateToDoTaskList(int ModuleId, int ItemId, string Content,int UserID)

    {

    SqlHelper.ExecuteNonQuery(ConnectionString, GetFullyQualifiedName(

    "UpdateToDoTaskList"), ModuleId, ItemId, Content,UserID);

    }

    Для начала модифицируем сигнатуру метода:

    public override void UpdateToDoTask(int ItemId, bool Completed, string Subject)

    Далее модифицируем:

    SqlHelper.ExecuteNonQuery( ConnectionString, GetFullyQualifiedName(

    "UpdateToDoTaskList"), ModuleId, ItemId, Content, UserID);

    Первый аргумент ExecuteNonQuery - строка соединения с базой данных. Значение этого аргумента предоставляет свойство ConnectionString типа SqlDataProvider, проинициализированное в конструкторе, и является значением, хранящимся в файле web.config.

    Следующий аргумент ExecuteNonQuery - это имя хранимой процедуры. Значение этого аргумента поставляется методом GetFullyQualifiedName(), который также определен в классе SqlDataProvider. GetFullyQualifiedName() предусмотрен для использования нескольких методологий наименования, которые помогут управлять хранимыми процедурами. Мы не будем использовать эту функциональность, так что заменим метод именем хранимой процедуры.

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

    Хранимая процедура ToDoTaskUpdate принимат три параметра: @ID, @Completed, @Subject.

    Результатом всех изменений будет:

    public override void UpdateToDoTask(int ItemId, bool Completed, string Subject)

    {

    SqlHelper.ExecuteNonQuery( ConnectionString, "ToDoTaskUpdate", Completed, Subject);

    }

    По аналогии необходимо изменить и остальные методы:

    public override void AddToDoTask(bool Completed , string Subject)

    {

    SqlHelper.ExecuteNonQuery( ConnectionString, "ToDoTaskInsert", Completed,Subject);

    }

    public override void DeleteToDoTask(int ItemId)

    {

    SqlHelper.ExecuteNonQuery(ConnectionString, "ToDoTaskDelete", ItemId);

    }

    public override IDataReader GetToDoTask(int ItemId)

    {

    return (IDataReader) SqlHelper.ExecuteReader( ConnectionString, "ToDoTaskSelect",

    ItemId);

    }

    public override IDataReader GetToDoTaskList()

    {

    return (IDataReader)SqlHelper.ExecuteReader( ConnectionString, "ToDoTaskListSelect");

    }

    Изменение объектов бизнес-логики

    Модификация класса ToDoTaskListInfo:

    Класс ToDoTaskListInfo используется для представления одной задачи. Именно с помощью этого класса мы изменим нашу задачу. Переименуйте файл и класс, чтобы бы они в большей степени соответствовали тому, что они на самом деле представляют. Переименуйте файл ToDoTaskListInfo.cs в ToDoTask.cs. Найдите файл в Solution Explorer, щелкните правой кнопкой мыши по нему и выберите Rename (рисунок 27, 28).

    Рисунок 27

    Рисунок 28

    Теперь откройте недавно переименованный файл, дважды щелкнув по нему, переименуйте класс в ToDoTask и измените конструктор надлежащим образом (рисунок 29).

    Рисунок 29

    Перейдем к свойствам этого класса:

    • ModuleID

    • ItemID

    • Content

    • CreatedByUser

    • CreateDate

    Нам необходимо свойство ItemID - остальные свойства можно удалить. Добавьте private bool и string переменные и назовите их _Completed и _Subject соответственно. Наконец, создайте public свойство Completed и Subject.

    private bool _Completed;

    private string _Subject;

    public bool Completed

    {

    get { return _ Completed; }

    set { _ Completed = value; }

    }

    public string Subject {

    get { return _Subject; }

    set { _Subject = value; }

    }

    Важно, чтобы имена свойств совпадали с именами столбцов, возвращаемых из SQL.

    Наш пользовательский интерфейс будет получать доступ и изменять значения отдельных задач с использованием этих свойств.

    Модификация класса ToDoTaskListController

    Теперь необходимо закончить модификацию бизнес-слоя, изменив ToDoTaskListController.

    Так как класс ToDoTaskListInfo переименован в ToDoTask, первое, что необходимо сделать в контроллере - обновить его с учетом этих изменений. Откройте файл ToDoTaskListController.cs и нажмите кнопку Edit в меню, нажмите кнопку Find and Replace, нажмите Quick Replace и выполните замену (рисунок 30).

    Рисунок 30

    Далее - интерфейсы. Мы не будем их реализовывать, поэтому можем смело их удалить.

    public class ToDoTaskListController : ISearchable , IPortable {

    необходимо заменить на:

    public class ToDoTaskListController {

    Кроме того, удалите весь регион Optional Interfaces из файла исходного контроллера, который реализовывал интерфейсы, удаленные ранее.

    ISearchable и IPortable интерфейсы могут быть реализованы вашим контроллером, чтобы DNN знал, что ваш модуль поддерживает эти дополнительные возможности.

    ISearchable – интерфейс, позволяющий DNN индексировать содержимое модуля для дальнейшего поиска внутри модуля.

    IPortable используется DNN для поддержки копирования содержимого.

    Откройте регион Public Methods и изучите методы, содержащиеся в нем.

    public void AddToDoTaskList(ToDoTask objToDoTaskList)

    public void DeleteToDoTaskList(int ModuleId , int ItemId)

    public ToDoTask GetToDoTaskList(int ModuleId , int ItemId)

    public List<ToDoTask> GetToDoTaskLists(int ModuleId)

    public void UpdateToDoTaskList(ToDoTask objToDoTaskList)

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

    public void AddToDoTask(ToDoTask toDoTask)

    public void DeleteToDoTask(ToDoTask toDoTask)

    public void UpdateToDoTask(ToDoTask toDoTask)

    Теперь необходимо изменить сами функции. Метод DeleteToDoTask необходимо изменить так, чтобы вызвать соответствующий метод класса SqlDataProvider. В случае DeleteToDoTask вызвать DeleteToDoTask(int ItemId) SqlDataProvider'а. Аргументы, передаваемые в DeleteToDoTask, являются объектом ToDoTask, а не Int. Необходимо использовать ItemID объекта ToDoTask, который передается так:

    public void DeleteToDoTask(ToDoTask toDoTask)

    {

    DataProvider.Instance().DeleteToDoTask(toDoTask.ItemId);

    }

    Функции добавления и обновления должны быть изменены для вызова методов класса SqlDataProvider таким же образом.

    public void AddToDoTask(ToDoTask toDoTask)

    {

    DataProvider.Instance().AddToDoTask( toDoTask.Completed,toDoTask.Subject);

    }

    public void UpdateToDoTask(ToDoTask toDoTask)

    {

    DataProvider.Instance().UpdateToDoTask(toDoTask.ItemId, toDoTask.Completed, toDoTask.Subject);

    }

    Помните DataProvider.Instance() указывает на наш экземпляр класса SqlDataProvider во время выполнения.

    Внесем следующие изменения в методы получения:

    public ToDoTask GetToDoTask(int itemId)

    {

    return CBO.FillObject<ToDoTask>(DataProvider.Instance().GetToDoTask(itemId));

    }

    public List<ToDoTask> GetToDoTaskList()

    {

    return CBO.FillCollection<ToDoTask>(DataProvider.Instance().GetToDoTaskList());

    }

    CBO - утилита DNN Core содержит классы, которые возможно использовать для построения и распространения объектов ToDoTask или коллекции объектов ToDoTask в автоматическом режиме, при условии, что имена полей совпадают с названием полей таблицы. Эти функции используют. NET Reflection, создают и заполняют объекты.

    В Generic-функции указывается тип объекта (внутри <>), в нашем случае это <ToDoTask>. Это говорит функции, что необходимо создать объекта типа ToDoTask.

    Изменение интерфейса

    Редактирование EditToDoTaskList.ascx

    Откройте файл EditToDoTaskList.ascx двойным щелчком в Solution Explorer и перейдите к исходному коду в случае необходимости.

    Удалите все таблицы. Затем удалите cmdUpdate и cmdDelete linkbuttons; оставьте cmdCancel на странице.

    Добавьте перед cmdCancel текст “There is no separate editable content for the ToDo Task List”.

    Готовый исходный код должен иметь следующий вид:

    <%@ Control language="C#" Inherits=

    "YourCompany.Modules.ToDoTaskList.EditToDoTaskList"

    CodeFile="EditToDoTaskList.ascx.cs" AutoEventWireup="true"%>

    <%@ Register TagPrefix="dnn" TagName=

    "Label" Src="~/controls/LabelControl.ascx" %>

    <%@ Register TagPrefix="dnn" TagName="TextEditor" Src=

    "~/controls/TextEditor.ascx"%>

    <%@ Register TagPrefix="dnn" TagName="Audit" Src=

    "~/controls/ModuleAuditControl.ascx" %>

    There is no separate editable content for the ToDo Task List

    <p>

    <asp:linkbutton cssclass="CommandButton" id="cmdCancel"

    OnClick="cmdCancel_Click" resourcekey="cmdCancel"

    runat="server" borderstyle="none" text="Cancel"

    causesvalidation="False"></asp:linkbutton>

    </p>

    <dnn:audit id="ctlAudit" runat="server" />

    Откройте файл кода EditToDoTaskList.ascx.cs, снова нажав на символ "плюс" рядом с файлом EditToDoTaskList.ascx, а затем двойным щелчком по файлу .cs.

    В событии Page_Load удалите все содержимое. Оставьте событие cmdCancel_Click, но полностью удалите методы cmdDelete_Click и cmdUpdate_Click. Для подтверждения результата скомпилируйте проект, запустите и убедитесь, что веб-сайт запускается и наш список задач отображается в браузере (рисунок 31).

    Рисунок 31

    Делаем списка задач видимым

    Изменим пользовательский контрол ViewToDoTaskList.ascx для работы с задачами.

    Добавление ObjectDataSource

    Откройте ViewToDoTaskList.ascx, перейдите в режим конструктора, если необходимо. В окне панели инструментов, выберите раздел Data и перетащите элемент управления ObjectDataSource в окно дизайнера (рисунок 32).

    Рисунок 32

    Теперь, когда добавлен ObjectDataSource, необходимо установить, что бизнес-объект должен использоваться для получения/работы с данными. Основной источник данных пользовательского интерфейса – слой-контроллер, который должен использоваться ObjectDataSource.

    Перейдите в режим просмотра и исходного кода, добавьте внутри открывающего тега для ObjectDataSource новые атрибутов TypeName, установите его значение в YourCompany.Modules.ToDoTaskList.ToDoTaskListController (рисунок 33).

    Рисунок 33

    Теперь переключитесь обратно в режим конструктора, щелкните правой кнопкой мыши на ObjectDataSource, нажмите Show Smart Tag (также можно выбрать значок Common Tasks для управления ObjectDataSource), и нажмите Configure Data Source (настройка источника данных) (рисунок 34).

    Рисунок 34

    На первом экране мастера, вы можете видеть, что значение, которое мы установили в представлении источника, указано в качестве бизнес-объекта; нажмите кнопку Next (рисунок 35).

    Рисунок 35

    На следующем экране вы видите четыре вкладки, на каждой из которых нужно установить соответствующие методы из контроллера для указанной функции на вкладке. Установите их следующим образом (рисунок 36).

    Select

    GetToDoTaskList(), returns List<ToDoTask>

    Update

    UpdateToDoTask(ToDoTask oToDoTask)

    Insert

    AddToDoTask(ToDoTask oToDoTask)

    Delete

    DeleteToDoTask(ToDoTask oToDoTask)

    Рисунок 36

    После того как вы установили все вкладки, нажмите кнопку Готово.

    Добавление элемента управления GridView и подключение его к ObjectDataSource

    В панели инструментов выберите раздел Date и перетащите GridView в дизайнер (рисунок 37).

    Рисунок 37

    Нажмите правой клавишей мыши на GridView, выберите Show Smart Tag и установите Choose Data Source из выпадающего списка в ObjectDataSource1 (рисунок 38).

    Рисунок 38

    В GridView щелкните на заголовке столбца ItemID, а затем нажмите кнопку Remove Column (рисунок 39).

    Рисунок 39

    Установите Enable Paging, Enable Editing и Enable Deleting в опциях GridView (рисунок 40).

    Рисунок 40

    Поскольку мы удалили столбец, который содержит Itemid, то строки не будут иметь доступ информации об Itemid, которая необходима для функций удаления и обновления. Убедитесь, что строки по-прежнему имеют доступ к значению ItemId. Это осуществляется путем установки DataKeyNames включением всех столбцов коллекции, которые не видны, но которые необходимы для операций с данными.

    Нажмите на GridView, в окне Property найдете DataKeyNames в разделе Data и нажмите на кнопку «Обзор(…)» (рисунок 41).

    Рисунок 41

    В появившемся диалоговом окне добавим поле ItemId в список Selected list и нажимаем ОК (рисунок 42).

    Рисунок 42

    Список задач теперь можно просматривать и редактировать на веб-сайте DNN, но мы еще не создали способ добавления новых задач.

    Добавление новых задач

    Перетащите элемент управления TextBox из раздела Standard панели в дизайнер.

    Далее перетащите кнопку в дизайнер и добавьте после TextBox, назовите ее AddTaskButton и установите свойства текста "Add Task" (рисунок 43).

    Рисунок 43

    Дважды щелкните на кнопке AddTask - появится обработчик событий, в который добавляется код. В коде мы будет создавать новый экземпляр объекта ToDoTask, установим его текстовое значение и добавим в список контроллера.

    protected void AddTaskButton_Click(object sender , EventArgs e) {

    //create a new instance of the controller

    ToDoTaskListController cntrlr = new ToDoTaskListController();

    //create a new ToDoTask and set it's values

    ToDoTask toDoTask = new ToDoTask();

    toDoTask.Completed = false;

    toDoTask.Subject = TextBox1.Text;

    //add the Task using the controller

    cntrlr.AddToDoTask(toDoTask);

    TextBox1.Text = "";

    //refresh the GridView

    this.GridView1.DataBind();

    }

    Наконец, мы должны добавить код в событие Page_Load, для того чтобы только зарегистрированные пользователи могли редактировать наши задачи. Для этого мы будем использовать некоторые функции класса DNN PortalModuleBase, так что наш UserControl при наследовании получит некоторую информацию о безопасности.

    Открываем код ViewToDoTaskList.ascx, нажав на символ "+" в Solution Explorer и двойным щелчком откроем ViewToDoTaskList.ascx.cs (рисунок 44).

    Рисунок 44

    Изменим Page_Load так, чтобы он выглядел следующим образом:

    protected void Page_Load(System.Object sender, System.EventArgs e) {

    try {

    if( !PortalSecurity.IsInRole("Registered Users") &&

    !PortalSecurity.IsInRole(

    "Administrators") ) {

    this.AddTaskButton.Visible = false;

    this.TextBox1.Visible = false;

    this.GridView1.Columns[0].Visible = false;

    }

    }

    catch (Exception exc) //Module failed to load

    {

    Exceptions.ProcessModuleLoadException(this, exc);

    }

    }

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

    ToDo Task List готов (рисунок 45).

    Рисунок 45

    ToDoTask SQL Creation Script

    SET ANSI_NULLS ON

    GO

    SET QUOTED_IDENTIFIER ON

    GO

    SET ANSI_PADDING ON

    GO

    CREATE TABLE [dbo].[ToDoTask](

    [ID] [int] IDENTITY(1,1) NOT NULL,

    [Completed] [bit] NOT NULL CONSTRAINT [DF_ToDoTask_Active] DEFAULT ((0)),

    [Subject] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL

    CONSTRAINT [DF_ToDoTask_Subject] DEFAULT (''),

    CONSTRAINT [PK_ToDoTask] PRIMARY KEY CLUSTERED

    (

    [ID] ASC

    )WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]

    ) ON [PRIMARY]

    GO

    SET ANSI_PADDING OFF

    GO

    Задание для выполнения лабораторной работы: разработать собственный DNN модуль, реализующий 3 основных слоя (слой доступа к данным, слой бизнес-логики, слой пользовательского интерфейса).

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

    1. Каким образом модули позволяют расширить функциональность системы?

    2. Перечислите ПО, необходимое для разработки модулей DNN.

    3. Что такое спецификация модуля?

    4. Для чего необходима регистрация новых модулей в системе DNN?

    СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ

    ОГЛАВЛЕНИЕ

    65