#Sitecore July 2018 Meetup Chicago Impressions

This was the first Chicago Sitecore meetup this year. It is always great to see familiar faces at these things and reconnect. Some of the attendees I have worked with in the past and/or is a client of Paragon. Also a lot of them I follow on Twitter, but have not met in person so it is good to put the name and face together.

I am not going to lie I always look forward to the food at these things. Lou Malnati’s is my favorite pizza. The bling is also nice too.

The first presentation was done Ahmed Okour and James Gregory from American Eagle, “Deep Dive into Sitecore Installation Framework”.

A lot of the stuff they went over were things I encountered doing my first Sitecore 9 install. It was nice to get a better picture on what happens behind the scenes. On another note I had to hold back the laughs along with others as the words “SIFless” and “Sharding” were mentioned.

The next presentation was done by Naim Al and James Gregory from American Eagle, “Understanding Sitecore Custom Analytics and Power BI”.

This was in interesting one. There was the out of the box Sitecore tool introduced as well as a third-party tool. Very useful stuff for Marketers.

After the presentations were over it was time to go. Not before snapping a few goodbye picks. I am hoping the next Chicago Sitecore meetup will be soon.

Updating #Sitecore 9 Update 1 to Update 2

I am always a little hesitant going from one Sitecore version to another, but with Sitecore 9 I believe it is a straightforward process. Using the Sitecore package updater simplified things. Steps and pictures below.

In the control panel choose Install an Update.

Choose your package and upload.

Click the Analyze the Package brings up this screen:

I then clicked the Analyze green arrow. The following screen appears.

Some of the conflicts were spaces or things that I could skip. If it was a configuration change I still needed a patch was created. Really nothing too major.

That was it for me. There are some minor things that might need to be adjusted. Keep in mind that you will need to update NuGet packages in your Sitecore Visual Studio solution. Also, any config and pipeline changes that might be different.

Upgrading to #Sitecore 9 Data Exchange Framework Module 2.0.1. What to Expect. #DEF

In last year’s blogs I did a several part series on the Data Exchange Framework or DEF. You can find that here. I decided to upgrade my DEF Reddit feed module to the latest versions of Sitecore and DEF to get more familiar with the changes.

The first thing I did to the solution after installing the new latest version of DEF into Sitecore 9 Update 1 was to replace the following files.

Code Changes:

Starting with BaseReadDataStepProcessor I noticed a slight change.

The following code:

