Email Statics and Campaign Monitoring

imageWe have improved the functionality in our Bulk Email module for dotnetnuke, to now allow the sorting of the stat view by the column headings.

Click the “Read Time” heading, and you will sort by read time. etc.

Additionally there is an option to export to excel.

image

This will allow the instant export of the campaign results into an excel spread sheet for later analysis.

 

 

imageUnder the view statics, we have added the tracking of link URL’s used in the message, and a total for the number of links clicked.

Use RSS feeds in dotnetnuke Email Campaigns Automatically

We have just released some new updates to our Bulk Emailer module for dotnetnuke. These changes are significant in relation to the use of RSS feeds to generate emails and content automatically.

Here is an extract of our manual to assist in the understanding of this feature.

By clicking the “Add New” from the “Edit RSS Management” menu, you will be taken to the location were you define the feed that will be used by the bulk emailer module.

RSS Feed Options

image

RSS Name

The name given to this RSS feed when used within the Bulk Emailer module. This will determine the token name that is used within an email to insert this RSS feed as defined. E.g. call this feed “feed1” then to call this as content in an email campaign you would insert [rss:feed1] into the body of the message.

Description

This is a text only description of the RSS feed you have linked to. The description will help remind you what feed name relates to what RSS feed when you list the RSS tokens available in a campaign send screen.

No New RSS Items Text

This is the text that will be used in a [rss_difference:] token if there have been no new RSS feed items since the last time an email was sent that references that feed. E.g. If you are sending a reoccurring campaign each week, you may wish this text to read “No new news this week.

RSS URL

This is the URL that will be used to retrieve the RSS content, or basically the RSS URL.

Item Count

When a token is used in an email, this will be the limiting number of RSS messages to be displayed at one time. When the email is part of a reoccurring campaign that is triggered by the change in RSS content, this value will be a limit usually only for the first message sent. Range is 1-100 items.

Sort by Alphabetical Order

Check this option if you want the list sorted by title order.

Import/Export Templates

Use this feature to export custom templates as .zip packages. The packages can then be saved as a backup, or imported on other sites as a template to use in your templates.

Predefined Templates

Select a predefined template to use as the templates for your site. This is a quick and easy to way to use either vertical or horizontal design layouts, “out of the box” with this module.

Template

You can customize the look and feel of the RSS content in the email by modifying the template below. The module uses velocity template engine to render the content. For more detailed information, please visit: http://velocity.apache.org/.

Preview

Click the button on the right to preview the RSS message.

What can you do with RSS Feeds

With these advanced RSS options, it is possible to send email messages with RSS content automatically when the count of the RSS changes is reached. This is handled in the Recurring Campaign Management area of the module. Such that when you are defining the recurring campaign, you select the recurring option as the RSS trigger.

image

In this example we have set the a new email message would be sent, when there are 6 new items in the RSS feed. Then by using the RSS token for the same feed as the content of the email message, the details of the 6 RSS items will be automatically sent in an email to the recipients.

Dotnetnuke–Feedback form with jQuery Popup

We have recently released an update for our dotnetnuke feedback module called feedback designer.

This form now support the jQuery popup effect on page to allow you to support the module from the skin or HTML module on your site.

This is an extract from our instruction manual:

Form Popup Options

image

The module is able to be run in an interesting Popup mode. This enables the form to run using jQuery and open in an elegant popup in screen popup.

image

When the “Enable Popup” is checked, then the form will be hidden form the page that it exists on, but be sitting waiting to be enabled with a token that you can put any place on a page. Lets look closely at an example to explain.

1. Put the module on a new page.

2. Configure the module form to work correctly as you would like. With all the form item, sending to an email address and test it. i.e. make it a normal functional form.

3. Configure the Modify Form “Look and Fee” section with the following Popup Options exactly.
Note that the form content will disappear when you return to the page. We have used a token of #cmd_form (complete feedback designer _form) as we are certain that this text will not randomly appear on a page already.

image

4. Now return to the page and go into the settings for menu for the Feedback Designer module on the page.

image

