Author Archives: Toby Gutierrez

About Toby Gutierrez

Solutions Architect | 2015 - 2019 Sitecore Technology MVP

No Analytics Tracking in Sitecore 8.1

Recently, I was diagnosing an issue as to why Sitecore Analytics was not working for one of our 8.1 recent installations. I started with this helpful blog post by one of the guys at nonlinear digital:

http://www.nonlinearcreations.com/Digital/how-we-think/articles/2015/10/Troubleshooting-Sitecore-8-XP-Analytics.aspx

Well, after thoroughly going through all the steps my analytics were still not working and no data was being received by MongoDB in my Interactions collection and my Reporting database (analytics) was not receiving any data. After speaking with Sitecore Support, they mentioned that in the Global.asax file you must derive from the Sitecore.Web.Application to support the session end handler. When I checked my Global.asax it was set to derive from System.Web.HttpApplication. Once I set to derive from Sitecore.Web.Application this cleared up a couple of errors within the solution relating to the VisitorIdentification SitecoreHelper for MVC (@Html.Sitecore().VisitorIdentification()) and using statement (@using SItecore.Mvc.Analytics.Extensions). But most important, tracking started working as my collections in MongoDB and Reporting DB started receiving data.

Moral of the story, don’t miss this step upon setup of your solution in the beginning of your setup to work with Sitecore 8 as it will prove hard to diagnose. Hopefully, this helps out others who run across this situation. Happy coding!

5 Steps To Content Editor Ribbon Buttons Using Sitecore Powershell Extensions

I have been playing around with Sitecore PowerShell Extensions now for about week or so and love the module. If you haven’t had an opportunity to really dive into SPE, I highly recommend you take a little time to learn a little bit about it as it will really open your eyes on how to get things done in Sitecore fast and efficiently. There is a bit of learning curve, but the reward is worth it when you see just how quickly you can get things done with little code once you get the hang of things. Here is a link to the SPE module on the Sitecore Marketplace:

https://marketplace.sitecore.net/Modules/S/Sitecore_PowerShell_console

For this blog post, I am going to be doing a walk-through of a basic Language Version Utility. I will show how to create a button in the ribbon that when clicked upon will show a dialog box with some instructions and a drop-down list, then allow the user to select a value from the drop-down list, and then and then execute a script passing in the value from the drop-down list as a parameter. All using Sitecore PowerShell Extensions and not one bit of C# code folks! Yes, I was blown away by this as well! You don’t even have to create the buttons in the ribbon the traditional way in the Core database as you typically needed to. SPE does it all for you!

Okay, enough of my excitedness (might not be a word, but I’m excited) on this module and let’s get down to business.

Step 1: I started with downloading the module and installing it. I know you got that part covered so moving on.

Step 2: Next, I right-clicked the Script Library item at /sitecore/System/Modules/Script Library and then Insert–>Module. I named it Language Version Utility and then clicked on the check box for Content Editor Ribbon then clicked Proceed. After a little bit, the script finishes and I have a new PowerShell Script Module called Language Version Utility in the Script Library. That looks something like this:

New Module Called Language Version Utility

New Module Called Language Version Utility

Step 3: For this utility I wanted to put a couple of buttons in the Versions tab of the Contextual Ribbon and group them in a chunk. Using SPE, all I had to do was create a new PowerShell Script Library under Versions, which I named “Copy” and then I simply added to 2 PowerShell Scripts called “Copy To Version” and “Create Versions” as children of “Copy” as such:

New Copy Chunk In Versions Tab Of Contextual Ribbon

New Copy Chunk In Versions Tab Of Contextual Ribbon

Step 4: I just picked some icons that I think would be snazzy for the PowerShell Scripts, “Copy To Version” and “Create Versions”, and then on to a super cool part. I simply opened up the PowerShell ISE in the Development Tools of the Sitecore Admin Desktop as seen below:

PowerShell ISE In Sitecore Desktop Development Tools

PowerShell ISE In Sitecore Desktop Development Tools

