SharePoint Online Search Results and PnP Search Web Parts suddenly stops working


Introduction

We have been working at iThink 365 with one of the NHS Trust in the UK to move their SharePoint 2010 environment to SharePoint Online.

One of the tools that we have made a lot of use of is the excellent PnP Search Webparts. If you have not checked these out then you must do so, more information here (https://microsoft-search.github.io/pnp-modern-search/).

Here is an example of something that was built with them.

The strange thing we were seeing is that every once in a while the search results would stop working. No one seem to do anything or at least change anything but they would stop working.

The search results used custom search result sources (site settings -> manage result sources) and Microsoft SharePoint search rather than Microsoft Graph.

Resolution

After a lot of trying out different queries in the search result sources page the issue was down to one main issue.

Here is the original result source query which looked like this:

The fixed version ended up being this, do you see the subtle difference?

Note: the double quotes around the path.

On a couple of occasions the ” were stripped out of the query when a user went into the search results and we think that an administrator was saving the result query rather than cancelling and this seemed to break the search web part.

Anyway hope that helps someone as it took us a few hours to work out what was going on!

PowerShell: Script to Update SharePoint Content Type Document Template


Introduction

One of the great things about Content Types are that you can have a document template associated to the Content Type.

This means that when you create a new document a customised word template with its own look and feel can be used to guide the user through the process of filling the document and setting up the content type’s metadata.

Recently, we had the situation where we had content types being used across lots of site collections each for the different departments in the organisation.

One of the management overheads is when a document template needs to be updated. How can you do that programmatically using PowerShell?

Well the following script helps you get that done.

Solution

The PowerShell Script, Update-SPContentTypeDocumentTemplate.ps1 below does just that.

param
(
[Parameter(Mandatory=$true, HelpMessage='Url for Site Collection hosting content type')]
[string]$Url = "https://sharepoint.ithinksharepoint.com",
[Parameter(Mandatory=$true, HelpMessage='Name of the Content Type to apply document template to')]
[string]$ContentTypeName = "Policy Document",
[Parameter(Mandatory=$true, HelpMessage='File path of the document template to upload')]
[string]$DocumentTemplatePath = "",
[Parameter(Mandatory=$false, HelpMessage='Filename to store the file in SharePoint as')]
[string]$DocumentTemplateFileName = "",
[Parameter(Mandatory=$false, HelpMessage='Should derived child content types and list content types be updated?')]
[boolean]$UpdateChildren = $true
)
$site=Get-SPSite $Url;
if($site -ne $null)
{
$rootWeb = Get-SPWeb $Url;
$contentType = $rootWeb.ContentTypes | ?{$_.Name -eq $ContentTypeName};
if($contentType -ne $null -and [System.IO.File]::Exists($DocumentTemplatePath))
{
$templateFile = [System.IO.File]::OpenRead($DocumentTemplatePath);
$memoryStream = new-object System.IO.MemoryStream;
$templateFile.CopyTo($memoryStream);
if([String]::IsNullOrEmpty($DocumentTemplateFileName))
{
$DocumentTemplateFileName = [System.IO.Path]::GetFileName($DocumentTemplatePath);
}
$destinationUrl=[String]::Format("{0}/{1}/{2}", $rootWeb.ServerRelativeUrl, $contentType.ResourceFolder.Url, $DocumentTemplateFileName);
if(-not [String]::IsNullOrEmpty($contentType.DocumentTemplateUrl))
{
Write-Host "Checking Content Type Document Template Url: $contentType.DocumentTemplateUrl for file" -ForegroundColor White;
$checkFile = $rootWeb.GetFile($contentType.DocumentTemplateUrl);
if($checkFile.Exists)
{
Write-Host "File found at $contentType.DocumentTemplateUrl, removing" -ForegroundColor White;
$checkFile.Delete();
}
}
Write-Host "Checking for file @ $destinationUrl" -ForegroundColor White;
$checkFile=$rootWeb.GetFile($destinationUrl);
if($checkFile.Exists)
{
Write-Host "file found @ $destinationUrl, removing" -ForegroundColor White;
$checkFile.Delete();
}
Write-Host "Content Type Document Template not set or found " $contentType.Name -ForegroundColor White;
$checkFile = $contentType.ResourceFolder.Files.Add($destinationUrl, $memoryStream.ToArray());
$checkFile.Update();
Write-Host "Uploaded file $DocumentTemplatePath -> $destinationUrl for" $contentType.Name -ForegroundColor White;
$contentType.DocumentTemplate = $DocumentTemplateFileName;
$contentType.UpdateIncludingSealedAndReadOnly($UpdateChildren);
Write-Host "Applied Document Template $destinationUrl to " $contentType.Name " and updated content type (All Children Update Flag set? $UpdateChildren)" -ForegroundColor Green;
}
else{
Write-Error "Cannot find $ContentTypeName in $Url or cannot find document template file $DocumentTemplatePath, please check.";
}
}
else
{
Write-Host "Cannot find Site $Url" -ForegroundColor Yellow;
}
Write-Host "Finished";

So how do you use it?

Well you provide the URL of the site, the path to the document template and also the name of the Content Type.

It will access the site, check if the content type already has a document template, upload the selected document and configure the content type to use the new document template.

You can decide if you want to update all the child content types which have been assigned to document libraries. if you want to do this which is recommended then make sure you include the -UpdateChild switch.

Example

.\Update-SPContentTypeDocumentTemplate.ps1 –Url https://sharepoint -ContentTypeName "Policy Document" -DocumentTemplatePath "c:\dev\documents\policydocumenttemplate.dotx" -DocumentTemplateFileName "policydocumenttemplatev2.dotx" -UpdateChildren

So what would happen if you wanted to update a number of sites?

Well you can just get a list of the sites and pipe that array into the command and it will update the content type on each site.

Also the same technique could be used to update multiple content types on a number of sites.

Download Script

The PowerShell Script is part of the iThink SharePoint PowerShell GitHub Repository, which can be found here:

https://github.com/ithinksharepoint/PowerShell

Anyway, I hope you find the solution useful, please let me know if you did and also if you have some additions or changes then please share them!

All the best

Simon