While testing our newly upgraded Sitecore 7.2 solution, we faced a nasty bug in newly released feature of
Publish Related Items
When we ticked
Publish Related Items checkbox to publish all references, it publishes all the reference items three times. You are not believing, right? Even we too when our QA raised this to us. Such a nasty bug this is!!
If you have enabled traceToLog like below for UpdateStatistics processor,
<processor type="Sitecore.Publishing.Pipelines.PublishItem.UpdateStatistics, Sitecore.Kernel" runIfAborted="true">
<traceToLog>true</traceToLog>
</processor>
you will find below logs which tells the story of the bug that item named Images gets published three times.
17268 16:13:23 INFO ##Publish Item: Name=Images, Uri=sitecore://master/{15451229-7534-44EF-815D-D93D6170BFCB}?lang=en&ver=1, Operation=Updated, ChildAction=Allow, Explanation=Version 'en_1' was published.
17268 16:13:23 INFO ##Publish Item: Name=Images, Uri=sitecore://master/{15451229-7534-44EF-815D-D93D6170BFCB}?lang=en&ver=1, Operation=Updated, ChildAction=Allow, Explanation=Version 'en_1' was published.
17268 16:13:23 INFO ##Publish Item: Name=Images, Uri=sitecore://master/{15451229-7534-44EF-815D-D93D6170BFCB}?lang=en&ver=1, Operation=Updated, ChildAction=Allow, Explanation=Version 'en_1' was published.
How we solved this bug:
While investigating and spending few hours we found that Sitecore is not able to remove duplicate items which are added as reference items, which we can solve by overriding
RemoveDuplicateReferrers method of
ProcessQueue processor as below:
Step 1: Replace below line from web.config
<processor type="Sitecore.Publishing.Pipelines.Publish.ProcessQueue, Sitecore.Kernel"/>
with:
<processor type="SitecoreTactics.Publishing.Pipelines.Publish.ProcessQueue, SitecoreTactics"/>
Step 2: Override the ProcessQueue processor
We have two alternatives to solve this, one is given by
Ivan Sheyenko from Sitecore Support and one solved by our colleague
Muktesh Mehta.
Below is the solution provided by
Sitecore Support, which still needs improvements:
public class ProcessQueue : ProcessQueue
{
// Methods
protected override IEnumerable<publishingcandidate> RemoveDuplicateReferrers(IEnumerable<publishingcandidate> referredItems, PublishContext context)
{
Assert.ArgumentNotNull(referredItems, "referredItems");
Assert.ArgumentNotNull(context, "context");
List<publishingcandidate> list = new List<publishingcandidate>();
foreach (IEnumerable<publishingcandidate> enumerable in context.Queue)
{
foreach (PublishingCandidate candidate in enumerable)
{
list.Add(candidate);
}
}
List<publishingcandidate> list2 = new List<publishingcandidate>();
foreach (PublishingCandidate candidate2 in referredItems)
{
if (!(list.Contains(candidate2) || list2.Contains(candidate2)))
{
list2.Add(candidate2);
}
}
return list2;
}
}
Below is the solution done by
Muktesh Mehta, which is more useful in our architecture:
public class ProcessQueue : ProcessQueue
{
// Methods
protected virtual System.Collections.Generic.IEnumerable<publishingcandidate> RemoveDuplicateReferrers(System.Collections.Generic.IEnumerable<publishingcandidate> referredItems, PublishContext context)
{
Assert.ArgumentNotNull(referredItems, "referredItems");
Assert.ArgumentNotNull(context, "context");
List<id> idCollection = new List<id>();
System.Collections.Generic.List<publishingcandidate> finalReferredItems = new System.Collections.Generic.List<publishingcandidate>();
foreach (var referred in referredItems)
{
if(!idCollection.Contains(referred.ItemId))
{
idCollection.Add(referred.ItemId);
finalReferredItems.Add(referred);
}
}
return finalReferredItems.AsEnumerable();
}
}
Now, enjoy bug-free Sitecore Related Item Publishing.. Njoy!
Other Sitecore 7.2 Bugs Solved!