Then I clicked on the Settings tab, and clicked on the Rebuild All drop-down, and then clicked the option for Sync Library with Content Editor Ribbon. A script will run, and voila now I have a new chunk in the Versions Tab of the Contextual Ribbon called “Copy” with 2 Large buttons called “Create Versions” and “Copy To Version”:

Copy Chunk In Versions Tab Of Contextual Ribbon

Copy Chunk In Versions Tab Of Contextual Ribbon

Step 5: Now it’s time to start creating my script I want to run when I click either of the buttons. For this example, I will only discuss the “Create Versions” button. So all I have to do is right-click on the “Create Versions” PowerShell Script item and then click on “Edit with ISE” as seen below:

Edit With ISE

Edit With ISE

That will take me right into the PowerShell ISE so I can start creating my script I want to run when I click the “Create Versions” button.

The scripting itself is out of scope on this post, as you will need to familiarize yourself with the scripting using the manual to really start understanding how to script. However, I will post up my script that I used and give you some pointers on what I did to show you. Keep in mind that there are many examples that also come with the module as well. Look for what you can in the examples, repurpose, extend, and ask questions to those in the Slack channel for “module-spe” and you will be sure to receive some help from some Sitecore folks. We are all here to help!

Anyways, here is my script that runs when I click the “Create Versions” button:

