function AddUpdateDeleteWebpart
{
<#
.SYNOPSIS
Add / Update / Delete Web part
#>
[CmdletBinding()]
param(
[Parameter(Mandatory=$true, ParameterSetName="Add")]
[Parameter(Mandatory=$true, ParameterSetName="Update")]
[Parameter(Mandatory=$true, ParameterSetName="Delete")]
[Parameter(Mandatory=$true, ParameterSetName="UpdateOrAdd")]
[string]$Url,
[Parameter(Mandatory=$true, ParameterSetName="Add")]
[Parameter(Mandatory=$true, ParameterSetName="Update")]
[Parameter(Mandatory=$true, ParameterSetName="UpdateOrAdd")]
[string]$WebPartFile,
[Parameter(ParameterSetName="Add")]
[switch]$Add,
[Parameter(ParameterSetName="Update")]
[switch]$Update,
[Parameter(ParameterSetName="UpdateOrAdd")]
[switch]$UpdateOrAdd,
[Parameter(ParameterSetName="Delete")]
[switch]$Delete,
[Parameter(Mandatory=$true, ParameterSetName="Update")]
[Parameter(Mandatory=$true, ParameterSetName="Delete")]
[Parameter(Mandatory=$true, ParameterSetName="UpdateOrAdd")]
[string]$IdentityValue,
[Parameter(Mandatory=$true, ParameterSetName="Update")]
[Parameter(Mandatory=$true, ParameterSetName="Delete")]
[Parameter(Mandatory=$true, ParameterSetName="UpdateOrAdd")]
[string]$IdentityField,
[Parameter(Mandatory=$true, ParameterSetName="Add")]
[Parameter(Mandatory=$true, ParameterSetName="UpdateOrAdd")]
[string]$ZoneID,
[Parameter(Mandatory=$true, ParameterSetName="Add")]
[Parameter(Mandatory=$true, ParameterSetName="UpdateOrAdd")]
[int]$ZoneIndex
)
BEGIN
{
echo "BEGIN"
}
PROCESS
{
[void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
try
{
$site = New-Object Microsoft.SharePoint.SPSite($Url)
$web = $site.OpenWeb()
try
{
$f = $web.GetFile($url)
}
catch { }
if (-not $f -or -not $f.Exists)
{
throw "Cannot Add/Update/delete webpart : page does not exist at Url $url"
}
if ($f.Level -eq [Microsoft.SharePoint.SPFileLevel]::Checkout)
{
Write-SPMessage "File already Checkout"
}
else
{
$f.CheckOut()
}
$wpm = $f.GetLimitedWebPartManager([System.Web.UI.WebControls.WebParts.PersonalizationScope]::Shared)
if ($Add -or $UpdateOrAdd -or $Update)
{
try
{
$fs = [IO.File]::OpenRead($WebPartFile)
}
catch{}
if (-not $fs)
{
throw "Cannot Add/Update webpart : Webpart file $WebPartFile does not exist. $Error"
}
try
{
$xmlreader = [System.Xml.XmlReader]::Create($fs)
}
catch { }
if (-not $xmlreader)
{
throw "Cannot Add/Update webpart : Webpart file $WebPartFile is not a valid XML file. $Error"
}
$importerror = ""
$webpart = $wpm.ImportWebPart($xmlreader, [ref]$importerror);
if (-not $webpart -or $importerror)
{
throw "Cannot Add/Update Webpart : Cannot import webpart $WebPartFile. $importerror"
}
}
if ($Delete -or $Update -or $UpdateOrAdd)
{
$webparts = @()
$wpm.WebParts | %{
if ($_.$IdentityField -eq $IdentityValue)
{
$webparts += $_
}
}
if ($Delete)
{
if ($webparts)
{
$webparts |%{
echo "Deleting Webpart $($_.Title)"
$wpm.DeleteWebPart($_)
}
}
}
else
{
if ($webparts)
{
$webparts |%{
echo "Deleting and recreating Webpart $($_.Title)"
$ZoneID = $wpm.GetZoneID($_)
$ZoneIndex = $_.ZoneIndex
$wpm.DeleteWebPart($_)
$wpm.AddWebPart($webpart, $ZoneID, $ZoneIndex)
$wpm.SaveChanges($webpart)
}
}
}
}
if ($Add -or ($UpdateOrAdd -and -not $webparts))
{
echo "Adding webpart $WebPartFile to $Url"
$wpm.AddWebPart($webpart, $ZoneID, $ZoneIndex)
$wpm.SaveChanges($webpart)
echo "Adding webpart $WebPartFile to $Url DONE"
}
$f.CheckIn("Update Webpart", [Microsoft.SharePoint.SPCheckinType]::MajorCheckIn)
if ($f.Item.ModerationInformation -and $f.Item.ModerationInformation.Status -eq [Microsoft.SharePoint.SPModerationStatusType]::Pending)
{
$f.Approve("Update Webpart");
}
}
finally
{
if ($web)
{
$web.Dispose()
}
if ($site)
{
$site.Dispose()
}
if ($fs)
{
$fs.Dispose()
}
}
}
END
{
echo "END"
}
}