5. Under the page settings, disable the “Display Container” option. This will stop the feedback designer title and container being viewed by anyone other than the administrator of the site. Users that are not logged in as an admin will see nothing..

image

6. Return to the page.

7. From the normal DNN Module menu, add a Text HTML (HTML in dnn 5x) to the page.

image

8. Edit the HTML to make the following demo. With just straight text not hyperlinked yet.

image

9. Highlight the words “Click Here” and insert a hyperlink to a destination of #

image

10. Gives a result like this:

image

11. Switch the editor to HTML mode (source code)

image
you will notice the URL is something like this:

image

12. Edit the URL to replace everything between the < > with this:

<a id="cfd_form" href="#">
Where cfd_from is the token we created in the feedback designer form.
So in our case we edit:
This is a demo of the Feedback form. To enable <a href="http://www.interactivewebs.com/ContactUs/tabid/55/ctl/Edit/mid/3757/Default.aspx#">click here</a>.

To:

This is a demo of the Feedback form. To enable <a id="cfd_form" href="#">click here</a>.

Note: As complex as this appears to non HTML friendly people, all we are doing is replacing the hyperlink with a token that we named our self in the Feedback Designer Module.

13. Save an you are done. Clicking the link you created will display the feedback module on your page in Popup Mode.

image
Note that the form token can only be used one time on any page, but you can have multiple forms with different tokens used on a single page.

See our contact us page here for an example form.
http://www.interactivewebs.com/ContactUs.aspx

DotNetNuke–Automatic Logout on Child Sites

It is a long running issue with modules, site and generally is caused by a user logging into a DotNetNuke website that then calls on a page (usually on a dotnetnuke child) website that references a separate .aspx web page.

Most often this is caused by the use of some java script that references external .aspx files in the script.

While in an ideal world this would not cause a logout issue for DNN users, especially admin users. It does and in our most recent experience with this was an updated website that used the cute soft “cute editor”.

This editor was working on dotnetnuke 4.9.5 sites, but due to it’s configuration and changes to the DotNetNuke 5x standards. No child portal would support it’s out of the box configuration after upgrading to dnn 5.6.0.

The fix was to throw it away and use the Telerik RAD editor. Not a bad option as far as the users are concerned, but disappointing that this apparent “bug” which we know could be addressed easily has never been identified and solved.

More time wasted!

DotNetNuke 5.6.0 Bug in Google Analytics Module No Hits

The Problem

We found that after updating to DNN 5.6.0 that the hits on Google Analytics dropped to 0 Page Views.

image

We looked at the reason behind the problem with 0 hits being reported. What we found was that the code that Google states we should use on the page (and was working fine in DNN 5.5.1) is now not valid in 5.6.0.

The tracking code for us looks like this:

 

<script type=”text/javascript”>

var _gaq = _gaq || [];
_gaq.push([‘_setAccount’, ‘UA-1111111-1’]);
_gaq.push([‘_trackPageview’]);

