Today I released my first DNN 5 module (more about that here). It’s taken me on and off about a week to get the module properly packaged. Partly because of lack of documentation about the new extension manifest. So here are the things i found out during the packaging process… hope someone else is helped by this info as well.

HTML in the manifest

When first trying my install, the license I have was completely unreadable. This is because the license text sits inside the manifest, and in the install wizard, this text is just output as is. As luck would have it however, there are no tags around the license text, so what i did was to use the HTML version of my license, put them in CDATA tags and now, during install, the user sees nicely formatted html text instead of plain text. In the manifest it looks like this:

<license>
     <!--[CDATA] (full license text) []-->
</license>

I then started to experiment, and discovered that the same worked for the owner elemen of the manifest. This is the full owner element i settled upon: 

<owner>
<name>Erik van Ballegoij</name>
<organization>Apollo Software</organization>
<url>
<![CDATA]<a href="http://www.apollo-software.nl"> www.apollo-software.nl</a>[]>
</url>
<email>
<![CDATA]<a href="mailto:support@apollo-software.nl"> support@apollo-software.nl</a>[]>
</email>
</owner>

Resource zip

Another thing I was used to doing in DNN 4 was a resource.zip file. In the module install zip would just go the dll’s and the sqldataprovider files, and all the rest sat in the resource file. The nice thing about this is that you dont need to update the dnn file very often (well, except for those sqldataprovider files…), and it is much easier to maintain a correct manifest. It took me some time to find out how this works in DNN 5, since there was not much documentation about this, other than a few blogs by Charles Nurse (links below). With a little help by Charles, i was able to tackle this quite easily, with the following manifest element:

<component type="ResourceFile">
<resourceFiles>
<basePath>DesktopModules\PageLocalization</basePath>
<resourceFile>
<name>Resources.zip</name>
</resourceFile>
</resourceFiles>
</component>

The cool thing about this is that you can use more than one resource file zips. This will help if you want to include templates or something.

 

Sneaking in skinobjects

The module I released also contains a number of skinobjects. In the DNN 4 version of the module, i used an sql hack to install those skinobjects. In DNN 5 I had the option to include real SKO package definitions inside the manifefafst, which would probably work just fine. However, i chose not to do that, as i want my skinobjects to uninstall when someone uninstalls the module package. (hmm, in hind sight, I probably could have added a dependency… something i need to look into… ). What i ended up doing what this:

for SKO installation:

INSERT INTO {databaseOwner}[{objectQualifier}Packages] ([Name], [FriendlyName], [Description], [PackageType], [Version], [Owner], [Organization], [Url], [Email], [IsSystemPackage], [License]) VALUES ( N'Apollo.MLNAVSkinObject', N'MLNAV SkinObject', N'This SkinObject is part of the Apollo Pagelocalization Module', N'SkinObject', N'1.0.0', N'Erik van Ballegoij', N'Apollo Software', N'www.apollo-software.nl', N'support@apollo-software.nl', 0, N'See for complete license text: http://www.apollo-software.nl/Over/SoftwareLicense/tabid/77/language/en-US/Default.aspx')
SELECT @PackageId = SCOPE_IDENTITY()
INSERT INTO {databaseOwner}[{objectQualifier}SkinControls] ([PackageID], [ControlKey], [ControlSrc], [IconFile], [HelpUrl], [SupportsPartialRendering]) VALUES (@PackageId, N'MLNAV', N'DesktopModules/PageLocalization/MLNav.ascx', NULL, NULL, 0)

 

for SKO de-installation (goes in uninstall.sqldataprovider):

DELETE FROM {databaseOwner}{objectQualifier}SkinControls WHERE ControlKey IN ('MLNAV','MLBREADCRUMB','MLLINKS','MLMENU','MLPAGETITLE','MLTREEVIEW') AND ControlSrc LIKE '%PageLocalization%'

 

Even though this is a hack, the skinobjects are installed just fine, and uninstalled together with the main module package.

For the sample skins i am providing, I also needed a little trick, but of a different order. I want the skin to install without issue in DNN 5, so no “extension not allowed” errors. As it turns out, DNN 5.0.0 has an issue with .resx files inside skin packages. The .resx extension is not allowed for skins (this issue is solved for DNN 5.0.1). Sadly, the DNN Minimal Extropy skin contains a .resx file used for the TEXT skinobject. I had to remove that file in order for the skin to install without issues.

 

For more info about the DNN 5 extension manifest check out these blog posts by Charles Nurse:

  1. The New Extension Installer Manifest – Part 1, Introduction
  2. The New Extension Installer Manifest – Part 2, Component Installers
  3. The New Extension Installer Manifest – Part 3, The Cleanup Component

 

(this is my first post on this site using Windows Live Writer.. Makes blogging much easier!)

Posted in: DotNetNuke

Comments

Ian Robinson
Saturday, April 18, 2009 11:33 PM
Just to clarify - to quote Charles: "The license text can either be embedded in the manifest - or in an external file." He goes on to say this about the "src" attribute of the license element: "src - the location of the license text - if in an external file"
Baldwin sun
Wednesday, April 29, 2009 11:41 AM
Thanks for your sharing!
Adam Kirkbride
Saturday, February 20, 2010 1:16 PM
You can also use my Dotnetnuke 5+ Skin Package Manifest Creator here: http://dotnetnuke.mywebsitedesigner.com.au/

Post Comment

Name (required)

Email (required)

 I am Erik van Ballegoij. I work for DotNetNuke corporation as Technical Lead and Evangelist. On this blog I blog about DotNetNuke tips and tricks and whatever else comes to mind

powered by dotnetnuke follow me on twitter linkedin rss feed