protected override void ReadData(Endpoint endpoint, Sitecore.DataExchange.Models.PipelineStep pipelineStep, PipelineContext pipelineContext) {  

Should now be:

protected override void ReadData(Endpoint endpoint, PipelineStep pipelineStep, PipelineContext pipelineContext, ILogger logger) {  

As you can see from the above code PipelineContext was replaced with ILogger.

The function that adds the plugin has changed.

From this:


To this:


In the RedditFeedValueReader the following method has changed since CanReadResult object is now ReadResult,


  1. public CanReadResult CanRead(object source, DataAccessContext context) {  
  2.     bool flag = source != null && source is RedditSharp.Things.Post;  
  3.     return new CanReadResult() {  
  4.         CanReadValue = flag  
  5.     };  
  6. }  


  7. public ReadResult CanRead(object source, DataAccessContext context) {  
  8.     bool flag = source != null && source is RedditSharp.Things.Post;  
  9.     return new ReadResult(DateTime.Now) {  
  10.         ReadValue = source, WasValueRead = flag,  
  11.     };  
  12. }

    In the RedditFeedFieldValueAccessorConverter class I noticed the following issue after upgrading.

    After using DotPeek to take a look I found this method no longer exists. It looks like it has been renamed/replaced by ConvertResult. Also it has been set to protected vs public.

  13. protected override ConvertResult < IValueAccessor > ConvertSupportedItem(ItemModel source) {  
  14.     return this.PositiveResult((IValueAccessor) new ValueAccessor() {  
  15.         ValueReader = this.GetValueReader(source), ValueWriter = this.GetValueWriter(source)  
  16.     });  
  17. }  

    So, I converted by existing method and it works again.

  18. protected override ConvertResult < IValueAccessor > ConvertSupportedItem(ItemModel source) {  
  19.     var accessor = base.Convert(source);  
  20.     if (accessor == null) {  
  21.         return null;  
  22.     }  
  23.     var fieldName = base.GetStringValue(source, RedditFeedFieldValueValueAccessorItemModel.RedditFeedFieldName);  
  24.     if (string.IsNullOrEmpty(fieldName)) {  
  25.         return null;  
  26.     }  
  27.     if (string.IsNullOrEmpty(fieldName)) {  
  28.         return null;  
  29.     }  
  30.     ValueWriter = this.GetValueWriter(source);  
  31.     ValueReader = this.GetValueReader(source) ? ? new RedditFeedValueReader(fieldName);  
  32.     if (ValueWriter == null) {  
  33.         ValueWriter = new PropertyValueWriter(fieldName);  
  34.     }  
  35.     return this.PositiveResult((IValueAccessor) new ValueAccessor());  
  36. }  

    The way ids were set before is now a bit different.

    Before I would set id’s using the following:

  37. private static readonly Guid TemplateId = Guid.Parse(“{CE67E73A-40DF-4AB7-A7D3-2FD65E166E2E}”);  
  38. public RedditEndpointConverter(IItemModelRepository repository): base(repository) {  
  39.     this.SupportedTemplateIds.Add(TemplateId);  
  40. }  

    I changed that and now just do this:

  41. [SupportedIds(“{68BD9AAD-635F-40F3-9ACD-711662C59EEC}”)]  

    Sitecore Changes:

    The value mapping has changed to a Treelist instead of a droplist.

    The window that gave you updates while the batch process ran has changed. Now it links to a log file.

    Those are the changes I made for now. Unfortunately, I am not able to run the process as I did before. It seems something else has changed. I am currently digging into that and have gone to Sitecore support for help. I will document the change in my next blog and also update the code repository so you can see the new changes.

#Sitecore #SCHackathon 2018 @ParagonDev Top 5 Reasons of Failure and Top 5 Reasons the Experience Was Better

Well with very little sleep this weekend I am writing this blog as the thoughts of my second Sitecore Hackathon has ended. I was on team SIF Lords. We all love Star Wars and Sitecore if you can’t tell by the name. We came up with a clever idea this year that would combine my running world (Strava) with Sitecore. Just like last year though with a different team my team this year failed to get the needed things in time to qualify. We needed about 26 hours not 24. However just like last year all was not lost. I don’t do these contests to win. It would be nice to win, but there are more important things at play here. So here are my top 5 reasons for failure, but also top 5 reasons why the experience outshines the failures.

Top 5 Failures

Ever year is going to be a learning experience I learned from my failures last year and vowed to not make the same mistakes. Well mostly not the same mistakes. Here are the mistakes this year. Hey, we never stop learning.

  1. Not trying to cover all the bases.

    Knowing there was a lot introduced in the last year new to Sitecore we probably should have studied each thing we though might be part of the contest that was introduced in Sitecore recently. We instead had ideas and going into the assumption that they would be broad enough to fit in. We were wrong.

  2. Installing anything in Sitecore that was not out of the box.

    Well this one I learned a little from last year. We decided no Glass Mapper and we would use Unicorn instead of TDS. Well I am a huge fan of TDS, but Unicorn was lighter to install and one of our team members had experience with it. I had a little experience with it. This would be a good opportunity to learn it better. Well in the end that did us in. No fault of Unicorn which is a great product btw, we missed a few configurations so we had some syncing issues. Lesson learned. Maybe we just use Sitecore packages next year.

  3. Not spending enough time mentally preparing.

    Working all day and it being a Friday I thought it would wind down gradually and then I would be mentally prepared for the hackathon. Well as everyone knows in the programming world things can get hectic at times. So, by the time I finished work I had to go right into the hackathon. Maybe next year I take a half day off and prepare.

  4. Not meeting with the group beforehand.

    We did have some chatroom talk on Slack and email, but we never had an official phone meeting. Not sure if it would have been beneficial, but it might have helped the brainstorming session go a little quicker.

  5. Being overconfident.

    Hey coding is hard if you don’t know. However, as developers we love to code. Sometimes though when you think you know everything you just don’t. This goes back to number 1. Study anything you can that you are not familiar with.

Top 5 Experiences

No matter the failures these experiences overcame any failure that happened.

  1. I got to learn something new.

    The topics introduced to us when the contest started was something we haven’t had experience in it. We came in the contest with all these ideas, but wham we were hit with the reality that none of them will work. So, we picked the path that we hoped we can have the most success on XConnect. Also, as mentioned above I got more experience with Unicorn.

  2. Crash course into Sitecore 9.

    This goes along with learning something new, but it does deserve its own number on the list. Right before the hackathon after several tries I finally got Sitecore 9 installed. I barely had time to play around with it so as my team got coding I had to learn all the new things that come with the latest version of Sitecore.

  3. Brainstorming a unique idea and executing that idea.

    We spent a good hour or two coming up with ideas that could fit into what we wanted to do with XConnect. We hit some dead ends, but finally came up with a pretty solid idea. When you have 24 hours to code something though you don’t exactly know if that idea will work or not until you really get into it. Towards the end the idea looked like it was going to work. Too bad we ran out of time.

  4. I got to work with co-workers I normally don’t get to.

    I am very blessed to be working for a great company. I know one thing that makes the company great are the people working there. I haven’t really worked with these specific co-workers until the hackathon. I didn’t know what they would be like other than talking to them socially. In that 24 hours we were working together as a solid team. I got to know them more and I am sure when we work on an actual project for Paragon we will be even more prepared and cohesive.

  5. I love the Sitecore world.

    Knowing that there are other Sitecore developers crazy like us makes me happy to be part of the family. I think about how much Sitecore has meant to my career and anytime I can be more involved with the it I want to seize the opportunity. There is so much to learn in Sitecore no matter how long you have been using it.

So now that I am reflecting on my experience will I be back next year? Well when I am running a marathon at mile 20+ I always question myself on why the heck did I decide to do this. I felt the same way with the hackathon in the 20+ hour. However, when it was over I thought yeah, I will do that again just like a marathon. Special thanks to everyone in the Sitecore family that made this year’s Sitecore hackathon special. Most of all to team SIF Lord. Next year we got this. If you like to follow the rest of my team you can find Steve on Twitter here and Jennifer on Twitter here.

Named a #SitecoreMVP 2018 MVP Technology

As I am writing this I am still in shock. Several years ago I was just learning and developing with Sitecore at night while working on other projects during the day. Little did I know where it would lead me. I have run several marathons and I can tell you this journey was a marathon. There were some good and rough times along my way, but I kept moving forward.

My drive to become an MVP started a year ago when I got a job with Paragon and they gave me the confidence to believe I can achieve MVP status. I talked to many MVPs this past year and they gave me a lot of helpful advice. I have met so many people in the Sitecore community this past year as well and I am excited about being more involved in the community as an MVP and making new connections. The highlights of this year have been the meetups, Slack conversations and most of all getting to attend the Sitecore Symposium in Las Vegas. So, I just want to say thank you to Paragon, all the MVPs who gave me advice, aspiring MVPs that were on the ride with me, Sitecore of course and the Sitecore community.

So now what? Well no matter what if I didn’t get awarded MVP I was going to continue doing what I am doing. I learned a lot about myself this past year. I love blogging, I really love Sitecore more than I realized before and most of all I love sharing my knowledge. If I was going to add something new I think it would be coming up with a YouTube video this year. I just need to find the right blog topic.

To see all the winners check it out here. Also congratulations to my co-worker Scott Gillis who has gotten Sitecore MVP for the second year in year in a row. You can check his blog at thecodeattic.


Refreshing #Sitecore Links Database for an Item and Seeing What Links to the Item

I had a client and recently a question came up on Sitecore Slack about the Sitecore link database and how you can find what items link to an item. This is one of those simple solutions that I may refer to in the future and also it may help someone else. In my client’s case they needed to know what media images linked to the item. I will keep this short and sweet. You can see my comments in the code below. Let me know if you have any questions.

Limiting #Sitecore Field Descriptions Using a Partial Class and #GlassMapper

Using a partial class to manipulate/change glass mapper model fields is common. I recently had to do this and thought this little tip for shortening descriptions fields would be come in handy for others. In this case an event listing was displayed. If the description was longer than 50 we would truncate the text and display it with the three dots at the end.

To add the partial class was simple. The key here is having the namespace the same name as you do in the generated model that Glass Mapper generated. If the namespace differs than the partial will not work since it cannot match the class you are adding additional functionality too. In my case ReSharper warns me the namespace path does not match of where I placed my partial class, but that is okay as I know it matches what is in the generated model.

This is what the partial class syntax looks like:

using System;

using Glass.Mapper.Sc;

using Glass.Mapper.Sc.Configuration.Attributes;

namespace Events.Models.sitecore.templates.Feature.Events


public partial class Event


private string _mainContentDescription;


public virtual string MainContentDescription




return _mainContentDescription;




ISitecoreService service = new SitecoreService(Sitecore.Context.Database);

var eventsettings = service.GetItem<EventsSettings>(Constants.Items.EventsSettings);

if (!int.TryParse(eventsettings.Text_Limit, out int textlimit))


textlimit = 50;


_mainContentDescription = value;

_mainContentDescription = !string.IsNullOrEmpty(MainContentDescription) ? TruncateAtWord(MainContentDescription, textlimit) : MainContentDescription;



public static string TruncateAtWord(string value, int length)


if (value == null || value.Length < length || value.IndexOf(” “, length, StringComparison.Ordinal) == -1)

return value;

return value.Substring(0, value.IndexOf(” “, length, StringComparison.Ordinal))+(“…”);




When we go ahead and use it in the view this is what the syntax will look like.

<div class=”desc”>@Html.Raw( Model.MainContentDescription )</div>

Your description should look something like this one done:

This is a description that I don’t want to show it…

There are many possibilities you can do with partial classes and glass mapper. In this case this saved me the time of truncating the characters in the view or creating a separate model were I would have to read the descriptions in and truncate them that way and send that model to my view for example. This is a clean and easy solution and I can use the existing generated glass model so this limits the changes I normally would have to make.

Keeping #Sitecore #SOLR Index Names Unique for Multiple Projects

One of the things I recently ran into was what should you do if you have multiple projects with the same SOLR index name. SOLR does not allow you to have the same name for an index. For instance you can’t have more than one sitecore_master_index. You will be warned and unable to if you try and create one with the same name. Also if you rebuild the indexes it will overwrite the index data for the other site you were working on. So I went on Sitecore Slack looking for help. Where Sitecorey gave me a great idea. Basically you would prefix the configuration entry core with the name of the site in each index file. See below for an example.

Your index name should reflect that name as well in the SOLR index directory.

Now this did solve the issue of having multiple indexes, but a few people on the team wanted to take it a step further. They wanted to see indexes prefixed with site name from the control panel index rebuild. So I created a config transform this time for it. Keep in mind this is always a smart idea to keep the original files safe. Basically I just replaced the id value.

From my understanding the SIM installer can also help with the prefixing of index names. I haven’t used it for that yet as my site was already installed, but in the future that is something I will consider. Let me know if you have any questions.

First Ever Milwaukee Meets Chicago #Sitecore Meetup Recap

So not sure exactly who’s idea it was, but it turned out to be a great one to combine the Milwaukee Sitecore Meetup with the Chicago Sitecore meetup. No Bears vs Packers football was discussed, just Sitecore. There must have been over 30 attendees. Coveo did the first presentation and I was honored to be part of the second presentation of Sitecore Symposium attendees. I can’t wait for the next one. So here is the recap in pictures.

I live in the far west suburbs of Chicago so driving to Kenosha, Wisconsin was about the same time as it took me to get to the Chicago meetups. I enjoyed my view of the country roads and put on some classic hard rock music.

I arrived at the venue. I have never been to the Brat Stop, but I may have to come back for a visit.

Upon arrival it was great to start meeting others in person and seeing people again that I have met at the Symposium, the Chicago meetups and even one of my co-workers in person.

Renee from American Eagle and Isabel from Coveo.

My co-worker Chad from Paragon and Joe from GeekHive.

Like I said a sizable number of attendees.

Look at that food. Not bad for not being Chicago pizza.

I always love Sitecore freebies. I do love Sitecore like the pin says.

So let’s get down to the meetup itself. It first started with all the sponsors telling a little about the company they work for. I talked about Paragon and what we did. Hopefully what I was saying made sense. I am a developer, but I always try and do my best to sell.

Coveo then did a presentation. Coveo has been a huge part of Sitecore searching/marketing and they always impress me. I can’t wait to do another project with their tools.










Now it was time for the Sitecore Symposium panel.


We all gave our best insights and reported things we learned and brought up a lot of subjects. Mark and the audience had some great questions. This was so much fun.

So when is the next one? Not sure, but this one was so much fun. Maybe we can discuss Bears vs Packers at the next one?

Making the #Sitecore Switch from #Lucene to #SOLR with Custom Indexes

Recently I did my first conversion from Lucene to SOLR. With Lucene being phased out in Sitecore 9 this will probably be more common. You can find a lot of different installation guides in installing SOLR, but there are a few things that tripped me up that I want to prevent others from having to deal with.

Avoid Pitfalls

  • Make sure every Lucene config is disabled. Even the ones in the sub folders.
  • Make sure all the SOLR configs are enabled even the ones in the sub folders.
  • Make sure you don’t have any Cores with the same name inside the core.properties file. I had Sitecore_Master_Index in more than one file and all my Cores would disappear every time I restarted until I corrected the name.

Custom Indexes Differences

Some of this is obvious as you can replace Lucene with Solr, but some were not so obvious to me and I had to do some research and ask for help. I highlighted the less obvious ones.

From this:

id=acme_widgetgroups_index” type=Sitecore.ContentSearch.LuceneProvider.LuceneIndex, Sitecore.ContentSearch.LuceneProvider>

To this:

id=acme_widgetgroups_index” type=Sitecore.ContentSearch.SolrProvider.SolrSearchIndex, Sitecore.ContentSearch.SolrProvider>

From this:


To this:


From this:

type=Sitecore.ContentSearch.FieldMap, Sitecore.ContentSearch>

To this:


From this:

<field fieldName=widgetfilters” storageType=YES” indexType=TOKENIZED” vectorType=NO” boost=1f” type=System.String” settingType=Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider />

To this:

<field fieldName=widgetfilters” returnType=string />

From this:

type=Sitecore.ContentSearch.LuceneProvider.LuceneDocumentBuilderOptions, Sitecore.ContentSearch.LuceneProvider>

To this:

type=Sitecore.ContentSearch.SolrProvider.SolrDocumentBuilderOptions, Sitecore.ContentSearch.SolrProvider>

I hope this helps you as you do your conversion. If you have any questions, feel free to ask.