$result = Read-Variable -Parameters `
 @{ Name = "languageItem"; Title="Choose A Language"; 
 Source="DataSource=/sitecore/system/Languages"; 
 editor="droplist"} `
 -Description "This script will recursively create language versions for each item under the currently selected node in the content tree using the selected language below. Make sure the correct node is selected now in the content tree. If not, cancel and choose your node in the content tree and try again." `
 -Title "Create Versions Script" -Width 400 -Height 200 -OkButtonName "Create Versions" -CancelButtonName "Cancel" -ShowHints

if($result -ne "ok")
{
 Exit
} 

Get-ChildItem -Recurse . | Add-ItemLanguage -TargetLanguage $languageItem.Name

Basically, I am creating a variable called $result that is taking a result from the Read-Variable cmdlet. Keep your eye on the Name parameter as we will use $languageItem later in the script as that is where the value will be stored when the user chooses a language. This can be a bit confusing at first. You will notice there is also a title, description, and some specs on the dialog box. But once, we get to the bottom, that’s where the important part is. I am basically getting the child items recursively of the item that was selected in the content tree, then adding a new version to each of the child items in the selected language from the user input, which in this case is Spanish. In order to create the version I needed the language name, which I got from the $languageItem.Name. Once this script is saved (after thorough testing in PowerShell ISE to ensure its working), we can try it out.  Let’s take a look at what happens now when I click on the “Create Versions” button using my selected item in the content tree and using a new language I added for Spanish:

Selected Item In Content Tree With No Child Spanish Versions

Selected Item In Content Tree With No Child Spanish Versions

Script Output For Create Versions

Script Output For Create Versions

Now, for those wondering, I could just have well put in a droptree in here to select a content tree item instead of having the user choose an item from the content tree and then click the button. However, I felt this might be a better user experience and a non-duplication of efforts. Also, that type of utility might be found in the Control Panel. But, remember…with SPE you can take advantage of all that and so much is possible! So experiment with what you feel works for the client!

Anyways, I choose the Spanish language and click on Create Versions and my script runs and when it’s done I now have a Spanish version for “Sample Item CA” and “Sample Item CB”.

New Spanish Version of Sample Item CA

New Spanish Version of Sample Item CA

Again, all this was done with no C# code at all! SPE is awesome, and I am sold on the efficiency and ease of use now after diving in first-hand and gaining some knowledge. I will be blogging on the module much more as I gain more familiarization with more advanced topics. Happy coding!

Typical Roles and Permissions Setup for Sitecore 8+

When initially setting up the roles and permissions for your new Sitecore 8+ site, you may be asking yourself what roles do I need for my organization typically? When you use the Role Manager to create your roles you may be asking yourself what roles do I need to create and what roles do they need to be a Member Of so my that role can have the correct functionality in Sitecore to perform their job? You also may be asking what permissions do I need to give to these roles in Security Manager?

Below is a typical setup seen in a lot of companies that are using Sitecore 8+. Keep in mind that the business needs will dictate what roles you may have and also that someone may be in more than one role, one person may be all roles, or there may be a separate person for each role. It’s all up to the business and it’s all customizable to the business needs.

Typically, you will want to have a couple of Administrators on the site so someone can always get in and perform Administrative type of duties if someone on vacation or out for some reason. This is as simple as choosing your power Sitecore user at the company and then typically Developers have Administrator access as well. Some will choose to create a Global SItecore Administrator role, which is a member of all roles. This works fine too. The added benefit, if needed, is that this role DOES NOT bypass workflows like the Administrators account does. In addition, it’s easy to see who your administrators are in one role.

As for everyone else that is non-designated power user or a developer, they will fall into one of these typical role buckets. Examples are for a company called “Sitecore Sandbox”:

SS Content Editor:

Typically, the Content Editors are the marketing or web team that are going to be in charge of editing content in Sitecore.

Member Of:

  • Author
  • Designer
  • Experience Editor
  • Sitecore Client Translating

SS Content Publisher:

Typically, the Content Publishers are the marketing team managers that will make final decisions to approve the content and then publish it live to the web.

Member Of:

  • SS Content Editor
  • Sitecore Client Publishing

SS Marketing Analyst:

Typically, the Marketing Analysts are the marketing team people who will be analyzing the effectiveness of the marketing efforts and possibly putting together reports for higher ups.

Member Of:

  • Analytics Reporting
  • Analytics Advanced Testing
  • Analytics Management Reporting
  • Analytics Content Profiling
  • Analytics Testing
  • Analytics Personalization

SS Marketing Administrator:

Typically, the Marketing Administrators are the marketing management team that has all the functionality of the Marketing Analysts but can also edit content as well.

Member Of:

  • SS Content Editor
  • SS Marketing Analyst

The permissions can be setup easily by going into the Security Editor and selecting the role you want to give permissions to. You will want to give read/write/rename/create/delete/administer permissions based on the role, but typically read/write/rename/create/delete is sufficient.

Now, when you setup the users in those roles they may not see what all they have access to UNLESS they check the “Hidden items” checkbox in the Views tab–>View chunk in the Contextual Ribbon. Make sure they know to do this or you may have them coming back to you with questions and you may be scratching your head on why they can’t see the items they need access to. Happy coding!

10 Steps to Setup MongoDB as a Windows Service with Sitecore 7.5+

If you are doing development work with SItecore 7.5+ and beyond, you may want to set up MongoDB to connect to Sitecore locally or on your DEV, QA, STAGING servers. This is just a brief tutorial on the steps needed to set up MongoDB on your as a service, and then validate that it is connected to your local SItecore instance via RoboMongo. This post relates to Sitecore versions 7.5 and up.

  1. Download the MongoDB installer here: MongoDB
  2. Install using the Custom installation so you can change the default location. Typically, I put all my projects and websites on a separate non-operating system drive such as a D: drive. I installed to D:/MongoDB/.
  3. In the folder “MongoDB” create a folder called “data” and inside that folder, create a folder called “db”. These will not be created for you during install so you will need to create them.
  4. Create a new .config file in the “MongoDB” folder and name it “mongo.config”. This is where we will store the configurations for MongoDB.
  5. Copy/paste the configuration into the new “mongo.config” file and modify to your specific workstation:
    dbpath=D:\MongoDB\data\db
    logpath=D:\MongoDB\log\mongo.log
    smallfiles=true
  6. Next, look in the “MongoDB” folder. You may need to create the “log” folder and put a “mongo.log” file in the that folder for the next line to succeed if it was not created during the installation of MongoDB.Now, install MongoDB as a Windows Service, so it will start every time you start-up Windows and stay running. Open up a Command Prompt (Run As Administrator) and type in the following (modify if needed for your filepaths):
    D:\MongoDB\bin\Mongod.exe --config D:\MongoDB\mongo.config --install
  7. This will create a new windows service called MongoDB. Now, to start the service simply type in the following:
    net start MongoDB
  8. You can use GUI tools like RoboMongo to work with Mongo data. Typically, Sitecore connections strings are already setup OOTB so you really just need to set up MongoDB. If you want to verify that your data is being stored then simply download RoboMongo. The example below is using MongoVUE, but I don’t recommend as it has been problematic in the past to download from their website. However, the process is basically the same for RoboMongo.
  9. Once installed you simply click the green plus icon to add a connection, then type in the name of the connection, and the server. Since, you this is on your local workstation you will use localhost OR 127.0.0.1 then save.

    Add Connection In MongoVUE

    Add Connection In MongoVUE

  10. Now you should be able to see your connection listed in MongoVUE, and if you expand the connection you will see your tables and data being captured from Sitecore.

    Sitecore Experience Data Is Connected

    Sitecore Experience Data Is Connected

During the making of this blog post, I referred to these blog posts below, which helped me to achieve setting up my local developer workstation to run MongoDB as a Windows Service and connect it to a Sitecore 7.5+ instance. One last thing, if you are using SIM (Sitecore Instance Manager), you can also perform all the above in one click. Happy coding!

Setting up MongoDB on Developer Machine:
https://briancaos.wordpress.com/2014/10/01/sitecore-and-xdb-setting-up-mongodb-on-your-developer-machine/

Install MongoDB on Windows:
http://www.mkyong.com/mongodb/how-to-install-mongodb-on-windows/

Glass.Mapper Page Editor Support for Children & Items using MVC

Typically, using Glass.Mapper with MVC you can make a field editable by calling the Model that was passed to the View as follows:

@using Glass.Mapper.Sc;
@inherits Glass.Mapper.Sc.Web.Mvc.GlassView<SitecoreSandbox.Models.NavigationViewModel>

<h1>@editable(x => x.Title)</h1>

But what about if you need to make an field editable that is not in the Model such as a Site Settings item field? Glass.Mapper has an overloaded method to pass in any model. Take a look at how I get my Site Settings item by using the “siteModel” variable after it is set to the item as a “Site” model (model generated by TDS code generation):

@using Glass.Mapper.Sc;
@inherits Glass.Mapper.Sc.Web.Mvc.GlassView<SitecoreSandbox.Models.NavigationViewModel>
 
@{ var siteModel = new SitecoreContext().GetItem<SitecoreSandbox.Models.Site.Site>(SitecoreSandbox.Helpers.Configuration.GetSettingsItem().ID.Guid); }

<a href="/">
     @RenderImage(siteMdoel, x => x.Site_Logo)
</a>

Also, you can make the children of an item editable by using a BeginEditFrame method in Glass.Mapper. Again, only the Model.Children are available to the View via the passed in Model (NavigationViewModel which was created in another post where I talk about using ViewModels), but I want the children to be editable to my Content Editors. I can accomplish this as follows:

@using Glass.Mapper.Sc; 
@inherits Glass.Mapper.Sc.Web.Mvc.GlassView<SitecoreSandbox.Models.NavigationViewModel> 

<ul>                 
    @foreach (SitecoreSandbox.Models.Site.Navigation.Navigation_Item navigationItem in Model.Children)                 
    {                     
        using (BeginEditFrame(navigationItem.Url))                     
        {                         
            <li>                             
               @(RenderLink(navigationItem, x => x.Link, isEditable: true))
            </li>                     
        }                  
    }             
</ul>

Glass.Mapper and TDS Code Generation are a great tool for your toolbox, and here is just a bit more knowledge to pass along when using Glass.Mapper and MVC to ensure Page Editor support. Happy coding!

Using ViewModels in MVC with TDS code generation and Glass.Mapper

So, first and foremost, I want to thank the guys over at Hedgehog Development for developing this wonderful tool TDS (Team Development for Sitecore) for the Sitecore community. In my experience, it is not just a handy tool in the toolbag, it’s now become a way of life and is on my best practices list where I just don’t see myself ever developing without it (unless I have to…boo!). There are many features, but the one I love the most is the ability to do code generation utilizing Glass.Mapper as the ORM. What might take you days to develop models for your Sitecore templates depending on how many templates are in the Content Tree, takes only minutes with TDS code generation. This is definitely a time saver for your development team, and once you have developed with it before, and try to build out models in MVC on your own, you will quickly realize you were spoiled with TDS code generation. It’s definitely a return on investment in terms of saved development time for your development firm and I highly recommend!

Ok, so now down to the main reason I am putting up this post, which is using ViewModels in MVC to help gain additional functionality with Glass.Mapper. After getting everything setup with TDS and code generation, I proceeded to start on my development efforts and needed to get the datasource of a component on my home page, then get the children of that datasource and use those items (Navigation_Item) in my NavigationComponent to render out my navigation. Since, I generated the classes, I needed to create a ViewModel class and inherit from my Navigation_Folder like so:

using Glass.Mapper.Sc.Configuration.Attributes;
using System.Collections.Generic;
 
namespace SitecoreSandbox.Models
{
    public class NavigationViewModel : Site.Navigation.Navigation_Folder
    {
        [SitecoreChildren]
        public virtual IEnumerable<Site.Navigation.Navigation_Item> Children { get; set        ; }
    }
}

Using this ViewModel I can inherit all the properties of the Item AND create additional functionality such as getting the children of the Navigation_Folder now. Glass.Mapper makes this so easy for us. However, be sure to add the [SitecoreChildren] configuration attribute! Otherwise, the Children property will always come back “null” and you will be scratching your head as to what is wrong. Here is more on children if you are interested.

Now, I just get the datasource from my Navigation Component using my NavigationController making sure I inherit from GlassController:

using Glass.Mapper.Sc.Web.Mvc;
using System.Web.Mvc;
 
namespace SitecoreSandbox.Controllers
{
    public class NavigationController : GlassController
    {
        public Models.NavigationViewModel Model { get; set; }
 
        public ActionResult Navigation()
        {
            Model = this.GetDataSourceItem<Models.NavigationViewModel>();
            return View(Model);
        }
    }
}

Then I pass my NavigationViewModel over to my View and I can iterate through the Navigation_Items that are children of my Navigation_Folder to render my navigation:

@using Sitecore.Mvc
@using Sitecore.Mvc.Presentation
@using Glass.Mapper.Sc;
@model SitecoreSandbox.Models.NavigationViewModel
 
<ul>
    @foreach (SitecoreSandbox.Models.Site.Navigation.Navigation_Item navigationItem in Model.Children)
    {
       <li class="mainNavItem"><a href="@navigationItem.Link.Url">@navigationItem.Link.Text</a></li>
    }
</ul>

So, you can see you can use a ViewModel to gain the additional functionality you need while still using TDS code generation and Glass.Mapper.  Overall, TDS code generation, Glass.Mapper, and ViewModels in MVC will have you doing your Sitecore development like a BOSS in no time! Happy coding!

Helpful Tips to Troubleshooting Sitecore Issues

Below is a LIVING list of helpful troubleshooting tips to fixing Sitecore issues.  Meaning, these are tips that Sitecore developers typically will run through before going to the Sitecore Community and/or Sitecore Support.  If a tip is not in this list, feel free to comment and I will add it to this running list.

These are tips, in no order, that might be helpful to aid you in determining the root of an issue and coming to resolution:

  • Check the Sitecore Logs for errors located in the Data/Logs folder.  It’s a best practice to have the Data folder as sibling to the Website folder and not inside the Website folder.
  • Using Chrome’s Web Developer tool you can check the Network tab, or in Firefox Firebug use the Profile button to see if anything is failing with when being loaded or events are firing etc.
  • See if the issue is browser specific by using different browsers (IE, Firefox, Chrome).
  • Debug with Visual Studio for ASP.NET/C# issues.
  • Debug with Firebug/Chrome Web Developer tool for JavaScript type of issues.
  • If .dll issue take a look at the .dll in .NET Reflector, or similar reflection tool, and see what the code is setup to do.  This might lead you in the direction of the issue.
  • Try clearing the cache at http://[yoursite]/sitecore/admin/cache.aspx
  • Check to make sure your includes are being included post .config build at http://[yoursite]/sitecore/admin/showconfig.aspx
  • Try recycling the app pool for the website.
  • If missing files/items see if a previous package was installed and reinstall to pick up the files/items.
  • Is the issue environmental, meaning works in one Sitecore instance locally, but not in staging/production? If so, what could be the difference in files/items/configuration you can compare that will give you direction to solve the problem. You may need to use a tool like Beyond Compare, or similar tool, to diff some files to get to the root of the issue.

Thanks in advance for any helpful tips to help out the Sitecore community! Happy coding!

Upgrade strategy for Sitecore using RAZL

Tasked with performing an upgrade from Sitecore 6.5 to Sitecore 7.2 I was researching ways to 1) minimize the content freeze that my client would endure and 2) easily integrate the changes from the production databases into my locally upgraded databases (initially pulled down from production at the start of the upgrade process). I knew that RAZL from TDS could help with this but I had never used it before and an automated process of merging content changes especially between and upgraded database (7.2) and a legacy version (6.5) was suspect at best for the process to not work at all or fail.  After a bit of learning the product, I was amazed at how simple and easy the process was and I was able to merge the changes all the way through saving me a bunch of time.

Below are simple steps to performing a merge with the tool and some key points to make your life easy with RAZL:

  • Download the latest version and get a license at https://www.razl.net/download.aspx
  • When you open up RAZL you will need to setup 2 connections of which should be local on your machine.  So for me I had to initiate a content freeze with the client, setup another site in 6.5, pull down the backups of the production databases, and then configure my 6.5 Sitecore instance to now use these fresh databases. My first connection is my locally upgraded Sitecore instance (7.2) named Local.Master. My second connection is a vanilla Sitecore instance (6.5) named LocalProd.Master with the most updated content changes from production.
    RAZL Connections

    RAZL Connections

    Once the sites are configured in IIS and setup in RAZL you can then start the merging process.

  • Using this bit of documentation from TDS on RAZL for comparing items you can see what is same, different, deleted, and moved. Being that there are additional fields in one version and not in the other there will always be a difference even after the merge takes place. However, in 2 databases of the same version the double arrows should go away after you perform a merge.
  • When I started the process I was unable to merge anything and thought that the process would not work.  I kept getting an error message stating that the parent item was missing even if I clicked on the top-level sitecore item and tried to merge. This was because I was not going in the correct order for merging.  As a key point, the correct order is below for merging:
    1. Templates
    2. System
    3. Layout
    4. Media Library
    5. Content
  • Once I went in that order the error never appeared again.
  • Now, I wanted to not just merge one item at a time, I wanted to merge an item and it’s children to make it really easy.  This was not readily apparent as I thought that I would have to click on each item and merge…oh what a nightmare that would be!  However, when I right-clicked on an item, there was an option for “Get All From Right”, which I hovered over and then I clicked on Merge.  That was able to merge an entire parent and it’s children. Take this as a key point as well.

Upgrades are almost always a mundane and meticulous task for Sitecore developers. Finding a way to make things more simplistic and easy is the approach I like to take, and RAZL has helped me with this.  Hopefully, you can make use of this awesome tool for your Sitecore upgrades and day to day Sitecore duties as well.  A must have for your Sitecore toolbox.  Happy coding!

Lucene.Net Upgrade Issue with Sitecore 6.6.0 rev. 120918

I am performing an upgrade for a client from Sitecore 6.5.0 rev. 110818 to Sitecore 6.6.0 rev. 120918.  When I tried installing the update I got this critical error when the update finished:

“Could not load file or assembly ‘Lucene.Net, Version=X.X.X.X, Culture=neutral, PublicKeyToken=null’ or one of its dependencies. The located assembly’s manifest definition does not match the assembly reference.”

In the upgrade instructions on the SDN, it clearly states that after you install the update you may receive this message:

Note: The upgrade process might fail with the following error message: “Could not load file or assembly ‘Lucene.Net, Version=X.X.X.X, Culture=neutral, PublicKeyToken=null’ or one of its dependencies. The located assembly’s manifest definition does not match the assembly reference.”
This error happens because Sitecore CMS 6.6 uses a new strongly-named version of Lucene.NET and can occur if one of the installed modules or your custom code refers to an old version of Lucene.NET.
To fix this, disable any modules and custom code in your solution that depends on Lucene.NET, then rerun the process. If you cannot determine the exact module or code that should be disabled, or if your changes do not resolve the problem, please contact Sitecore Product Support Services.

After working with support to get some hints, it turned out that the following .dll’s and includes were causing the problems as they were referencing the old .dll’s.

Here is a list of the of the following includes and dll’s in my solution that I had to copy out of the website:

Problem Includes

Problem Includes

Problem DLL's

Problem DLL’s

Once, I copied them out into another folder and reran the update, the update successfully finished upgrading my instance.  Hopefully, this saves you some time.  Happy coding!

3 Basic Steps to Help You Become a Sitecore MVP

At the end of the year 2014 when the Sitecore MVP’s were awarded their MVP status, it was then that I decided I wanted to become a Sitecore MVP.  Below are some simple steps that I used to obtain my Sitecore MVP status for 2015 in as little as 30 minutes a day, which is 2.5 hours a week added on to your daily/weekly routine.

I have been bodybuilding this year, and I am going to relate becoming a Sitecore MVP to bodybuilding.  Here’s the secret:

It’s all about passion and consistency!

When you walk into the gym you will almost always see the guys that are bigger and ripped.  So you ask yourself, “What are they doing to get that size and definition?”  Yes, they could be on steroids, which is what most believe, but I assert that’s not the case.  More often than not, they have just made it a habit to show up every day, and made it a point to not let anyone else outwork them in the gym.  It’s their passion, and they are consistent in showing up and working hard 5-6 days a week to reach their bodybuilding goals.

Becoming a Sitecore MVP is very similar to bodybuilding in the aspect that it’s much easier and less stressful to work on your MVP status daily/weekly.  This is a much better strategy than waiting until nominations come around in October/November of every year to start getting to work on the MVP award.  That can be time-consuming and stressful if you need to play catch up on a lot of the things that Sitecore is looking for to reward you with the MVP award.  To make this even more clear, if you relate this to bodybuilding, that’s like walking into the gym after you haven’t worked out all year long and stacking 500 pounds on chest press, and going for it.  It’s just not a smart idea!

Below is a brief list of things you should focus on when seeking to obtain the Sitecore MVP status.  The panel looks at the quality, quantity, and the level of impact of these particular contributions:

  • General (technical) advocacy
  • Contributing to the Sitecore community via blogs
  • Contributing to Sitecore Community forums (SDN forums have moved)
  • Helping others on online communities like Stackoverflow
  • Visiting and/or Contributing to the Sitecore User Groups
  • Writing and/or publishing content such as white papers and articles
  • Sitecore Marketplace contribution
  • Support tickets contribution

Consistency and involvement is key and I will give you some pointers on where you should spend your time below to help you in your quest to become a Sitecore MVP.

Step 1: Become selfless not selfish

I still remember about 6 years ago when I was the Lone Ranger in my company that just got a license for Sitecore.  I was tasked with learning and becoming the sole developer/resident expert on Sitecore 6.0.  At that time, I was a complete Sitecore rookie, and my only source of knowledge was the documentation that Sitecore provided on the SDN.  Back then there wasn’t much for Google searches when it came to troubleshooting. I struggled to take in all the information and learn on my own, but I was determined to rise up as a solid Sitecore developer. It was at that time that I vowed that should I ever become knowledgeable with the product that I would help others in the Lone Ranger situation. Hence, the reason I share my knowledge today, which is to share and give back to the Sitecore community as they have given back to me in my time of need.

Start with a selfless heart when seeking to obtain the Sitecore MVP status. Realize that most of the MVP’s would probably still do all these things even if there wasn’t an MVP program. It’s just a unique character attribute to possess where you want to help others and not keep all this information to yourself.

Step 2: Set daily/weekly goal on hourly commitment

Nothing is free.  If you want to become a Sitecore MVP or a have a healthy, fit body you simply have to commit to how much time you are going to spend to obtain that which you seek.  What I do every morning is try to wake up about 30 minutes early before work and focus on those contributions above that can help the Sitecore community.  Once you have a time commitment you can then decide where to spend that time.

Step 3: Setup this time allotment in your calendar and stick to it

Take the time to put in your calendar this time commitment so you can keep yourself accountable. When the time comes to work on knowledge sharing, hopefully, you will already have a plan of what you are going to do.  But here is what you can do with your time allotment of simply 30 minutes a day:

  • Jump on the Sitecore Community forums and/or Stack Overflow and help others to work through their issues. You may not know the answer, but maybe you can help lead someone in the right direction.  Try answering the issues or offering input where you can with your knowledge and experience. It all helps even to stir up thought that may help that person reach a final solution. Make sure to set up your notifications to come directly to your email inbox so you can see what’s new and respond promptly to ones that you previously were helping with.
  • Use this time to blog on a topic that you find would help the Sitecore community.  I usually have found that as I am working through my normal work, I have these moments where I say to myself, “I bet others could benefit from what I just went through.”  And that is the starting point of a new blog that I start while it’s still fresh in my mind. So as you are working always be thinking of what it is that you’re doing that could help others.
  • Use this time to build a Sitecore Marketplace module.  If different clients are asking for the same type of component or module and it’s not on the Sitecore marketplace consider developing a Sitecore marketplace module.  Chances are that other Sitecore clients will want to use it.  Just be ready to support it as well i.e. bugs, new features, updating to work with newer releases of Sitecore.

In addition, to what is above that you can spend 30 minutes a day on you should also get involved in the social Sitecore community via Twitter and Slack.  Slack is used to bounce ideas around on the Sitecore Slack channel.  Great to see what other Sitecore developers are talking about and get involved.  What’s best about slack is it’s real-time chat with other Sitecore developers from around the world!

If you live in a state where you have a Sitecore User Group that meets regularly get involved! Definitely show up to the meetings on a regular basis but if there is something you would like to present on then let the User Group leader know. For those of us, that live in areas where there is not a Sitecore User Group consider starting one up.  Here is a link to the Sitecore User Groups directory. Here you can see where a User Group is located near you.  For us that live in disparate areas, there is a Sitecore Virtual User Group but it’s based on presenters.  No presenters, no meeting.  Hence, another area where you can pitch in and contribute towards becoming an MVP if you feel comfortable enough to present on a topic.

Lastly, as you go about your day and encounter issues with Sitecore that can’t be resolved with your technical ability and the help of Google, then consider putting in a support ticket to Sitecore Support.  Again, chances are it’s a bug that needs to be addressed and fixed in the next release. Sitecore wants to know about all these bugs so don’t think you’re being a pain in the neck, it’s helping them to build the most solid, robust, enterprise level CMS system in the world.

So remember, do it because Sitecore is your passion and you love to share NOT because you have to.  Next, set aside time each day to make it simple and easy for yourself to reach your goal of MVP. Lastly work your plan daily/weekly to share to the best of YOUR abilities with your knowledge and expertise. Happy coding!