(function() {
var ga = document.createElement(‘script’); ga.type = ‘text/javascript’; ga.async = true;
ga.src = (‘https:’ == document.location.protocol ? ‘https://ssl’ : ‘http://www’) + ‘.google-analytics.com/ga.js’;
var s = document.getElementsByTagName(‘script’)[0]; s.parentNode.insertBefore(ga, s);
})();

</script>

When we looked at the rendered source code on the DNN 5.6.0 website, we found that the code was different in the line:

_gaq.push([‘_setAccount’, ‘UA-1111111-1‘]);

Note the “” marks around the ID Number.

So this was someone’s buggy code from DNN Corp.   In the file: SiteAnalytics.config file.

 

The Fix

To fix the problem, is as simple as undoing the buggy code.

in the root directory of your site, is a file called:  SiteAnalytics.config

Open this file in your text editor to reveal:

<?xml version=”1.0″ encoding=”utf-8″ ?>
<AnalyticsEngineConfig>
<Engines>
<AnalyticsEngine>
<EngineType>DotNetNuke.Services.Analytics.GoogleAnalyticsEngine, DotNetNuke</EngineType>
<ElementId>Head</ElementId>
<InjectTop>False</InjectTop>
<ScriptTemplate>
<![CDATA[

<script type=”text/javascript”>
var _gaq = _gaq || [];
_gaq.push([‘_setAccount’, [TRACKING_ID] ]);
_gaq.push([‘_trackPageview’]);

(function() {
var ga = document.createElement(‘script’); ga.type = ‘text/javascript’; ga.async = true;
ga.src = (‘https:’ == document.location.protocol ? ‘https://ssl’ : ‘http://www’) + ‘.google-analytics.com/ga.js’;
var s = document.getElementsByTagName(‘script’)[0]; s.parentNode.insertBefore(ga, s);
})();
</script>

]]>
</ScriptTemplate>
</AnalyticsEngine>
</Engines>
</AnalyticsEngineConfig>

Just replace the two quotation marks highlighted above “” with single ‘’  one either side of the two [ ]and save the file. This will fix the buggy code.

So the line becomes:

_gaq.push([‘_setAccount’, [TRACKING_ID] ]);

 

Notes on DNN 5.6.1

Originally we suggested that the “” be taken out. We then found after updating the 5.6.1 that the removal of the “” broke that upgrade with regard to Google Analytics. So we have modified these notes to say to replace the “” with single ‘’.

 

Side Note

We stayed stable on DNN 4.9.5 for some time, enjoying not having DNN broken each time we updated. Finally we bit the bullet and with much pain, a Code Expert, a Server Admin Expert and the help of Hyper V rollback capability we updated to DNN 5.x.

Now we are finding ourselves back in the game of undoing crap code every time we run a DNN update. Yes there are some great shiny new features, but we just blew 2 man days working out bugs in the UrlRewriter system and now this analytics bug.

This is disappointing and annoying to again be on this roundabout!

SiteAnalytics – Download File

 

DotNetNuke PortalAliasInfo objPortalAliasInfo) at DotNetNuke.HttpModules.UrlRewriteModule.OnBeginRequest

Problem with Outlook Sync

clip_image002

Task ‘SharePoint’ reported error 0x80040102 Outlook cannot connect to the SharePoint List.

We experienced some errors with our DNN website recently. The errors were and interesting one and a combination of a few things. Actually took some work to understand.

The problem we noticed was that in the Log Viewer, we found many General Exception Errors:

AssemblyVersion: 5.6.0
PortalID: -1
PortalName:
UserID: -1
UserName:
ActiveTabID: -1
ActiveTabName:
RawURL: /_vti_bin/lists.asmx
AbsoluteURL: /_vti_bin/lists.asmx
AbsoluteURLReferrer:
UserAgent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)
DefaultDataProvider: DotNetNuke.Data.SqlDataProvider, DotNetNuke.SqlDataProvider
ExceptionGUID: bla
InnerException: Unhandled Error:
FileName:
FileLineNumber: 0
FileColumnNumber: 0
Method: DotNetNuke.Entities.Portals.PortalSettings..ctor
StackTrace:
Message: System.Exception: Unhandled Error: —> System.NullReferenceException: Object reference not set to an instance of an object. at DotNetNuke.Entities.Portals.PortalSettings..ctor(Int32 tabID, PortalAliasInfo objPortalAliasInfo) at DotNetNuke.HttpModules.UrlRewriteModule.OnBeginRequest(Object s, EventArgs e) at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) — End of inner exception stack trace —
Source: SERVER NAME

In the server Event Log, we found

Event code: 3005
Event message: An unhandled exception has occurred.
Event time: 11/24/2010 11:43:47 PM
Event time (UTC): 11/24/2010 12:43:47 PM
Event ID: 6c188de9427b4941aa187a2ee4e7b173
Event sequence: 388
Event occurrence: 5
Event detail code: 0
 
Application information:
    Application domain: /LM/W3SVC/3/ROOT-1-129350748043347324
    Trust level: Full
    Application Virtual Path: /
    Application Path: C:\inetpub\wwwroot\localpath
    Machine name: SERVER
 
