пятница, 31 мая 2019 г.

Копирование верхней навигационной панели между коллекциями с помощью PowerShell. SharePoint 2013, 2016


Архитектура SharePoint такова,что ферма содержит много коллекций сайтов, а бизнес хочет единую верхнюю навигационную панель на всех коллекциях (или многих). Для решения такой задачи можно сделать свое решение, в котором создать своего провайдера. В мастер странице изменить провайдера, настроить провайдера, что бы он брал данные из требуемой коллекции.
В этой статье я расскажу, как можно копировать TopNavigationBar с одной коллекции в другу.



cls
#Коллекция исходник
$web = Get-SPWeb https://portal.ru
$webNav = $web.Navigation.TopNavigationBar 

#Сохраняем файл
$xmlFilePath = "C:\temp\QuickLaunchNav.xml"
New-Item $xmlFilePath -type file -force

#Экспортируем файл
Add-Content $xmlFilePath ""
Add-Content $xmlFilePath "`n"
$webUrlXml = "`n" + $web.ServerRelativeUrl + ""
Add-Content $xmlFilePath $WebUrlXml
$webTitleXml = "`n" + $web.Title + ""
Add-Content $xmlFilePath  $webTitleXml
Add-Content $xmlFilePath "`n"
$webNav | ForEach-Object {
    if($_.Properties.NodeType  -eq "Heading")
    {
            Write-Host "Добавляем Heading: " $_.Title -ForegroundColor DarkGray
            $headingXML = "`n"
            Add-Content $xmlFilePath $headingXML
            $_.Children | ForEach-Object {
               # $_.Title
                $navLinkXML = ""
               
                Add-Content $xmlFilePath $navLinkXML
            }
            Add-Content $xmlFilePath "`n"
        
    }
}
Add-Content $xmlFilePath "`n"
Add-Content $xmlFilePath "`n"
$web.Dispose()

#=======================================#
#Перечень коллекций
$webUrlArray =  'https://portal.ru/sites/Contracts/',  
                'https://portal.ru/departments/',
                'https://portal.ru/sites/DocLib',
                'https://portal.ru/tasks'


foreach($webUrl in $webUrlArray){

    $newWeb = Get-SPWeb $webUrl
    $qlNav = $newWeb.Navigation.TopNavigationBar 

    #Читаем файл
    $xmlFilePath = "C:\temp\QuickLaunchNav.xml"
    $xmlFile = [xml](Get-Content($xmlFilePath))
    $oldWebUrl = $xmlFile.Navigation.WebUrl
    $currentLinks = @()

    #Очищаем существующие ссылки
    $qlNav | ForEach-Object {
        $currentLinks = $currentLinks + $_.Id
    }
    $currentLinks | ForEach-Object {
        $currentNode = $newWeb.Navigation.GetNodeById($_)
        write-host "Удаление " $currentNode.Title "и всех вложенных ссылок..." -ForegroundColor Blue
        $qlNav.Delete($currentNode)
    }

    #создание первой ссылки
    $headingNode = New-Object Microsoft.SharePoint.Navigation.SPNavigationNode($xmlFile.Navigation.WebTitle, $xmlFile.Navigation.WebUrl,$true)
    $qlNav.AddAsLast($headingNode)

    #Создаем ссылку
    $xmlFile.Navigation.Headings.Heading | ForEach-Object {
        $LinkTitle = $_.Title.replace("?","")
        #Write-Host $_.Url $_.NavLink
        #$headingNode = New-Object Microsoft.SharePoint.Navigation.SPNavigationNode($_.Title, $_.Url.Replace($oldWebUrl, $web.ServerRelativeUrl))
        $headingNode = New-Object Microsoft.SharePoint.Navigation.SPNavigationNode($LinkTitle, $_.Url,$true)
        write-host "Создаем Heading:" $_.Title -ForegroundColor Green
        $heading = $qlNav.AddAsLast($headingNode)
        $heading.Properties["NodeType"] = "Heading";
        $heading.Update();
        $_.NavLink | ForEach-Object {
            #$linkNode = New-Object Microsoft.SharePoint.Navigation.SPNavigationNode($_.Title, $_.Url.Replace($oldWebUrl, $web.ServerRelativeUrl))
        
            write-host "Создаем Navigation Link:" $_.Title -ForegroundColor Yellow
            
            $LinkTitle = $_.Title.replace("?","")
            if ( $_.Url -eq $newWeb.ServerRelativeUrl ){ # Проверяем что ссылка на этот же сайт
                $url = $_.Url+"/temp" 
                $linkNode = New-Object Microsoft.SharePoint.Navigation.SPNavigationNode($LinkTitle, $url,$true)
                $link = $heading.Children.AddAsLast($linkNode)
                $link.Url = $newWeb.ServerRelativeUrl
                $link.Update()
            }else{
                $linkNode = New-Object Microsoft.SharePoint.Navigation.SPNavigationNode($LinkTitle, $_.Url,$true)
                $link = $heading.Children.AddAsLast($linkNode)
            }
        }
    }
    $newWeb.Dispose()
}



Основным условием является то, что необходимо активировать фичу "Публикация" .

Комментариев нет:

Отправить комментарий