Friday, June 12, 2015

Community Documentation Site for Sitecore

There is a very very useful documentation site which is written by Sitecore employees.

http://sitecore-community.github.io/docs/



Most of you may already knew about this site, but I found it today Only :-D

Hope this will help someone!!

Tuesday, June 9, 2015

Data Flow - Sitecore WebForms For Marketer (WFFM) - Part I

In this Blog post series, I will discuss about the Data Flow of Sitecore 8 - from front-end website to MSSQL Databases


1) Data Flow - Sitecore WebForms For Marketer (WFFM) - Part I
2) Data Flow - Sitecore WebForms For Marketer (WFFM) - Part II


Setting Up :


1) Create WFFM Form


2) Add newly created WFFM form to Item Presentation Details


3) Publish

4) View it in Front Website

5) Empty Forms Reports
As you can see from the below image, WFFM reports does not have any records. So, we will start with a fresh copy of WFFM.




Data Injection :

Enter Data to WFFM form fields and click "Submit"



Data Flow :

1)  Front Webpage to Session

User enters data into wffm form and click "Submit" button
You can view the data going from front webpage to server by using Fiddler tool (see Screenshot below)



2)  Session to MongoDB database

Sitecore migrate data from Session to MongoDB only when user session is ended.
By default session end time will be 30mins. You can adjust that time by adding "timeout" parameter to <forms ... > tag as below

    <authentication> 
        <forms name=".ASPXAUTH" cookieless="UseCookies" timeout="2" />
    </authentication>


  • Empty MongoDB - Before processing any data
As you can see in the below image, there is still no MongoDB collection related WFFM, inside the analytics database




  • After processing WFFM form data to MongoDB
When the data was processed to MongoDB at the end of the user session timout, a new collection (FormData) is created inside the analytics database.

Below image displays how data is stored into MongoDB "FormData" collection




That is it for the first part.

In the next part, we will discuss some issues/bug with WFFM module and fixes, when migrating content from MongoDB to MSSQL "reporting" database as well as how these data is processed into MSSQL database tables.

see you soon!!

Thursday, June 4, 2015

Sitecore 8 WFFM Data Aggregation Error

Issue : 

WFFM Data not aggregated (transferred) from MongoDB to MSSQL Reporting database

Error :

 8184 18:38:35 ERROR Error during aggregation.
Exception: System.Data.SqlClient.SqlException
Message: T-SQL ERROR 242, SEVERITY 16, STATE 3, PROCEDURE (null), LINE 231, MESSAGE: The conversion of a datetime data type to a smalldatetime data type resulted in an out-of-range value.
Source: .Net SqlClient Data Provider
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,
.....


Sitecore Version :  

8.0 Update-2  & 8.0 Update-3


Solution :


Adding following configuration (if not exists) into /App_Config/Include/Sitecore.Analytics.Processing.Aggregation.config file

             <!-- Facts -->             
            <SqlMappingEntity type="Sitecore.Analytics.Aggregation.SqlMappingEntity, Sitecore.Analytics.Sql">
              <Table>Fact_FormStatisticsByContact</Table>
              <Routine>Add_FormStatisticsByContact</Routine>
            </SqlMappingEntity>          
     

 Run following SQL on Reporting Database

--------------------------------------------------------------------------------------------------------------------
 CREATE PROCEDURE [dbo].[Add_FormStatisticsByContact]
  @ContactId [uniqueidentifier],
  @FormId [uniqueidentifier],
  @LastInteractionDate [datetime],
  @Submits [int],
  @Success [int],
  @Dropouts [int],
  @Failures [int],
  @Visits [int],
  @Value [int],
  @FinalResult [int]
AS
BEGIN

SET NOCOUNT ON;

  BEGIN TRY

    MERGE [dbo].[Fact_FormStatisticsByContact] AS t
    USING
    (
      VALUES
      (
        @ContactId,
        @FormId,
        @LastInteractionDate,
        @Submits,
        @Success,
        @Dropouts,
        @Failures,
        @Visits,
        @Value,
        @FinalResult
      )
    )
    as s
    (
      [ContactId],
      [FormId],
      [LastInteractionDate],
        [Submits],
        [Success],
        [Dropouts],
        [Failures],
        [Visits],
        [Value],
        [FinalResult]
    )
    ON
    (
      t.[ContactId] = s.[ContactId] AND
      t.[FormId] = s.[FormId]
    )

    WHEN MATCHED and (t.[LastInteractionDate] < s.[LastInteractionDate]) THEN UPDATE SET
      t.[LastInteractionDate] = s.[LastInteractionDate],
      t.[Submits] = s.[Submits],
      t.[Success] = s.[Success],
      t.[Dropouts] = s.[Dropouts],
      t.[Failures] = s.[Failures],
      t.[Visits] = s.[Visits],
      t.[Value] = s.[Value],
      t.[FinalResult] = s.[FinalResult]

    WHEN NOT MATCHED THEN
      INSERT(
      [ContactId],
      [FormId],
      [LastInteractionDate],
        [Submits],
        [Success],
        [Dropouts],
        [Failures],
        [Visits],
        [Value],
        [FinalResult]
        )
      VALUES(
      s.[ContactId],
      s.[FormId],
      s.[LastInteractionDate],
        s.[Submits],
        s.[Success],
        s.[Dropouts],
        s.[Failures],
        s.[Visits],
        s.[Value],
        s.[FinalResult]
        );

  END TRY
  BEGIN CATCH

    DECLARE @error_number INTEGER = ERROR_NUMBER();
    DECLARE @error_severity INTEGER = ERROR_SEVERITY();
    DECLARE @error_state INTEGER = ERROR_STATE();
    DECLARE @error_message NVARCHAR(4000) = ERROR_MESSAGE();
    DECLARE @error_procedure SYSNAME = ERROR_PROCEDURE();
    DECLARE @error_line INTEGER = ERROR_LINE();


      RAISERROR( N'T-SQL ERROR %d, SEVERITY %d, STATE %d, PROCEDURE %s, LINE %d, MESSAGE: %s', @error_severity, 1, @error_number, @error_severity, @error_state, @error_procedure, @error_line, @error_message ) WITH NOWAIT;



  END CATCH;