Process information:
    Process ID: 3460
    Process name: w3wp.exe
    Account name: NT AUTHORITY\NETWORK SERVICE
 
Exception information:
    Exception type: NullReferenceException
    Exception message: Object reference not set to an instance of an object.
 
Request information:
    Request URL: http://www.interactivewebs.com.au/_vti_bin/lists.asmx
    Request path: /_vti_bin/lists.asmx
    User host address: 66.34.204.111
    User: 
    Is authenticated: False
    Authentication Type: 
    Thread account name: NT AUTHORITY\NETWORK SERVICE
 
Thread information:
    Thread ID: 12
    Thread account name: NT AUTHORITY\NETWORK SERVICE
    Is impersonating: False
    Stack trace:    at DotNetNuke.Entities.Portals.PortalSettings..ctor(Int32 tabID, PortalAliasInfo objPortalAliasInfo)
   at DotNetNuke.HttpModules.UrlRewriteModule.OnBeginRequest(Object s, EventArgs e)
   at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
 
 
Custom event details:

The common thread here

This URL http://www.interactivewebs.com.au/_vti_bin/lists.asmx

was failing with an error looking like this.

image

Now we realised that this URL to hit the lists.asmx file, is something that should relate to an Outlook Service Contact Web Service Extension. This we know to be associated with one of our own DotNetNuke modules called, Outlook Sync.

This outlook sync (cool module) takes reference to the Outlook Web Service Extension to make a SharePoint style connection of DotNetNuke Contacts into outlook. Allowing you to make a contact list in outlook of your DotNetNuke clients.

The issue is that DotNetNuke is not allowing (under some of the new URL handling technology) for the URL of the web service to be hit.

We found that when testing the install of the module on a new DNN 5.6.0 website, that a portal alias was automatically added to the primary portal that included this path. i.e.

domain.com/_vti_bin/lists.asmx

or

www.domain.com/_vti_bin/lists.asmx

This turned out to be the solution for our site too. By adding the alias to the Admin / Other Settings / Portal Aliases – list of alias addresses.

This then allowed the web url /_vti_bin/lists.asmx to be hit and return the default page for this url:

image

After providing this, the errors were all gone, and the Outlook Sync module worked again!

It turns out that there is a better solution

 

Because the error is actually caused by some bugs in the URL rewriter in DNN.  In the Web.config. There is a reference to the URL rewriter. It is responsible for generating the error above.

This line is found in the web.config under the system.webserver section of the config file.

<add name="UrlRewrite" type="DotNetNuke.HttpModules.UrlRewriteModule, DotNetNuke.HttpModules" preCondition="managedHandler" />

 

We have a line relating to the outlook sync

<add name="OutlookSync" type="iwebs.HttpModules.OutlookSyncHttpModule, App_SubCode_OutlookSyncHttpModule" preCondition="managedHandler"/>

If you ensure that the outlook sync line appears before the URLReweite line in the web.config. Then this will fix the error too, and make it not necessary to use the alias.

We believe this is a bug in the later version of the DNN URLRewriter.

Error The transaction log for database “domain.com” is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases

While accessing a DotNetNuke website today, I was getting this error all the time.

Error   The transaction log for database “domain.com” is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases

Event ID 3001

  • Event code: 3001
    Event message: The request has been aborted.
    Event time: 2/11/2010 12:28:32 PM
    Event time (UTC): 2/11/2010 1:28:32 AM
    Event ID: cc9168019d0b42cabde5ab8fa741927d
    Event sequence: 13
    Event occurrence: 12
    Event detail code: 0

I found this one a little perplexing. On further investigation I found that the transaction logging for the SQL server supporting this was massive. Around 980 meg when I would expect it to run around 15 meg.

Initially I tried killing all processes with active connections to the database, but that did not have the desired result. (We all know what a pain that can be in SQL). So I set the database to “Simple”, and tried to Detach the re-attach.

Still no joy!

All of this round and round ended up with an IIS server and SQL server reboot. All came good and the net result is that I cannot explain the fail or fix it.

Hope this helps someone make the reboot decision faster than I did. That’s another 2 hours of my like I will never get back!