Как добавить скрипт базы данных в пакет разработки пользовательских модулей DNN? - PullRequest
6 голосов
/ 19 января 2010

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

Я хочу создать пакет модуля с его базой данных script.so, когда конечный пользователь загружает мой модуль, база данных модуля должна создаваться автоматически.

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

1 Ответ

26 голосов
/ 20 января 2010

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

Я предлагаю перейти в корневую папку DNN и открытьвверх /Install/Module/UsersOnline_05.01.00_Install.resources файл.Это просто zip-архив, переименованный в .resources.Внутри этого архива находится упакованный модуль «Пользователи в сети», и я собираюсь пройти этот пример.

Если у вас уже есть пакет .DNN xml для вашего модуля, вам нужно добавить новый *Запись 1005 *, чтобы сообщить DNN о выполнении ваших сценариев SQL во время установки:

...snip...
<components>
    <component type="Script">
      <scripts>
        <basePath>DesktopModules\UsersOnline</basePath>
        <script type="Install">
          <path>Providers\DataProviders\SqlDataProvider</path>
          <name>04.09.04.SqlDataProvider</name>
          <version>04.09.04</version>
        </script>
        <script type="Install">
          <path>Providers\DataProviders\SqlDataProvider</path>
          <name>05.01.00.SqlDataProvider</name>
          <version>05.01.00</version>
        </script>
        <script type="UnInstall">
          <path>Providers\DataProviders\SqlDataProvider</path>
          <name>Uninstall.SqlDataProvider</name>
          <version>05.01.00</version>
        </script>
      </scripts>
</component>
...snip...

Во время установки модуля DNN выполнит введенные здесь сценарии в порядке их номера версии.Если текущий устанавливаемый модуль никогда не был установлен, он будет выглядеть в следующем порядке:

  1. 04.09.04
  2. 05.01.00

Еслимодуль уже установлен и обновляется (с 04.09.04), он пропустит скрипты предыдущих версий (при условии, что они уже выполнены) и просто запустит новый скрипт 05.01.00, который должен привести все в соответствие с современными требованиями.Вы несете ответственность за создание сценариев SQL для поддержки встроенного механизма обновления.

Существует также сценарий «UnInstall», который выполняется, когда пользователь удаляет модуль.Это позволяет выполнять очистку после модуля.

Каждый сценарий SQL содержит команды T-SQL, необходимые для создания схемы модуля, данных по умолчанию, хранимых процедур и т. Д. Вот фрагмент сценария модуля OnlineUsers:

/************************************************************/
/*****              SqlDataProvider                     *****/
/*****                                                  *****/
/*****                                                  *****/
/***** Note: To manually execute this script you must   *****/
/*****       perform a search and replace operation     *****/
/*****       for {databaseOwner} and {objectQualifier}  *****/
/*****                                                  *****/
/************************************************************/

if exists (select * from dbo.sysobjects where id = object_id(N'{databaseOwner}[{objectQualifier}DNNUOL_GetOnlineUsers]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    DROP PROCEDURE {databaseOwner}{objectQualifier}DNNUOL_GetOnlineUsers
GO

CREATE PROCEDURE {databaseOwner}{objectQualifier}DNNUOL_GetOnlineUsers
@PortalID int,
@IncludeHosts bit
AS
IF @IncludeHosts = 0
BEGIN
SELECT 
    UO.UserID,
    U.UserName,
    U.DisplayName,
    U.FirstName, 
    U.LastName, 
    U.FirstName + ' ' + U.LastName AS FullName
FROM
    {databaseOwner}{objectQualifier}UsersOnline UO INNER JOIN {databaseOwner}{objectQualifier}Users U ON UO.UserID = U.UserID INNER JOIN {databaseOwner}{objectQualifier}UserPortals UP ON U.UserID = UP.UserID
WHERE
    UO.PortalID = @PortalID AND UO.UserID = U.UserID AND UP.Authorised = 1 AND U.IsSuperUser = 0 -- Inner Join takes care of SU = 0, but for sanity.
END
ELSE
BEGIN
SELECT DISTINCT
    UO.UserID,
    U.UserName,
    U.DisplayName,
    U.FirstName, 
    U.LastName, 
    U.FirstName + ' ' + U.LastName AS FullName
FROM
    {databaseOwner}{objectQualifier}UsersOnline UO INNER JOIN {databaseOwner}{objectQualifier}Users U ON UO.UserID = U.UserID, {databaseOwner}{objectQualifier}UserPortals UP
WHERE
    UO.PortalID = @PortalID AND UO.UserID = U.UserID AND UP.Authorised = 1
END
GO

/************************************************************/
/*****              SqlDataProvider                     *****/
/************************************************************/

Обратите внимание на использование {databaseOwner} и {objectQualifier} перед каждой таблицей или процедурой, создаваемой в базе данных.Это токены, которые заменяются во время выполнения настройками из файла web.config установки.Вы можете предположить, что они будут заменены на «dbo».но если вы продаете свой модуль или предоставляете его третьим сторонам для установки, вам потребуется поддержка пользовательских владельцев и квалификаторов.

Вот некоторые дополнительные ресурсы:

...