|
Usar o código fonte do módulo "Blog" do Dotnetnuke convertendo-o de DAL para DAL+
domingo, 8 de Junho de 2008 :: 635 Visualizações ::
0 Comentários
:: :: Dotnetnuke
|
|
Recentemente tive necessidade de fazer um projecto em que a funcionalidade de blog tinha de ser bastante personalizada. Decidi utilizar a última versão do modulo Blog do DotNetNuke, e a partir de ai fazer as alterações necessárias. Este foi precisamente o primeiro desafio, a utilização do pacote "source" do módulo blog não foi nada trivial. Para começar o módulo de Blog foi desenvolvido para a framework .net 1.1. A tentativa de instalação deste pacote numa versão anterior (3.x) do DNN e sua posterior migração para DNN v4.x através do "Module Upgrade Wizard" resultou sempre em erros de resolução extremamente complicada. Mas para mim mesmo a simples utilização deste pacote num site DNN 3.x com a framework 1.1 se revelou impraticável. Optei por alterar o código original para DAL+ uma vez que com este processo, a personalização do módulo se torna mais simples. Isto só é possível pois apenas pretendo utilizar este módulo em bases de dados SQL. Mais informações sobre a escolha entre DAL ou DAL+ pode ser encontrada no artigo do Michael Washington. Uma vez que vamos obter um novo módulo de blog, diferente do original, é recomendado que lhe demos um novo nome. Desta forma poderemos ter os dois módulos a conviver pacificamente no nosso projecto. Neste exemplo o nome Blog é alterado para Ankaa_Blog. Este artigo pretende relatar exactamente os passos que segui para conseguir utilizar e compilar o código fonte deste módulo, deixando-o preparado para posterior personalização. Os passos descritos devem ser semelhantes para a migração de outros módulos. O primeiro passo é precisamente fazer download da última versão do pacote de código que é composto por um ficheiro zip, em cujo interior existe um segundo ficheiro ZIP chamado "DNN_Blog_Resources.zip". É este segundo ficheiro que necessitamos descomprimir para um directório no disco. De seguida é necessário criar o nosso projecto, o que pode ser feito através do "starter kit" ou através do "Source Package". Após criar o projecto, deve aceder à sua página e proceder à instalação normal da base de dados. Nesta fase temos um projecto DNN a funcionar correctamente e um directório com o código fonte do módulo blog. Podemos começar as tarefas para integrar o código fonte do blog no nosso projecto: Criar a base de dados e "stored procedures" O primeiro passo corresponde à importação de todos os elementos referentes à base de dados que suporta este módulo. Tal como descrito anteriormente, a migração deste módulo é feita alterando o nome do módulo para que seja possível a sua convivência pacifica com o módulo original. Para isso iremos alterar os nomes de todos os objectos de dados para um nome alternativo. Nesta caso será utilizado o nome "Ankaa_Blog" podendo ser utilizador qualquer outro. 1 - Alterar os nomes de todos os objectos de dados para o nome alternativo. Os ficheiros com os scripts de SQL que devemos utilizar para construir a base de dados estão dentro da pasta em que descomprimimos os ficheiros de código do blog original, no caminho "\Providers\DataProviders\SqlDataProvider". Os ficheiros em causa são os "xx.xx.xx.SqlDataProvider", em que os xx representam os valores da versão. Retirar o atributo "ReadOnly"do ficheiros e dentro de cada um destes ficheiros substituir o texto "{objectQualifier}Blog" por "{objectQualifier}Ankaa_Blog" No ficheiro "03.03.00.SqlDataProvider" alterar a linha 64 de: "where {databaseOwner}{objectQualifier}DesktopModules.ModuleName = 'Blog' AND {databaseOwner}{objectQualifier}Modules.IsDeleted = 0" Para: "where {databaseOwner}{objectQualifier}DesktopModules.ModuleName = 'Ankaa_Blog' AND {databaseOwner}{objectQualifier}Modules.IsDeleted = 0" 2 -Importar os ficheiros SQL. Para isso devemos lançar o site a partir do Visual Studio (Ctrl + F5) e entrar com a conta "Host". Uma vez dentro do portal, escolher a opção "SQL" do menu "Host" Seleccionar a opção "Run as Script", e ler cada um dos ficheiros alterados anteriormente ("Browse", escolher o ficheiro na pasta onde foram descomprimidos, e escolher a opção "Load"). Atenção: Os ficheiros tem de ser carregados por ordem de versão. Para a versão actual do módulo (03.03.00), devem ser carregados na seguinte ordem: Para cada ficheiro, escolher a opção "Execute" (Atenção: Garantir que a opção "Run as Script" está seleccionada). Se ocorrer um erro na importação de algum dos ficheiros, abrir o ficheiro em causa e processar cada parcela do ficheiro individualmente. Para isso copiar todas as linhas entre cada instrução "GO" (sem o "GO") e colocar na caixa de SQL do portal (com a opção "Run as script activa") e clicar em "Execute". Algum erro reportado nesta fase, será provavelmente devido a instruções que foram executadas antes do erro anterior, e poderão ser ignoradas. Adicionar o código "Business Logic" 1 - No "Visual Studio" Criar uma pasta chamada "Ankaa_Blog" dentro da pasta "App_Code". 2 - Clicar com o botão direito sobre o directório agora criado e escolher a opção "Add existing item" 3 - Adicionar os ficheiros correspondentes à lógica de negócio. A partir da pasta onde estão os ficheiros de código do módulo "Blog" Navegar até à pasta "Components" e escolher todos os ficheiros ai existentes. 4 - Clicar com o botão direito sobre a pasta "Ankaa_Blog" e adicionar duas novas pastas chamadas "Rss" e "Upgrade". 5 - Clicar com o botão direito sobre a pasta "Rss", escolher a opção "Add existing item". A partir da pasta onde estão os ficheiros de código do módulo "Blog" Navegar até à pasta "Rss" e escolher todos os ficheiros ai existentes. 6 - Repetir o processo para a pasta "Upgrade", importando os ficheiros de código da pasta "Upgrade" Alterar o código da "Business Logic" para os nomes correctos 1 - O primeiro passo é alterar os nomes dos objectos e dos namespaces de forma a obtermos um novo módulo independente do módulo "Blog" original. Para isso, em cada um dos ficheiros importados (garantir que a opção "Search Hidden Text" está seleccionada) alterar todas as referências do texto: "DotNetNuke.Modules.Blog" Para "Ankaa.Modules.Blog" Corrigir referências a NameSpaces core Os passos seguintes descrevem as correcções para a versão 03.03.00 do módulo "Blog". Em versões futuras deste módulo as correcções poderão ser diferentes. 1 - Fazer "Build Solution" de forma a identificar as referências incorrectas que necessitam correcção. Neste momento são identificados dois erros na solução: 2 - Os dois erros são corrigidos adicionando a linha "Imports DotNetNuke" ao ficheiro "InterfaceController.vb". Alterar o código da "Business Logic" para DAL+ e para os nomes correctos A alteração da lógica de negócio de DAL para DAL+ tem de ser feita de forma individual e cuidada. O objectivo é substituir código semelhante a "DataProvider.Instance().GetBlogMonths(PortalID, BlogID)" Por código semelhante a "DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Menkar_Blog_GetBlogMonths", PortalID, BlogID)" Dividindo a versão original em partes, e fazendo a correspondência com a versão DAL+: | Versão Original (DAL) | Versão Nova (DAL+) | Explicação | | DataProvider.Instance() | DotNetNuke.Data.DataProvider.Instance() | Acesso ao Data Provider | | GetBlogMonths(PortalID, BlogID) | ExecuteReader("Menkar_Blog_GetBlogMonths", PortalID, BlogID) | Utilização de uma Stored Procedure com passagem de parametros, neste caso o PortalID e o BlogID. | Enquanto que na versão original a chamada à stored procedure é directa, na versão nova é necessário utilizar um dos 4 métodos da DAL+. É assim necessário para cada caso é determinar qual dos métodos é o adequado: | ExecuteNonQuery | Utilizado quando se pretende executar uma stored procedure que não retorna nenhum valor. | | ExecuteReader | Utilizado para executar uma stored procedure que retorne multiplos registos. | | ExecuteScalar | Utilizado para executar uma stored procedure que retorna apenas um valor . | | ExecuteSQL | Utilizado para executar um comando SQL directamente. | Para cada caso individual é necessário determinar o método correcto da DAL+ a utilizar bem como a Stored Procedure a ser utilizada. A lista indicada a seguir corresponde à versão 03.03.00 do módulo blog, e poderá ser diferente em futuras versões deste módulo: 1 - Procurar em todos os ficheiros importados (a opção "Search hidden text" deve estar activa) o texto "DataProvider.Instance()." em cada caso fazer a substituição correcta: | Ficheiro | Linha | Texto Original | Texto Novo | | ArchiveController.vb | 30 | Return CBO.FillCollection(DataProvider.Instance().GetBlogMonths(PortalID, BlogID), GetType(ArchiveMonths)) | Return CBO.FillCollection(DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_GetBlogMonths", PortalID, BlogID), GetType(ArchiveMonths)) | | | 35 | Return CBO.FillCollection(DataProvider.Instance().GetBlogDaysForMonth(PortalID, BlogID, BlogDate), GetType(ArchiveDays)) | Return CBO.FillCollection(DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_GetBlogDaysForMonth", PortalID, BlogID, BlogDate), GetType(ArchiveDays)) | | UpgradeController.vb | 32 | Return CBO.FillCollection(DataProvider.Instance().Upgrade_ListBlogs(PortalID, ParentBlogID, ShowNonPublic), GetType(BlogInfo)) | Return CBO.FillCollection(DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_Upgrade_ListBlogs", PortalID, ParentBlogID, ShowNonPublic), GetType(BlogInfo)) | | | 38 | DataProvider.Instance().Upgrade_DeleteBlog(blogID) | DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_Upgrade_DeleteBlog", blogID) | | | 44 | Return CBO.FillCollection(DataProvider.Instance().Upgrade_ListEntriesByBlog(BlogID, BlogDate, ShowNonPublic, ShowNonPublished), GetType(EntryInfo)) | Return CBO.FillCollection(DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_Upgrade_ListEntriesByBlog", BlogID, BlogDate, ShowNonPublic, ShowNonPublished), GetType(EntryInfo)) | | | 50 | DataProvider.Instance().Upgrade_DeleteEntry(EntryID) | DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_Upgrade_DeleteEntry", EntryID) | | | 56 | Return CBO.FillCollection(DataProvider.Instance().Upgrade_ListComments(EntryID), GetType(CommentInfo)) | Return CBO.FillCollection(DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_Upgrade_ListComments", EntryID), GetType(CommentInfo)) | | | 62 | DataProvider.Instance().Upgrade_DeleteComment(commentID) | DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_Upgrade_DeleteComment", commentID) | | ForumBlogUpgrade.vb | 221 | Return CBO.FillCollection(DataProvider.Instance().Upgrade_ListForum_Groups(PortalId), GetType(Forum_GroupsInfo)) | Return CBO.FillCollection(DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_Upgrade_ForumGroupsList", PortalId), GetType(Forum_GroupsInfo)) | | | 227 | Return CType(CBO.FillObject(DataProvider.Instance().Upgrade_ListForum_GroupsByGroup(groupID), GetType(Forum_GroupsInfo)), Forum_GroupsInfo) | Return CType(CBO.FillObject(DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_Upgrade_ForumGroupsByGroup", groupID), GetType(Forum_GroupsInfo)), Forum_GroupsInfo) | | | 599 | Return CBO.FillCollection(DataProvider.Instance().Upgrade_ListForum_Forums(GroupID), GetType(Forum_ForumsInfo)) | Return CBO.FillCollection(DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_Upgrade_ForumForumsList", GroupID), GetType(Forum_ForumsInfo)) | | | 749 | Return CBO.FillCollection(DataProvider.Instance().Upgrade_ListForum_Threads(ForumID), GetType(Forum_ThreadsInfo)) | Return CBO.FillCollection(DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_Upgrade_ForumThreadsList", ForumID), GetType(Forum_ThreadsInfo)) | | | 1021 | Return CBO.FillCollection(DataProvider.Instance().Upgrade_ListForum_Posts(ThreadID), GetType(Forum_PostsInfo)) | Return CBO.FillCollection(DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_Upgrade_ForumPostsList", ThreadID), GetType(Forum_PostsInfo)) | | | 1106 | Return CBO.FillCollection(DataProvider.Instance().Upgrade_ListForum_ThreadRating(ThreadID), GetType(Forum_ThreadRatingInfo)) | Return CBO.FillCollection(DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_Upgrade_ForumThreadRatingList", ThreadID), GetType(Forum_ThreadRatingInfo)) | | Utility.vb | 131 | Dim dr As IDataReader = Ankaa.Modules.Blog.Data.DataProvider.Instance().GetBlogModuleSettings(PortalID, TabID) | Dim dr As IDataReader = DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_GetSettings", PortalID, TabID) | | | 156 | Ankaa.Modules.Blog.Data.DataProvider.Instance().UpdateBlogModuleSetting(PortalID, TabID, Key, Value) | DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_UpdateSetting", PortalID, TabID, Key, Value) | | | 168 | mid = Ankaa.Modules.Blog.Data.DataProvider.Instance().GetBlogViewEntryModuleID(TabID) | mid = DotNetNuke.Data.DataProvider.Instance().ExecuteScalar("Ankaa_Blog_GetBlogViewEntryModuleID", TabID) | | | 315 | ModuleID = Ankaa.Modules.Blog.Data.DataProvider.Instance().GetBlogViewEntryModuleID(TabID) | ModuleID = DotNetNuke.Data.DataProvider.Instance().ExecuteScalar("Ankaa_Blog_GetBlogViewEntryModuleID", TabID) | | EntryController.vb | 30 | Return CType(CBO.FillObject(DataProvider.Instance().GetEntry(EntryID), GetType(EntryInfo)), EntryInfo) | Return CType(CBO.FillObject(DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_GetEntry", EntryID), GetType(EntryInfo)), EntryInfo) | | | 35 | Return CBO.FillCollection(DataProvider.Instance().ListEntries(PortalID, BlogID, BlogDate, ShowNonPublic, ShowNonPublished), GetType(EntryInfo)) | Return CBO.FillCollection(DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_ListEntries", PortalID, BlogID, BlogDate, ShowNonPublic, ShowNonPublished), GetType(EntryInfo)) | | | 39 | Return CBO.FillCollection(DataProvider.Instance().ListEntriesByBlog(BlogID, BlogDate, ShowNonPublic, ShowNonPublished, RecentEntriesMax), GetType(EntryInfo)) | Return CBO.FillCollection(DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_ListEntriesByBlog", BlogID, BlogDate, ShowNonPublic, ShowNonPublished, RecentEntriesMax), GetType(EntryInfo)) | | | 43 | Return CBO.FillCollection(DataProvider.Instance().ListAllEntriesByBlog(BlogID), GetType(EntryInfo)) | Return CBO.FillCollection(DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_ListAllEntriesByBlog", BlogID), GetType(EntryInfo)) | | | 47 | Return CBO.FillCollection(DataProvider.Instance().ListEntriesByPortal(PortalID, BlogDate, ShowNonPublic, ShowNonPublished, RecentEntriesMax), GetType(EntryInfo)) | Return CBO.FillCollection(DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_ListEntriesByPortal", PortalID, BlogDate, ShowNonPublic, ShowNonPublished, RecentEntriesMax), GetType(EntryInfo)) | | | 51 | Return CBO.FillCollection(DataProvider.Instance().ListAllEntriesByPortal(PortalID, ShowNonPublic, ShowNonPublished), GetType(EntryInfo)) | Return CBO.FillCollection(DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_ListAllEntriesByPortal", PortalID, ShowNonPublic, ShowNonPublished), GetType(EntryInfo)) | | | 55 | Return CType(DataProvider.Instance().AddEntry(objEntry.BlogID, objEntry.Title, objEntry.Description, objEntry.Entry, objEntry.Published, objEntry.AllowComments, objEntry.AddedDate.ToUniversalTime, objEntry.DisplayCopyright, objEntry.Copyright, objEntry.PermaLink), Integer) | Return CType(DotNetNuke.Data.DataProvider.Instance().ExecuteScalar("Ankaa_Blog_AddEntry", objEntry.BlogID, objEntry.Title, objEntry.Description, objEntry.Entry, objEntry.Published, objEntry.AllowComments, objEntry.AddedDate.ToUniversalTime, objEntry.DisplayCopyright, objEntry.Copyright, objEntry.PermaLink), Integer) | | | 59 | DataProvider.Instance().UpdateEntry(objEntry.BlogID, objEntry.EntryID, objEntry.Title, objEntry.Description, objEntry.Entry, objEntry.Published, objEntry.AllowComments, objEntry.AddedDate.ToUniversalTime, objEntry.DisplayCopyright, objEntry.Copyright, objEntry.PermaLink) | DotNetNuke.Data.DataProvider.Instance().ExecuteNonQuery("Ankaa_Blog_UpdateEntry", objEntry.BlogID, objEntry.EntryID, objEntry.Title, objEntry.Description, objEntry.Entry, objEntry.Published, objEntry.AllowComments, objEntry.AddedDate.ToUniversalTime, objEntry.DisplayCopyright, objEntry.Copyright, objEntry.PermaLink) | | | 64 | DataProvider.Instance().DeleteEntry(EntryID) | DotNetNuke.Data.DataProvider.Instance().ExecuteNonQuery("Ankaa_Blog_DeleteEntry", EntryID) | | BlogController.vb | 30 | Return CType(CBO.FillObject(DataProvider.Instance().GetBlog(blogID), GetType(BlogInfo)), BlogInfo) | Return CType(CBO.FillObject(DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_GetBlog", blogID), GetType(BlogInfo)), BlogInfo) | | | 36 | Return CType(CBO.FillObject(DataProvider.Instance().GetBlogByUserID(PortalID, UserID), GetType(BlogInfo)), BlogInfo) | Return CType(CBO.FillObject(DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_GetBlogByUserID", PortalID, UserID), GetType(BlogInfo)), BlogInfo) | | | 42 | Return CType(CBO.FillObject(DataProvider.Instance().GetBlogByUserName(PortalID, UserName), GetType(BlogInfo)), BlogInfo) | Return CType(CBO.FillObject(DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_GetBlogByUserName", PortalID, UserName), GetType(BlogInfo)), BlogInfo) | | | 48 | Return CBO.FillCollection(DataProvider.Instance().ListBlogs(PortalID, ParentBlogID, ShowNonPublic), GetType(BlogInfo)) | Return CBO.FillCollection(DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_ListBlogs", PortalID, ParentBlogID, ShowNonPublic), GetType(BlogInfo)) | | | 54 | Return CBO.FillCollection(DataProvider.Instance().ListBlogsByPortal(PortalID, ShowNonPublic), GetType(BlogInfo)) | Return CBO.FillCollection(DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_ListBlogsByPortal", PortalID, ShowNonPublic), GetType(BlogInfo)) | | | 60 | Return CBO.FillCollection(DataProvider.Instance().ListBlogsRootByPortal(PortalID), GetType(BlogInfo)) | Return CBO.FillCollection(DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_ListBlogsRootByPortal", PortalID), GetType(BlogInfo)) | | | 66 | Return CType(DataProvider.Instance().AddBlog(objBlog.PortalID, objBlog.ParentBlogID, objBlog.UserID, objBlog.Title, objBlog.Description, objBlog.Public, objBlog.AllowComments, objBlog.AllowAnonymous, objBlog.ShowFullName, objBlog.Culture, objBlog.DateFormat, objBlog.TimeZone, objBlog.Syndicated, objBlog.SyndicateIndependant, objBlog.SyndicationURL, objBlog.SyndicationEmail, objBlog.EmailNotification, objBlog.AllowTrackbacks, objBlog.AutoTrackback, objBlog.MustApproveComments, objBlog.MustApproveAnonymous, objBlog.MustApproveTrackbacks, objBlog.UseCaptcha), Integer) | Return CType(DotNetNuke.Data.DataProvider.Instance().ExecuteScalar("Ankaa_Blog_AddBlog", objBlog.PortalID, objBlog.ParentBlogID, objBlog.UserID, objBlog.Title, objBlog.Description, objBlog.Public, objBlog.AllowComments, objBlog.AllowAnonymous, objBlog.ShowFullName, objBlog.Culture, objBlog.DateFormat, objBlog.TimeZone, objBlog.Syndicated, objBlog.SyndicateIndependant, objBlog.SyndicationURL, objBlog.SyndicationEmail, objBlog.EmailNotification, objBlog.AllowTrackbacks, objBlog.AutoTrackback, objBlog.MustApproveComments, objBlog.MustApproveAnonymous, objBlog.MustApproveTrackbacks, objBlog.UseCaptcha), Integer) | | | 72 | DataProvider.Instance().UpdateBlog(objBlog.PortalID, objBlog.BlogID, objBlog.ParentBlogID, objBlog.UserID, objBlog.Title, objBlog.Description, objBlog.Public, objBlog.AllowComments, objBlog.AllowAnonymous, objBlog.ShowFullName, objBlog.Culture, objBlog.DateFormat, objBlog.TimeZone, objBlog.Syndicated, objBlog.SyndicateIndependant, objBlog.SyndicationURL, objBlog.SyndicationEmail, objBlog.EmailNotification, objBlog.AllowTrackbacks, objBlog.AutoTrackback, objBlog.MustApproveComments, objBlog.MustApproveAnonymous, objBlog.MustApproveTrackbacks, objBlog.UseCaptcha) | DotNetNuke.Data.DataProvider.Instance().ExecuteNonQuery("Ankaa_Blog_UpdateBlog", objBlog.PortalID, objBlog.BlogID, objBlog.ParentBlogID, objBlog.UserID, objBlog.Title, objBlog.Description, objBlog.Public, objBlog.AllowComments, objBlog.AllowAnonymous, objBlog.ShowFullName, objBlog.Culture, objBlog.DateFormat, objBlog.TimeZone, objBlog.Syndicated, objBlog.SyndicateIndependant, objBlog.SyndicationURL, objBlog.SyndicationEmail, objBlog.EmailNotification, objBlog.AllowTrackbacks, objBlog.AutoTrackback, objBlog.MustApproveComments, objBlog.MustApproveAnonymous, objBlog.MustApproveTrackbacks, objBlog.UseCaptcha) | | | 78 | DataProvider.Instance().DeleteBlog(blogID) | DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_DeleteBlog", blogID) | | SearchController.vb | 29 | Return CBO.FillCollection(DataProvider.Instance().SearchByKeyWordByPortal(PortalID, SearchString, ShowNonPublic, ShowNonPublished), GetType(SearchResult)) | Return CBO.FillCollection(DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_SearchByKeyWordByPortal", PortalID, SearchString, ShowNonPublic, ShowNonPublished), GetType(SearchResult)) | | | 33 | Return CBO.FillCollection(DataProvider.Instance().SearchByKeyWordByBlog(BlogID, SearchString, ShowNonPublic, ShowNonPublished), GetType(SearchResult)) | Return CBO.FillCollection(DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_SearchByKeyWordByBlog", BlogID, SearchString, ShowNonPublic, ShowNonPublished), GetType(SearchResult)) | | | 37 | Return CBO.FillCollection(DataProvider.Instance().SearchByPhraseByPortal(PortalID, SearchString, ShowNonPublic, ShowNonPublished), GetType(SearchResult)) | Return CBO.FillCollection(DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_SearchByPhraseByPortal", PortalID, SearchString, ShowNonPublic, ShowNonPublished), GetType(SearchResult)) | | | 41 | Return CBO.FillCollection(DataProvider.Instance().SearchByPhraseByBlog(BlogID, SearchString, ShowNonPublic, ShowNonPublished), GetType(SearchResult)) | Return CBO.FillCollection(DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_SearchByPhraseByBlog", BlogID, SearchString, ShowNonPublic, ShowNonPublished), GetType(SearchResult)) | | CommentController.vb | 30 | Return CType(CBO.FillObject(DataProvider.Instance().GetComment(commentID), GetType(CommentInfo)), CommentInfo) | Return CType(CBO.FillObject(DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_GetComment", commentID), GetType(CommentInfo)), CommentInfo) | | | 36 | Return CBO.FillCollection(DataProvider.Instance().ListComments(EntryID, Approved), GetType(CommentInfo)) | Return CBO.FillCollection(DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_ListComments", EntryID, Approved), GetType(CommentInfo)) | | | 42 | Return CType(DataProvider.Instance().AddComment(objComment.EntryID, objComment.UserID, objComment.Title, objComment.Comment, objComment.Author, objComment.Approved), Integer) | Return CType(DotNetNuke.Data.DataProvider.Instance().ExecuteScalar("Ankaa_Blog_AddComment", objComment.EntryID, objComment.UserID, objComment.Title, objComment.Comment, objComment.Author, objComment.Approved), Integer) | | | 48 | DataProvider.Instance().UpdateComment(objComment.CommentID, objComment.EntryID, objComment.UserID, objComment.Title, objComment.Comment, objComment.Author, objComment.Approved) | DotNetNuke.Data.DataProvider.Instance().ExecuteNonQuery("Ankaa_Blog_UpdateComment", objComment.CommentID, objComment.EntryID, objComment.UserID, objComment.Title, objComment.Comment, objComment.Author, objComment.Approved) | | | 54 | DataProvider.Instance().DeleteComment(commentID) | DotNetNuke.Data.DataProvider.Instance().ExecuteNonQuery("Ankaa_Blog_DeleteComment", commentID) | 2 - Fazer o "Build Solution" e confirmar que não existe nenhum erro. Adicionar o código para o "User Interface" 1 - No "Visual Studio" Criar uma pasta chamada "Ankaa_Blog" dentro da pasta "DesktopModules" (Se esta pasta não existir, cria-la na raiz do site ou lançar o visual studio em modo "Debug" para que seja criada automaticamente). 2 - Clicar com o botão direito sobre o directório agora criado e escolher a opção "Add existing item". 3 - Adicionar os ficheiros correspondentes ao "User Interface". A partir da pasta onde estão os ficheiros de código do módulo "Blog" adicionar todos os ficheiros *.ascx, *.vb, *.resx, *.css, *.aspx e *.dnn: 4 - Clicar com o botão direito sobre a pasta "Ankaa_Blog" e adicionar três novas pastas chamadas "Images", "Styles" e "App_LocalResources". 5 - Clicar com o botão direito sobre a pasta "Images", escolher a opção "Add existing item". A partir da pasta onde estão os ficheiros de código do módulo "Blog" Navegar até à pasta "Images" e escolher todos os ficheiros ai existentes. 6 - Repetir o processo para a pasta "Styles", importando os ficheiros de código da pasta "Styles" 7 - Repetir o processo para a pasta "App_LocalResources" importando os ficheiros da pasta "App_LocalResources" Alterar o código da "User Interface" para os nomes correctos 1 - O primeiro passo é novamente alterar os nomes dos objectos e dos namespaces de forma a obtermos um novo módulo independente do módulo "Blog" original. Para isso, em todos os ficheiros que acabámos de importar (garantir que a opção "Search Hidden Text" está seleccionada) alterar todas as referências do texto: "DotNetNuke.Modules.Blog" Para "Ankaa.Modules.Blog" 2 - Em cada um dos ficheiros *.vb acabados de importar alterar todas as referências de texto: "Public MustInherit Class" ou "Public Class" Para "Partial Public Class" 3 - Em cada um destes ficheiros *.vb, procurar e remover todas as linhas incluídas na região "Controls". Estas linhas apenas são necessárias na framework 1.1: Alterar o código da "User Interface" para DAL+ e para os nomes correctos Tal como foi feito para a lógica de negócio, a alteração de DAL para DAL+ tem de ser feita de forma individual e cuidada. O objectivo é substituir código semelhante a "DataProvider.Instance().GetBlogMonths(PortalID, BlogID)" Por código semelhante a "DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Menkar_Blog_GetBlogMonths", PortalID, BlogID)" A lista indicada a seguir corresponde à versão 03.03.00 do módulo blog, e poderá ser diferente em futuras versões deste módulo: 1 - Procurar em todos os ficheiros *.vb importados para o "DeskTopModules" (a opção "Search hidden text" deve estar activa) o texto "DataProvider.Instance()." em cada caso fazer a substituição correcta: | Ficheiro | Linha | Texto Original | Texto Novo | | BlogFeed.ascx.vb | 60 | dr = Ankaa.Modules.Blog.Data.DataProvider.Instance().ListEntriesByBlog(ID, Date.UtcNow, Utility.HasBlogPermission(UserId, m_oBlog.UserID, ModuleId), Utility.HasBlogPermission(UserId, m_oBlog.UserID, ModuleId), CType(BlogSettings("RecentRssEntriesMax"), Integer)) | dr = DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_ListEntriesByBlog", ID, Date.UtcNow, Utility.HasBlogPermission(UserId, m_oBlog.UserID, ModuleId), Utility.HasBlogPermission(UserId, m_oBlog.UserID, ModuleId), CType(BlogSettings("RecentRssEntriesMax"), Integer)) | | | 78 | dr = Ankaa.Modules.Blog.Data.DataProvider.Instance().ListEntriesByBlog(ID, m_dBlogDate.ToUniversalTime, Utility.HasBlogPermission(UserId, m_oBlog.UserID, ModuleId), Utility.HasBlogPermission(UserId, m_oBlog.UserID, ModuleId), CType(BlogSettings("RecentRssEntriesMax"), Integer)) | dr = DotNetNuke.Data.DataProvider.Instance().ExecuteReader("Ankaa_Blog_ListEntriesByBlog", ID, m_dBlogDate.ToUniversalTime, Utility.HasBlogPermission(UserId, m_oBlog.UserID, ModuleId), Utility.HasBlogPermission(UserId, m_oBlog.UserID, ModuleId), CType(BlogSettings("RecentRssEntriesMax"), Integer)) | Corrigir Diferenças de ASP1.1 para ASP 2.0 1 - Em cada um dos ficheiros *.ascx e *.aspx importados para a "User Interface" fazer replace de todas as referências a: "Codebehind=" Para "CodeFile=" 2 - Acrescentar ao ficheiro "ModuleOptions.ascx.vb" a importação "Imports DotNetNuke" 3 - Adicionar a três linhas seguintes ao ficheiro "MainView.ascx": %@ Register Src="ViewEntry.ascx" TagName="ViewEntry" TagPrefix="uc3" %>
%@ Register Src="BlogFeed.ascx" TagName="BlogFeed" TagPrefix="uc1" %>
%@ Register Src="ViewBlog.ascx" TagName="ViewBlog" TagPrefix="uc2" %>
4 - A última alteração vai corrigir os links "hard coded" para os directórios de imagens. Em todos os ficheiros da "User Interface" substituir todas a referencias "~/desktopmodules/Blog/Images/" por "~/desktopmodules/Ankaa_Blog/Images/"
5 - Fazer "build"da solução e confirmar que apenas existem erros de formatação. Se existirem mais erros em ficheiros *.vb, estes provavelmente desaparecerão após abertura do ficheiro *.ascx correspondente. A fase seguinte só poderá ser realizada quando não existir nenhum erro nos ficheiros *.vb
Configurar as "Module Definitions"
1 - Fazer "rename" ao ficheiro "DNN_Blog.dnn" para "DNN_Ankaa_Blog.dnn".
2 - Editar o ficheiro "DNN_Ankaa_Blog.dnn" e substituir todo o seu conteúdo do ficheiro :
1 - Lançar o portal (Ctrl + F5) e fazer login com a conta "Host"
2 - Aceder à opção de menu "Host" "Module Definitions"
3 - Escolher a opção "Create New Module"
4 - Escolher o "Manifest" alterado anteriormente, o "DNN_Ankaa_Blog.dnn"
5 - Clicar sobre o link "Create Module from selected manifest file". O módulo fica instalado e configurado no portal:

A partir deste momento o novo blog "Ankaa_Blog" pode ser adicionado a uma página:


|
|
|
|