Before some months I start following the TechNet forums
about SharePoint. I read every week many questions, bookmark the
interesting once, answer and research the others. I find it very useful and
many new things are learn in a very fast way. Of course, the price of this is a
time but let’s say I have a lot of it now J
I notice one issue in tree similar questions so I decide to
write a post about it.
The scenario: how to add a message on a multiple site
collections.
This might be necessary when some farm maintenance is planned and the users must be notified.
This might be necessary when some farm maintenance is planned and the users must be notified.
The solution: Site collection feature which use the JavaScript
API to display the notification. The script is injected on the page with a delegate
control AdditionalPageHead.
Code Sample: download from here
Explanation:
SharePoint 2010 JavaScript client API has the function SP.UI.Status.addStatus
which adds astatus message on a page. The code is simple:
SP.UI.Status.addStatus('the mayans:','The world will not end on 22.12.2012!',true);
This function is a part for the client site API so the sp.js
javascript must be loaded on the page.
The big question here is how such javascript can be loaded on
each page. One possible opinion is with changes in the master page of each site
collection. But this is a heavy task. And may cause some issues.
The better approach here is the use of the delegate control AdditionalPageHead.
First, what is a delegate control – this is a region in the page that allows the content to be replaced with custom one. All master pages have
the following markup which define a delegete control with ID AdditionalPageHead :
<SharePoint:DelegateControl runat="server" ControlId="AdditionalPageHead"></SharePoint:DelegateControl>
Second, how we add our logic using this AdditionalPageHead control –
with a element file that contains the following markup:
<xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<Control Id="AdditionalPageHead" ControlSrc="~/_controltemplates/SPNotification/PageHead.ascx" Sequence="1001" />
</Elements>
here PageHead.ascx control is our custom control which
contains the csutom javascript logic:
<script type="text/javascript">
function AddNotification() {
var sid = SP.UI.Status.addStatus('the mayans:', 'The world will not end on 22.12.2012! ', true);
}
ExecuteOrDelayUntilScriptLoaded(AddNotification, 'sp.js')
</script>
The final step is to use a powershell for deploying the
solution and activating the feature in each site collection. Here is an example of search script. Feel free to modify it so it serve your needs:
------------------------------------------------------------------------
------------------------------------------------------------------------
$snapin = Get-PSSnapin Microsoft.SharePoint.Powershell
if ($snapin -eq $null)
{
Write-Host "Loading SharePoint Powershell Snapin"
Add-PSSnapin "Microsoft.SharePoint.Powershell"
}
$solutionPackage = "SPNotification.wsp"
$path ="C:\something\"
# add solution
Add-SPSolution -LiteralPath ($path + $solutionPackage) -Confirm:$false
Write-Host "Adding solution" $solutionPackage
while ((Get-SPSolution | where-object {$_.Name -eq $solutionPackage}) -eq $null)
{
Start-Sleep -Seconds 3
}
#deploy solution
$solution = Get-SPSolution | where-object {$_.Name -eq $solutionPackage}
Install-SPSolution -Identity $solutionPackage -GACDeployment -Force
Write-Host -NoNewLine "Solution " $solution.Name "is deploying "
while ((Get-SPSolution | where-object {$_.Name -eq $solutionPackage}).Deployed -eq $false)
{
Start-Sleep -Seconds 3
}
#iteratio through all site collection and activate the feature
$farm = Get-SPFarm
$websvcs = $farm.Services | where -FilterScript
{$_.GetType() -eq [Microsoft.SharePoint.Administration.SPWebService]}
foreach ($websvc in $websvcs) {
foreach ($webapp in $websvc.WebApplications) {
Write-Host "web app: " $webapp.Name
foreach ($site in $webapp.Sites) {
Write-Host "Activate feature in " $site.uRL
Enable-SPFeature –Identity 'b6bcf98b-8f73-4c08-b4fe-32f052a8c971' –url $site.uRL
}
}
}
------------------------------------------------------------------------
if ($snapin -eq $null)
{
Write-Host "Loading SharePoint Powershell Snapin"
Add-PSSnapin "Microsoft.SharePoint.Powershell"
}
$solutionPackage = "SPNotification.wsp"
$path ="C:\something\"
# add solution
Add-SPSolution -LiteralPath ($path + $solutionPackage) -Confirm:$false
Write-Host "Adding solution" $solutionPackage
while ((Get-SPSolution | where-object {$_.Name -eq $solutionPackage}) -eq $null)
{
Start-Sleep -Seconds 3
}
#deploy solution
$solution = Get-SPSolution | where-object {$_.Name -eq $solutionPackage}
Install-SPSolution -Identity $solutionPackage -GACDeployment -Force
Write-Host -NoNewLine "Solution " $solution.Name "is deploying "
while ((Get-SPSolution | where-object {$_.Name -eq $solutionPackage}).Deployed -eq $false)
{
Start-Sleep -Seconds 3
}
#iteratio through all site collection and activate the feature
$farm = Get-SPFarm
$websvcs = $farm.Services | where -FilterScript
{$_.GetType() -eq [Microsoft.SharePoint.Administration.SPWebService]}
foreach ($websvc in $websvcs) {
foreach ($webapp in $websvc.WebApplications) {
Write-Host "web app: " $webapp.Name
foreach ($site in $webapp.Sites) {
Write-Host "Activate feature in " $site.uRL
Enable-SPFeature –Identity 'b6bcf98b-8f73-4c08-b4fe-32f052a8c971' –url $site.uRL
}
}
}
------------------------------------------------------------------------
Comments
Post a Comment