Changing the page for a SharePoint Library View

21

Views are easily created by end users, and can be created through automation. I recently had to change the underlying aspx page for an existing view. First I tried using the SPView method SetViewXml(), however that does not work, as many other programmers have discovered to their chagrin.

The approach that works is to clone the view, then rename the title. In this case, I am trying to create AllItems.aspx, so I clone the view to that name then rename it:

$NewView = $SourceView.clone("AllItems",100,$true,$true)
$NewView.title = "All Documents";
$NewView.update();
$Views.delete($SourceView.id);

The script below goes one better. It finds the extra “All Documents” views, and deletes all the ones that are duplicate, preserving the original (latest) View. It iterates through the collection downward deleting as it goes.

Add-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction SilentlyContinue

$mylogfile="ongoinglogfile.txt"

$envGUID = $(Get-SPFarm).id
if		($envGUID -eq  "c25ca1f1-6d8f-4c59-86e3-d64821a3bcbb" )	{$env = "Dev"}
elseif	($envGUID -eq "8e51b3e2-1ed7-4549-ad51-c5c43b065d2c" )	{$env = "Prod"}
else
{
	$env = "Unknown"
	Write-Host -ForegroundColor darkred "UKNOWN FARM in $($MyInvocation.MyCommand.Definition)"
	Add-Content $mylogfile "UKNOWN FARM in $($MyInvocation.MyCommand.Definition)"
	exit
}
elseif ($env -eq "Dev")
{
	#$MatchStr="ht tp://SharePoint dev/Sites/*"  
	$MatchStr="ht tp://SharePoint dev/Sites/2015"  
    $sitesArrNames = "ht tp://SharePoint dev/Sites/2015"
    $sitesArr = $sitesArrNames.split(",");

}
elseif ($env -eq "Prod")
{
	$MatchStr="ht tp://SharePoint/Sites/2015"  
    $sitesArrNames = "ht tp://SharePoint/Sites/2015"
    $sitesArr = $sitesArrNames.split(",");
}
else
{
	$waName = $MatchStr = $waName = $null;
}

$libsArrStr="Lib1,lib2,Documents,Shared Documents"
$LibsArr=$libsArrStr.split(",")


write-host  "STARTING: $(get-date) Script: $($MyInvocation.MyCommand.Definition)"
Add-Content $mylogfile "STARTING: $(get-date) Script: $($MyInvocation.MyCommand.Definition)"


foreach ($SiteName in $sitesArr)
{
    $site = get-spsite $SiteName
	if ($site.url -like $MatchStr)
	{
	$webs=$Site.AllWebs
	$webcount = $Site.AllWebs.Count
		
	for ($i=0; $i -lt $webcount; $i++)
	{
		$TargetWeb=$web=$webs[$i]  #$TargetWeb is used by my standard routines
			
		Write-Host "==>working in $($web.url)"
		Add-Content $mylogfile "==>working in $($web.url)"

		$lists=$web.lists;
						
	  write-host -f green "The Library $($listName) exists in the site $($web.url), about to tune the view"  #not going to try to config it either
	  Add-Content $mylogfile "The Library $($listName) exists in the site $($web.url), about to tune the view"  
					  
	  for ($k=0; $k -lt $LibsArr.count; $k++)
	  {
  		$libstr = $LibsArr[$k];
					  		
		$JPLib = $web.Lists.TryGetList($libStr)  #Extra JPFolder is for the override on routines with lib
		if($JPLib -ne $null)  #optional, can filter to ensure ($JPLib.ContentTypesEnabled)
							{
                write-host "Analyzing $($JPLib.title) in $($web.url)"
                 Add-Content $mylogfile "Analyzing $($JPLib.title) in $($web.url)"

                 $Views = $JPLib.views;

                 $foundOne=$false;
                 for ($vi=$views.count-1; $vi -ge 0; $vi--)
                 {
                   $View = $views[$vi];
                   if ($View.title -eq "All Documents")
                   {
                   if ($foundOne -eq $true)  #there was one found earlier
                   {
                     $views.Delete($view.id);
                     write-host "Deleted a view in $($JPLib.title) in $($web.url)"
                     Add-Content $mylogfile "Deleted a view in $($JPLib.title) in $($web.url)"
                    }
                    else
                      {
                      $foundOne=$true;
                      $SourceView = $view;
                      }
                      }
                      }


                      if ($FoundOne)
                      {
                      if ($SourceView.schemaxml.contains("Documents.aspx"))
                      {
                        $NewView = $SourceView.clone("AllItems",100,$true,$true)
                        $NewView.title = "All Documents";
                        $NewView.update();
                        $Views.delete($SourceView.id);
                        write-host "Cloned and deleted a view in $($JPLib.title) in $($web.url)"
                        Add-Content $mylogfile "Cloned and deleted a view in $($JPLib.title) in $($web.url)"
                        }

                        }
	  }
	  }
            
            $web.Dispose()
            } #SPWeb processing
        
        } #if $true/Siteurl is not null, if environment setup is valid
        $site.Dispose()
} #foreach site

Share this entry

Leave a Reply

Your email address will not be published. Required fields are marked *

Table of Contents

Categories

Categories