read more..
We had a situation that clearly shows the use of the DotNetNuke Advanced Login Custom Script template, and how it can be used to deliver expected results.
The client wanted to use a custom search function that enabled search, twitter and Facebook into the top area of their skin.
The issue was, that when the this would cause some errors with the way that the search would display on top of the Advanced Login Module slide down effect that was set to run on the site.
The solution to this turned out to be a great example of how the “Custom Script” option from within the module, can be used to deliver a custom experience that takes into account other custom features of the skin or site.
So in this case we needed to move the Search, twitter, and Facebook information into the same layer as the slide down effect. We then changed some CSS styles to make the alignment of the item sit in the correct place on the skin, and not move to the right when the skin was on a wise display.
or
The custom script ended up looking like this:
jQuery(document).ready(function(){ jQuery(“#open”).click(function(){ jQuery(“div#adv_slidedown_panel”).slideDown(“slow”); jQuery(“.search_style”).css(‘display’,'none’); }); // Collapse Panel jQuery(“#iwebs-close”).click(function(){ jQuery(“div#adv_slidedown_panel”).slideUp(“slow”); jQuery(“.search_style”).css(‘display’,'block’); }); // Switch buttons from “Log In | Register” to “Close Panel” on click jQuery(“#toggle a”).click(function () { jQuery(“#toggle a”).toggle(); }); jQuery(“#dnn_dnnLOGIN_cmdLogin”).css(“display”,”none”); jQuery(“#dnn_dnnUSER_cmdRegister”).css(“display”,”none”); if(jQuery(“.wsc_login”).length>0){ jQuery(“.wsc_login”).css(“visibility”,”hidden”); } jQuery(“.search_style”).appendTo(jQuery(“.tab”)); jQuery(“.search_style”).css(‘margin-top’,’10px’); var w=jQuery(“.search_style”).offset().left- jQuery(“#s_wrap_main”).offset().left-jQuery(“#s_wrap_main”).width()+jQuery(“.search_style”).width(); if(w>0){ jQuery(“.search_style”).css(‘margin-right’,w+’px’); } }) function custom_validate_login(){ /* add any custom login form validation logic here, return true if pass validation */ return true; } function custom_validate_registration(){ /* add any custom registration form validation logic here, return true if pass validation */ return true; }
jQuery(document).ready(function(){ jQuery(“#open”).click(function(){ jQuery(“div#adv_slidedown_panel”).slideDown(“slow”); jQuery(“.search_style”).css(‘display’,'none’); }); // Collapse Panel jQuery(“#iwebs-close”).click(function(){ jQuery(“div#adv_slidedown_panel”).slideUp(“slow”); jQuery(“.search_style”).css(‘display’,'block’); }); // Switch buttons from “Log In | Register” to “Close Panel” on click jQuery(“#toggle a”).click(function () { jQuery(“#toggle a”).toggle(); });
jQuery(“#dnn_dnnLOGIN_cmdLogin”).css(“display”,”none”); jQuery(“#dnn_dnnUSER_cmdRegister”).css(“display”,”none”);
if(jQuery(“.wsc_login”).length>0){ jQuery(“.wsc_login”).css(“visibility”,”hidden”); }
jQuery(“.search_style”).appendTo(jQuery(“.tab”)); jQuery(“.search_style”).css(‘margin-top’,’10px’);
var w=jQuery(“.search_style”).offset().left- jQuery(“#s_wrap_main”).offset().left-jQuery(“#s_wrap_main”).width()+jQuery(“.search_style”).width(); if(w>0){ jQuery(“.search_style”).css(‘margin-right’,w+’px’); }
}) function custom_validate_login(){ /* add any custom login form validation logic here, return true if pass validation */ return true; } function custom_validate_registration(){ /* add any custom registration form validation logic here, return true if pass validation */ return true; }
The end result being that the skin, search and advanced login module slide down effect works well together.
slidedown-export
DotNetNuke can use jQuery to enable popup style and image rotator effects. These are great and a big improvements on technologies like flash. However it is not hard to find two separately coded jQuery modules that can cause conflicts when used on the same page as each other.
The reason in most cases is that modules can be hard coded to use their own version of jQuery. (Think of jQuery as a plugin that is required for the code to load onto the web page).
The library that powers jQuery is often updated to include new features. Earlier version of DotNetNuke did not have any ability to load jQuery or reference it as “part” of the core of DNN.
So for any module written for early DNN versions, the library plugin for jQuery needed to be included or referenced to an online source like the free Google jQuery reference.
If two module are on the same page and calling different versions of jQuery into play, it is likely that one of the modules will conflict and fail to work correctly. Often it will be the more advanced or later built module that fails.
The solution to this is to built a common core library into the core of DotNetNuke, and allow modules and other code to reference this single source when calling on the jQuery library for any reason.
DotNetNuke have included jQuery as an option in the host settings, to allow it to be loaded from there.
They run a release version of the jQuery library that is presumably updated with releases of DotNetNuke. The last version of DotNetNuke 5x shows this.
Modules can either call this library, or use their own library.
Well developed code or modules will usually have a setting that allows you to reference the HOST DNN version of jQuery, or call into play the version that shipped with the module.
On our modules, we use a tab setting that looks like this:
If the “Load jQuery” is ticked, the module will use the jQuery library that is shipped with the module.
If the option is not ticked, the module will use the DotNetNuke included version of jQuery.
When conflicts occur, the best way to resolve it is to ensure that both modules are referencing the exact same jQuery library version. The easy way to do this is to ensure that both modules are NOT using their own version, or in our case “Load JQuery” is NOT CHECKED.
And, ensure that any other modules are also not referencing their own version of jQuery but are looking to the hosted jQuery. (Talk to the module developer on how to do this.)
1. One of the modules may require a feature that is more advanced than the the hosted jQuery version. In this case, a later jQuery library will need to be referenced. To allow this to be done, DotNetNuke have allowed you to reference a URL for another version of jQuery.
For example, in our Mushroom Image module for DotNetNuke, the rotator effect requires a later version of jQuery than the last version of DotNetNuke 5x references. 1.4.4. To set a later version, you simply find an online resource like this Google hosted jQuery library:
http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js
And enter that URL into your HOST jQuery settings.
2. Another issue is that there may be a conflict in the jQuery script used to call the module actions. We have included the ability to customize the script used to reduce conflict.
Naturally this is an option for advanced users, and not all modules have this feature.
When a conflict occurs, there is usually no “developer” at fault, but rather an incompatibility between the ways that the jQuery is being called. Don’t assume that the last module installed is to blame.
In most cases the conflicts can be resolved using the steps outlined above. This assumes that the modules installed have similar flexibility as we do in our modules.
If you see this error
Could Not Load file or assembly NVelocity, Version=1.1.1.0, Culture-nutral, PublicKeyToken=null (Exception from HRESULT: 0×80131040)
While using one of our DotNetNuke Modules. The solution is a simple one.
Update all of the InteractiveWebs DotNetNuke Modules to the latest builds by downloading the latest release from here: http://www.interactivewebs.com/DotNetNukeModules/ModuleDownloads.aspx
The problem stems from a change to some of the code library of some modules that share code with other modules. Updating all modules to the latest build will resolve this issue in all our modules.
A possible error was introduced with DotNetNuke 05.06.03 that caused certain types of post backs to generate an error:
Invalid postback or callback argument. Event validation is enabled using <pages enableeventvalidation="true" /> in configuration or <%@ page enableeventvalidation="true" %> in a page. For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them. If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.
Details: http://www.dotnetnuke.com/Resources/Wiki/loc/print/Page/Event-validation.aspx
This error was introduced into the Advanced Login module, when the registration form was set to use the auto filling Country / Region Selector.
We have produced a fix for this in release version: 45.03.22 of our module. Update to this or a later version if you are receiving the above error.
If you are not using our modules and you receive this, you can resolve it by setting EnableEventValidation to false in the web.config.
Note: The above website mentions that this is “not ideal”. That is not really accurate. The change to the web.config for this has little to no effect on anything else at all.
InteractiveWebs DotNetNuke Modules require a license to be activates on each sub domain from which the module is accessed.
The license is per sub domain, and NOT for each instance of DotNetNuke.
A sub domain example is:
In the case of domain.com and www.domain.com, these are considered as one single license. EVERY other sub domain needs it’s own license.
If you activate a module on dev.domain.com then browse to the same module using another sub domain (like dev2.domain.com) the module will not be activate with the new sub domain in the browser URL.
Each module will automatically enter into a 100% functional TRIAL mode the first time you access the module with any particular sub domain.
The trial period is automatically set from the date you first visit the module with any particular sub domain.
If you access dev1.domain.com the module will start it’s trial period from today, and may expire if you don’t activate.
If you then use another sub domain like dev2.domain.com the module will start a new trial and you will continue to be able to access the module on that dev2.domain.com sub domain.
Note: All the settings and modifications you make to any module in trial WILL be preserved and waiting for you once you activate the module license. So if your trial expires on your development sub domain, you can simply activate the module in it’s final www.domain.com location when you are ready to go live.
We recommend that if you need to configure and test (development site) before going live, that you do that on a development sub domain (like dev.domain.com), IN TRIAL MODE.
From that dev.domain.com, Setup the module, test and be sure things are working. Don’t be concerned if you get things just right, and the trial time expires. Because as soon as you access the module page on a new sub domain, it will go back into trial, and be available fro activation.
All your module settings and customizations will carry over to the new sub domain when you access it. So in this example, if you are ready to go live with www.domain.com you can access the module page with that sub domain, and extend the trial, or activate the module.
For this reason we always suggest that you only activate your module on www.domain.com as your final public URL of your website.
Select the Licensing Dropdown Menu Item from the module Menu:
The module will tell you about the Module Name, Version Installed, sub domain you are on, and trial days remaining.
If you have not purchased a License yet, you can click the Buy Now icon and purchase a license from our site.
Note: Check that the sub domain shown in the module is the final correct sub domain you wish your license to be active on:
Click: Request License Activation
Fill in the details requested, including the store you purchase from and the email address that you used with your purchase.
Note: The email address must be the one you have on file. With SnowCovered, it is apparently possible to have more than one address on file. The address we need is the one that is in the purchase order confirmation data sent during purchase. This is the accounts primary e-mail address.
If we are unable to match the email address against a valid license activation, we return the error:
We suggest that you verify the email address used for purchase and try again with the correct address. You can also monitor your License Management on our site by logging in with the email address that you try to activate with.
With the correct details, you will receive a message like this:
You can monitor your licenses and activations by visiting our License Management page here.
Ensuring that you login to our site using the e-mail address that the license was purchased with.
We provide several Support services for our modules.
Then use the support menu to find module specific support. This will include KB Articles, Support Forums, Blog Posts.
Advanced Login module for DotNetNuke works with DotNetNuke 4x, 5x and now 6x.
However because DotNetNuke 6x has some popup effect by default with the login button it interferes with the Advanced Login Module popup mode.
To fix this issue, the solution is relatively easy.
After selecting “Popup" from the Advanced Login Basic Settings Edit the skin object login and register as follows.
Default Settings
Update to:
Login
#dnn_Login,#dnn_LOGIN1_loginLink
Register
#dnn_USER1_registerLink
Save Tab Changes
Then we need to make a small mod to the templates. After Selecting the Templates tab, click on Custom Script.
And modify the script to:
jQuery(document).ready(function(){ /* add any custom initialization logic here, */ jQuery("#dnn_LOGIN1_loginLink").attr("onclick",""); jQuery("#dnn_USER1_registerLink").attr("onclick",""); }) function custom_validate_login(){ /* add any custom login form validation logic here, return true if pass validation */ return true; } function custom_validate_registration(){ /* add any custom registration form validation logic here, return true if pass validation */ return true; }
jQuery(document).ready(function(){ /* add any custom initialization logic here, */ jQuery("#dnn_LOGIN1_loginLink").attr("onclick",""); jQuery("#dnn_USER1_registerLink").attr("onclick","");
Note: We added two new lines highlighted in yellow.
Save Tab Changes and you should be done. With the default skin in DNN 6.0.1, now the advanced login popup mode should work fine. Look at the Advanced Login Module for more assistance with configuring the module with different skins.
Today we have added this feature to the DotNetNuke Advanced Login Module.
Normally DotNetNuke requires a user name to be entered at registration. The Advanced Login Module will automatically create a DNN user name at registration time, even if the token for User Name is not included in the registration form. This way you can allow users to register with an email address and no user name, while in the background the Advanced Login Module handles the user name for you.
If omitted from the registration form, the user name will be taken from the email address.
david@domain.com for example will generate a user name using all data from before the @ symbol.
david@domain.com = david as the user name.
If david is already taken as a user name, then david-01 or david-02 etc. will be used automatically.
This keeps the username familiar to users should it ever be provided to them, yet keeps the registration process as simple as possible.
The module is available as a Free DNN Module trial on our site.
today we are please to announce that the advanced login module for DotNetNuke includes the utilisation of the single sign-on feature that has previously only been available to the Professional Edition since DotNetNuke 6.1.
Now it is possible to add this feature to your website with one simple module, that as the feature throughout your entire website and child websites on a single DotNetNuke instance.
The idea is that you create a site group, specifying the master site and included child sites. Once the configuration has been created, a user will be able to login to either the Master site or any of the specified child sites within the group using the username and password details from the master sites user database.
We have included this feature within the advanced login module, and it works with the community edition. The feature can be found on the tab called site groups:
This is a descriptive field only and is used to distinguish one site group from another. You can put anything you like in this field that will help you remember the details of the site review are creating.
This is an additional descriptive field that allows you to put text that helps you explain the meaning behind the creation of the site group you are creating. This is a reference field only and can contain any descriptive text.
The master site is the primary site that contains the user names and passwords that you wish to use to sign on to either the Master site or the child portals. It is vital that you select the correct portal to use as the Master site.
An example:
InteractiveWebs is a DotNetNuke website that has one master portal that we used to run the interactive webs website on, and dozens of child portals. Each child portal is used to represent one of the modules that we have created the DotNetNuke. There are lots of them.
When users register on the interactive webs website they are registering on our primary portal. When users visit the child portals information on a module or other service that we provide we do not encourage them to register as users on his child portals. As a matter of fact we had previously redirected the login buttons back to the primary portal so that anybody wishing to register or login is always directed back to the primary portal. This means we have an extensive user database on our primary portal.
So in this example we would definitely need to select the interactive webs primary portal as the master site as it is this site that has all of the thousands of usernames and passwords that we wish to use across all of our child portals.
The authentication domain is the domain name that is used primarily across all of the portals that the site group is using. In the case of interactive webs, we have utilised a conical redirection within the site alias settings to ensure that users of our portal remain on the same domain: interactivewebs.com even though we have multiple domain names pointing to the website.
For more information: http://www.interactivewebs.com/advancedlogin
Recently DotNetNuke launched the ability to configure Google authentication for login to your DotNetNuke website. This feature made its debut in DNN 6.2
we have updated the advanced login module to include the ability to use a token to display login options for the Google authentication system that is available in DotNetNuke 6.2 .
The utilisation of the token requires you to preconfigure your DotNetNuke website with the Google authentication provider. A good description of how to do this is available here:
How to enable or disable the DotNetNuke Google authentication system that allows users to login to DNN using their existing Google account to login to DotNetNuke.
Prerequisites. You will need to sign up for a Google Authentication account to complete this tutorial. This authentication system must be enabled by a SuperUser (see "Managing Authentication Systems") before it can be viewed and configured.
8. Click the Update Authentication Settings link. The Google login button is now displayed on the Login page and any Account Login modules.
After you have correctly configured DotNetNuke to allow the Google authentication provider. You may use the new token within the advanced login module templating system.
The token is: [login_google_button]
Which simply places button on the login page indicating that the user can utilise the Google login system.
Nothing could be simpler.
Additional information about the DotNetNuke advanced login module please visit: http://www.interactivewebs.com/advancedlogin
http://www.zendesk.com/ Zendesk is an online ticketing system designed to manage support tickets through a website interface. Zendesk is one of the more popular ticketing systems available as a software as a service.
We have included within the advanced login module the ability to login to Zendesk using your DotNetNuke user database. This makes it possible to manage all of your user support tickets for your DotNetNuke website within the Zendesk software as a service ticketing system, without having to have a separate database if users.
Configuration of this system is extremely easy. There are two settings required one is within the Zendesk interface, and naturally requires you to have signed up for services with Zendesk.
The other is within that advanced login module for DotNetNuke.
Zendesk allows you to configure a remake URL that is referenced logging in. There should be a URL on your website that has an instance of the advanced login module installed on the page. That instance of the module needs to be configured to work with Zendesk.
When a user clicks on the login button at Zendesk they are redirected to the URL mentioned above. They login to the DotNetNuke website with the normal advanced login interface of your choice. They will then be redirected back to the Zendesk helpdesk having been authenticated through your DotNetNuke user database.
Setup a page with the advanced login module installed. We recommend that you use the page that is the default login page the DotNetNuke. We have explained elsewhere in the manual how to configure this page with an admin only view of the normal all standard DotNetNuke login module, and included in instance of the advanced login module. You can then define in the administrator settings of your website to use this to find page as the login page for your website.
This does not prohibit you from using the advanced login module with more advanced modes like slide down or pop-up effect on other pages of your websites, but it does ensure that should anyone be directed to the normal login page DotNetNuke that they are presented with an instance of the advanced login module. This is the instance that will be used to configure the Zendesk settings.
Some of the great advantages of using DotNetNuke as your authentication provider for Zendesk, include the ability to integrate deeply your Zendesk ticketing system directly into your DotNetNuke website without having to cross over your user database.
Additional information is available from our website in the support page user manual.
http://www.interactivewebs.com/advancedlogin/DNNLoginModule.aspx
During the installation of the DotNetNuke Microsoft pivot module, it is necessary to several changes to be made to the web.config file. These changes allow the Silverlight pivot technology to operate on the DotNetNuke website. We have automated the installation process to automatically update the web.config file during the installation of the module.
Please remove the following things under <system.web>
<add verb="*" path="*.cxml" type="iwebs.Modules.Pivot.CXMLHandler,App_SubCode_Pivot" validate="false"/> <add verb="*" path="*.jpg" type="iwebs.Modules.Pivot.TileHandler,App_SubCode_Pivot" validate="false"/> <add verb="*" path="*.dzc" type="iwebs.Modules.Pivot.DZCHandler,App_SubCode_Pivot" validate="false"/> <add verb="*" path="*userprofile.aspx" type="iwebs.Modules.Pivot.ProfileHandler,App_SubCode_Pivot" validate="false"/>
<add verb="*" path="*.cxml" type="iwebs.Modules.Pivot.CXMLHandler,App_SubCode_Pivot" validate="false"/>
<add verb="*" path="*.jpg" type="iwebs.Modules.Pivot.TileHandler,App_SubCode_Pivot" validate="false"/>
<add verb="*" path="*.dzc" type="iwebs.Modules.Pivot.DZCHandler,App_SubCode_Pivot" validate="false"/>
<add verb="*" path="*userprofile.aspx" type="iwebs.Modules.Pivot.ProfileHandler,App_SubCode_Pivot" validate="false"/>
Also the ones under </system.webServer>
<add name="CXMLHandler" verb="*" path="*.cxml" type="iwebs.Modules.Pivot.CXMLHandler,App_SubCode_Pivot" validate="false" preCondition="integratedMode"/> <add name="JPGHandler" verb="*" path="*.jpgx" type="iwebs.Modules.Pivot.TileHandler,App_SubCode_Pivot" validate="false" preCondition="integratedMode"/> <add name="DZCHandler" verb="*" path="*.dzc" type="iwebs.Modules.Pivot.DZCHandler,App_SubCode_Pivot" validate="false" preCondition="integratedMode"/> <add name="ProfileHandler" verb="*" path="*userprofile.aspx" type="iwebs.Modules.Pivot.ProfileHandler,App_SubCode_Pivot" validate="false" preCondition="integratedMode"/> <add name="TileHandler" verb="*" path="*_files/*/*_*" type="iwebs.Modules.Pivot.TileHandler,App_SubCode_Pivot" preCondition="integratedMode,runtimeVersionv2.0"/>
<add name="CXMLHandler" verb="*" path="*.cxml" type="iwebs.Modules.Pivot.CXMLHandler,App_SubCode_Pivot" validate="false" preCondition="integratedMode"/>
<add name="JPGHandler" verb="*" path="*.jpgx" type="iwebs.Modules.Pivot.TileHandler,App_SubCode_Pivot" validate="false" preCondition="integratedMode"/>
<add name="DZCHandler" verb="*" path="*.dzc" type="iwebs.Modules.Pivot.DZCHandler,App_SubCode_Pivot" validate="false" preCondition="integratedMode"/>
<add name="ProfileHandler" verb="*" path="*userprofile.aspx" type="iwebs.Modules.Pivot.ProfileHandler,App_SubCode_Pivot" validate="false" preCondition="integratedMode"/>
<add name="TileHandler" verb="*" path="*_files/*/*_*" type="iwebs.Modules.Pivot.TileHandler,App_SubCode_Pivot" preCondition="integratedMode,runtimeVersionv2.0"/>
We have often receive lots of questions about Web-safe fonts, or web friendly fonts. We have products that work with technologies like Microsoft Word, and publish back to websites like DotNetNuke. (DNN Word Editor)
The issue is that not all fonts will work on all browsers on all computers. Here is the reason why.
There are an awful lot of fonts in the world! For years, no doubt, you’ve been using a ton of them in word processing documents, party invitations, banners, etc. But have you ever noticed how few of them are used on the web?
There’s a really good reason for this. When a web page loads, the browser is told to write text onto the screen using a specified font—one that is stored on the computer that the browser is running on. Therefore, if the web page’s code is calling for a font that a user does not have installed on their computer, it won’t show up! What that person will instead see is a default font, which might look a little ugly.
Now you might be wondering why this will happen so often if there are so many fonts installed on your computer. Well, here’s the problem: the two most widely-used operating systems—Windows and Mac OS X—each come installed with a different set of fonts. Awesome!
To illustrate this point, here’s where the fonts are stored in Windows 7:
And here’s where they’re stored on Mac OS 10.6:
Right away, we can see that only one of the displayed fonts overlaps: Arial. None of the Calibri orCambria fonts are available on the Mac, and the Mac has at least a dozen just on this page that aren’t available in Windows!
In fact, between these two systems, there are only ten fonts that overlap:
Those fonts that fall into that middle area, covered by both operating systems, are what we callweb-safe fonts. If you use Calibri on your webpage, Mac users won’t see it; if you use Andale, Windows users won’t see it; but if you use Georgia, you can rest assured that users of both systems will see the it.
Now there’s a bit of grey area here. Users of older operating systems don’t have some of these fonts we’ve declared web-safe. For example, Windows XP users don’t have Palatino or Trebuchet MS. Even worse, users of Android mobile phones don’t have any of these fonts.
So to be clear, there are only five fonts that are considered universal:
Feel free to use these fonts all you want! Even if you dug up that old Packard Bell you had back in 1997 and it didn’t explode when connected to the modern web, you’d be able to see these fonts rendered as intended. Those Android users will just have to fight for themselves.
*The green marks show very common fonts, the yellow shows not so common but all are generally accepted as web safe.
Your text will still be visible, but the browser will use whatever default font it supplies for situations like this. This means that you may have intended to use a cute, scripty font, but what you get is
Your text typed in a regular serif font.
This is good because your content still goes through, but your design might be compromised. Therefore, you should always specify fallback fonts and a category that the font falls into. Let’s say that you want to use Helvetica, but you’ll settle for Arial. Since both of these fonts are considered to be sans-serif fonts, you can write a CSS declaration like this:
{ font-family: Helvetica, Arial, sans-serif; }
The browser will first try to use Helvetica, and if it’s not installed, it’ll attempt to use Arial. If even that font is not available, it’ll use whatever default sans-serif font the browser likes, but at least it’ll be the correct type of font!
For more information about coding fallbacks, alternative methods to using non-web-safe fonts, and everything typography related, you can pick up a copy of our Web Typography Handbook. It’ll tell you everything you need to know.
Today we announced that our DotNetNuke Module for syncing to outlook was updated to DNN 6. Check out the details here.
http://www.dotnetnuke.com/Resources/Forums/forumid/112/threadid/451288/scope/posts.aspx
I noticed a question today on a Microsoft Dynamics CRM discussion site asking
“is there anyone who is not trying to sell me their product, that has done something interesting with CRM and Silverlight?”
Well yes there is…
InteractiveWebs have done several interesting projects with Silverlight as an interface to Microsoft CRM.
One of the most interesting of these is a Silverlight membership login system for a grain trading company based in Australia. The business is an organisation that trades produce in a similar way to how shares are traded in the stock market. The difference being that the commodity being traded has been grown by “growers” (farmers) and represents the produce that their farm has for sale in the open grain trade market.
Interestingly, Microsoft CRM is being used entirely for the backend management of this trading. This is quite complex in it’s design as you can imagine would be the case if you were running a stock exchange using CRM.
Entities are being used to track the bidding for sales and purchasing of hundreds of different qualities of different grains, at different locations over an entire country.
Of note to the Silverlight interface, is the fact that there are an ever increasing number of records within this system in the order of 65,000,000 records of some CRM Entities.
In it’s simplest function, the Silverlight interface is a membership system.
Allowing users to login and manage the buying and selling of commodities. Very similar to how users of a Stockbroking system would login and buy and sell their shares. But of course the user data is all being driven from a CRM backend running CRM 2011 with IFD.
The membership login is using custom attributes within CRM Contacts to authenticate and allow login.
Once logged in the user can modify personal details that are saved back to the CRM Contact entity.
Data is retrieved live using XRM to interface with CRM on the fly. Silverlight gives a clean and robust interface for users.
Just like with the sale of share, there is some paperwork generated with the buying and selling of commodities. Broker Notes, Freight Invoices, and Monthly trade Statements are example of just a few. Originally the thought was to interface with a Microsoft SharePoint server to store the related .PDF documents generated for these items. Instead we took the simpler approach of attaching the .PDF documents to the relevant records in the custom entities that are used to track each trade.
This data is simply stored as CRM Notes with Attached Files (.pdf) to the custom Entities.
Then in the Silverlight interface we allow users to open (on the fly) these notes and attached .pdf files to view the “paperwork” associated with each sale.
Summary data is presented that is referencing custom attribute data, and able to be exported live from Silverlight to Excel.
Or clicking on the PDF icon, will open the associated attached note from CRM and open the .pdf record live.
Example of PDF data.
Growers of commodities can create new stock records, listing the gran they have, quality, quantity, location etc in a simple user interface.
Listing too the price they wish to achieve in order to sell the produce.
Doing this creates a new record in a custom Entity in CRM directly, and this data is used in the bidding and selling process.
The data is available to Silverlight users in their record of stock.
Similar in concept to a statement of shares for a stock market trader.
So far, these are reasonably simple interfaces using XRM to CRM. Reading, writing, opening attached files etc. Where it gets interesting is in some real time graphing that we do to show bids on stocks / commodities.
For this we are needing to access tens of thousands of records that represent different bids for different commodities and work out on the fly the best or highest bid, and show that to the client in a fast loading graph.
This is where Silverlight and some cleaver XRM calls to some cleaver processes in CRM delivers a great result.
With the great graphing tools in Silverlight, the graph draws in real time and animates the loading of data. It has a full screen mode:
And is really a great use of Silverlight for this particular task.
One of the features we built on this interface is the ability to “Run Out of Browser”. So the client can right click the interface and select to “Install to this computer”.
This adds the project to an Out of Browser Silverlight experience that can be launched as any other application or program from your computer.
This feature of Silverlight can run on a Mac or PC, and delivers an experience for end users that is very similar to having a membership program installed on your computer.
The project will auto update if we modify the web based source version with a new release automatically. The client is promoted with a messaging saying the program will close to update, then opens with the new version automatically. Truly using the best experience that Silverlight has to offer.
Uninstalling the out of browser app is as simple as a right click in the app, and selecting from a dropdown “Remove this application”.
Kind of like a windows 8 experience with any pc.
Silverlight… ahhh what to say about Silverlight….. where to start.
1. We drank the Kool Aid. Microsoft told us how great Silverlight would be, how it would segregate the design team from the development team and deliver the benefits of keeping people within their specializations.
2. We spend years of time investing in Silverlight development. We get it, we can work with it and we can do amazing things with it. This and other cool projects including a MS Pivot interface to DotNetNuke and Microsoft CRM data.
MS Pivot and CRM – http://demo.interactivewebs.com.au/dnnpivot/dnnpivot_demo.htm
3. We kicked it’s butt. We were able to deliver anything we wanted using Silverlight and made it interface with a multitude of data sources at multiple times using XRM and other web services to pull data from both CRM and other data sources.
We get it, we can do it, we hate it and we regret the time we wasted after Microsoft mislead us into their Silverlight sphere.
Microsoft Silverlight Evangelist – We drank the Kool Aid
Silverlight never came close to delivering on any of the promises that Microsoft made about it.
It is tricky to develop in, it is poorly supported by even Microsoft, design tools are definitely lacking greatly, the development experience was a mine field of poorly documents bugs and broken features that required time and commitment to untangle the crap that Microsoft produced.
It was amazing to us how many things we were doing and solving that literally no one else was talking about. We felt like the first team walking on the Silverlight moon at every step of the way.
The end result is something that we are proud of. There are some cool features that we think make the project example above shine. But for all the time, and trouble invested to deliver it, it is just not worth it!
If looking at this and other similar projects again, we would use other technology to more quickly develop a very similar experience. There quite simply is nothing in Silverlight in interfacing with CRM that we can do easier other ways.
So there you have it. A good example of Silverlight with CRM, and the reason why we would suggest you use other technology yourself.
And check out that Silverlight Pivot link above. It is actually very cool too in what it does and how it does it. We have rigged this to work against any internet facing CRM environment including the Microsoft Hosted CRM.
We wrote this to help someone asking for a non commercial plug for a Silverlight in CRM example. We hope the above meets the requirement of that… but we are a development and CRM business, so we need to mention that if you need some cleaver interfacing with CRM. Then please contact us here http://www.interactivewebs.com/ContactUs.aspx.
We have other examples to show too.
Recently we launched a new website called Network You. The site can be found at networkyou.org.
Of particular interest on the site is a new module or ours soon to be released to the DotNetNuke Community called Mushroom Video Module.
The module will feed Youtube Play Lists from youtube.com directly into your site in an easy to manage and easy to use video feed.
The end result of the feeds looks like this:
http://www.networkyou.org/Network/GlobalVillage.aspx
With the video feeds being selected directly from a play list selector button that referenced a YouTube account name.
The module also uses the template system developed by InteractiveWebs for the display system that allows simple to load templates to be customized to the users requirements.
An example of the module with multiple feeds onto a single page is this one: http://www.networkyou.org/Network/Professionals/VideoTopics.aspx
We will be releasing the module to the public in the next few weeks. We would love to hear any comments!
Steps to add an Attachment Field to Feedback Designer Module for DotNetNuke.
The result is a form with file upload ability. The attachment is sent as an email attachment.
Please contact us for additional DotNetNuke Support requirements.
The Bulk Email module for DotNetNuke has a feature known as Bounce Email Monitoring, and it is probably a good idea to understand what it does and how it does it so we can explain how best to configure it.
When an email message is generated using the DotNetNuke Bulk Email Module, a list of all the email addresses that you have selected from multiple sources is generated into a database.
The lists that you select can include.
Once the list is complied, email addresses are removed.
Then the email messages are sent out and ticked off as being sent.
You can see that bounced email addresses will only be removed if they are on the bounced email list, and have bounced to a count matched the settings configured.
Periodically, the module will use the setting for the POP 3 account to look for email messages that it can add as a bounce. To do this, it will download all messages in the mailbox and look using some complex searching tools for email messages that appear to have bounced back from a failed send attempt.
Unfortunately email servers report bounce messages in different ways, so the code that reads the email messages and looks for bounce backs is long and complex. For this reason, the process of finding bounce messages should be kept to a minimum to reduce the load on the server.
The best way to reduce load is to minimise the number of mail messages that the process needs to check.
The best way to do this is three fold.
The process of downloading thousands of email messages, checking them all and processing them all can take hours. It will put a huge load on both the web server and your email server. It will increase your data transfer costs both on your web and email server.
So follow the suggestions and the result should be clean and fast.
Want to know more about email messaging in DotNetNuke.