END;
GO
 --------------------------------------------------------------------------------------------------------------------

Note : Thanks Sitecore Support for proving the above Fix.

Saturday, May 23, 2015

Sitecore Marketplace Module - Lang Item State Change Workflow Action

I have converted one of my earlier blog posts into Sitecore Marketplace module.

Marketplace Module Link :
https://marketplace.sitecore.net/en/Modules/L/Lang_Item_State_Change_Workflow_Action.aspx

This is a simple workflow action which can be used to take only defined language item to a defined workflow state.

Just installed this and Workflow action will be available in Templates/User Defined section
/sitecore/templates/User Defined/WorkflowAction/Lang Item State Change Action



This action can be added inside Workflow states to execute.




Hope this will be useful for someone!!

Monday, May 18, 2015

Importance of Case-sensitivity of hostName attribute of Sites config node

Today, we faced a strange issue, which questioned my knowledge of Site Definition configurations in Sitecore :-D

One of my colleague had a Sitecore instance with site definition had hostnames defined.

Ex:

<site name="website" hostname="abc.xxx.local" virtualFolder="/" physicalFolder="/" rootPath="/sitecore/content" startItem="/home" database="web" domain="extranet" ... />


But, he had his IIS site defined with "xxx.local".

Even though hostname attribute is "abc.xxx.local", request to "xxx.local" works fine and match to the "website" site definition.

This made me confused as my knowledge said only request that should map to "website" site defition is request with same value as hostname attribute value.

I had a quick google search and found my thinking was correct.
https://sdn.sitecore.net/SDN5/Articles/Administration/Configuring%20Multiple%20Sites/Configuring%20Sites%20in%20web,-d-,config%20File.aspx

So, when Sitecore it self saying this, how is this not working accordingly is my next question.

Then, I found Jon West's following blog post about hostName setting, which explained the real issue with our setting.
https://www.sitecore.net/learn/blogs/technical-blogs/john-west-sitecore-blog/posts/2013/08/mapping-hostnames-to-sites-with-the-sitecore-aspnet-cms.aspx

Quote :
As a word of caution, in several cases I have seen where device resolution did not work as a developer expected, the issue was that their configuration used hostname (with a lowercase n in the attribute name) rather than hostName (with an uppercase N). Be sure to capitalize the N.

 After changing "hostname" to "hostName", everything started to work accordingly. :-)

Sunday, May 10, 2015

Languages.AutoRemoveItemData Setting - Sitecore Setting of the Day

While I'm looking through the web.config settings, I saw an interesting setting which took my mind to past.

Few months back, one of my previous workplace colleague told me that a trouble he went through while trying to delete an language in Sitecore. After he had deleted a language in Sitecore and looking into the items in content editor, item versions related to that language has also been deleted from Sitecore. They had to work hard to make everything Okay in the system.

The setting which remind me the above scenario is,

<!-- LANGUAGES AUTO REMOVE ITEM DATA
       Indicates if item data is automatically removed from a database when a language is deleted.
       Default value: true
-->
<setting name="Languages.AutoRemoveItemData" value="true" />


So, if you have set the above property to false, and then deleted the language, items will remain with Sitecore.

But, off-course, there should be steps taken to make this removal sensible, since there is no point of having items of Non-existing language :-D

Thursday, May 7, 2015

Weekly Blogging Challenge of our Team - Week 1

To grow our self together, our team has started a weekly blogging challenge.

So, following are the our come of first week. (I know these blog posts are not in expert level. But, I am sure our team will grow and provide more advance blogs in the future)


All about Sitecore Instance Manager (SIM 1.3) by Udara Rajarathna

How to access Sitecore Items and Languages using API by Prageeth Roshane (Sitecore Labs Blog)

How to setup WFFM module by Pasan Samarakoon (PS Solutions Blog)

Contact not adding to Contact List in Sitecore 8 update-2 and Ways to access Template builder by Chaturanga Ranatunga (Sitecore Footsteps Blog)

see you in our new Blogging challenge. :-)