127 lines
4.0 KiB
PowerShell
127 lines
4.0 KiB
PowerShell
param(
|
|
[Parameter(Mandatory = $true)]
|
|
[string]$SiteUrl,
|
|
|
|
[string]$Description = 'MSFT-Custom-Solution:MegaMenu'
|
|
)
|
|
|
|
Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue | Out-Null
|
|
|
|
$componentId = [Guid]'c0abbffb-355d-4d4e-bd38-9e15fb811506'
|
|
$legacyComponentId = [Guid]'abc3361f-bb2d-491f-aba3-cd51c19a299b'
|
|
$location = 'ClientSideExtension.ApplicationCustomizer'
|
|
$configurationProperty = 'PortalSettings.MegaMenu.Configuration'
|
|
|
|
$site = Get-SPSite -Identity $SiteUrl
|
|
|
|
try {
|
|
$rootWeb = $site.RootWeb
|
|
$properties = [string]$rootWeb.AllProperties[$configurationProperty]
|
|
|
|
if ([string]::IsNullOrWhiteSpace($properties)) {
|
|
$existingAction = $null
|
|
|
|
foreach ($web in $site.AllWebs) {
|
|
try {
|
|
$existingAction = @(
|
|
$web.UserCustomActions |
|
|
Where-Object {
|
|
$_.ClientSideComponentId -eq $componentId -or
|
|
$_.ClientSideComponentId -eq $legacyComponentId
|
|
}
|
|
) | Select-Object -First 1
|
|
|
|
if ($existingAction) {
|
|
$properties = [string]$existingAction.ClientSideComponentProperties
|
|
break
|
|
}
|
|
}
|
|
finally {
|
|
$web.Dispose()
|
|
}
|
|
}
|
|
}
|
|
|
|
if ([string]::IsNullOrWhiteSpace($properties)) {
|
|
throw ('Keine MegaMenu-Konfiguration im Property Bag oder in einer bestehenden ' +
|
|
'Web-Registrierung gefunden. Bitte zuerst add-megamenu.ps1 ausfuehren.')
|
|
}
|
|
|
|
try {
|
|
$null = $properties | ConvertFrom-Json
|
|
}
|
|
catch {
|
|
throw ('Die gefundene MegaMenu-Konfiguration ist kein gueltiges JSON: ' + $_.Exception.Message)
|
|
}
|
|
|
|
$removedSiteActions = 0
|
|
@(
|
|
$site.UserCustomActions |
|
|
Where-Object {
|
|
$_.ClientSideComponentId -eq $componentId -or
|
|
$_.ClientSideComponentId -eq $legacyComponentId
|
|
}
|
|
) | ForEach-Object {
|
|
$_.Delete()
|
|
$removedSiteActions++
|
|
}
|
|
|
|
$siteAction = $site.UserCustomActions.Add()
|
|
$siteAction.Name = [Guid]::NewGuid().ToString('B')
|
|
$siteAction.Title = 'MegaMenu Application Customizer'
|
|
$siteAction.Description = $Description
|
|
$siteAction.Location = $location
|
|
$siteAction.ClientSideComponentId = $componentId
|
|
$siteAction.ClientSideComponentProperties = $properties
|
|
$siteAction.Sequence = 100
|
|
$siteAction.Update()
|
|
|
|
$removedWebActions = 0
|
|
$testedWebUrls = @()
|
|
|
|
foreach ($web in $site.AllWebs) {
|
|
try {
|
|
$testedWebUrls += $web.Url
|
|
|
|
@(
|
|
$web.UserCustomActions |
|
|
Where-Object {
|
|
$_.ClientSideComponentId -eq $componentId -or
|
|
$_.ClientSideComponentId -eq $legacyComponentId
|
|
}
|
|
) | ForEach-Object {
|
|
$_.Delete()
|
|
$removedWebActions++
|
|
}
|
|
}
|
|
finally {
|
|
$web.Dispose()
|
|
}
|
|
}
|
|
|
|
$verification = @(
|
|
$site.UserCustomActions |
|
|
Where-Object { $_.ClientSideComponentId -eq $componentId }
|
|
)
|
|
|
|
Write-Host ''
|
|
Write-Host '=== MegaMenu Site-Scope-Test vorbereitet ===' -ForegroundColor Green
|
|
Write-Host ('Site-Action-ID: ' + $siteAction.Id)
|
|
Write-Host ('Component-ID: ' + $componentId)
|
|
Write-Host ('Entfernte vorherige Site-Actions: ' + $removedSiteActions)
|
|
Write-Host ('Entfernte Web-Actions: ' + $removedWebActions)
|
|
Write-Host ('Verifizierte Site-Actions: ' + $verification.Count)
|
|
Write-Host ('Properties: ' + $properties)
|
|
Write-Host ''
|
|
Write-Host 'Bitte jeweils mit Strg+F5 testen:' -ForegroundColor Cyan
|
|
$testedWebUrls | ForEach-Object { Write-Host (' ' + $_) }
|
|
Write-Host ''
|
|
Write-Host 'Rueckkehr zum bisherigen Web-Scope:' -ForegroundColor Yellow
|
|
Write-Host ('.\deployment\add-megamenu.ps1 -SiteUrl ''' + $site.Url + '''')
|
|
}
|
|
finally {
|
|
if ($site) {
|
|
$site.Dispose()
|
|
}
|
|
}
|