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

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


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



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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<navigation>"
$webUrlXml = "`n<weburl>" + $web.ServerRelativeUrl + "</weburl>"
Add-Content $xmlFilePath $WebUrlXml
$webTitleXml = "`n<webtitle>" + $web.Title + "</webtitle>"
Add-Content $xmlFilePath  $webTitleXml
Add-Content $xmlFilePath "`n<headings>"
$webNav | ForEach-Object {
    if($_.Properties.NodeType  -eq "Heading")
    {
            Write-Host "Добавляем Heading: " $_.Title -ForegroundColor DarkGray
            $headingXML = "`n<heading amp="" itle.replace="" rl.replace="" title="`" url="`">"
            Add-Content $xmlFilePath $headingXML
            $_.Children | ForEach-Object {
               # $_.Title
                $navLinkXML = "<navlink amp="" itle.replace="" rl.replace="" title="`" url="`">"
                
                Add-Content $xmlFilePath $navLinkXML
            }
            Add-Content $xmlFilePath "`n</navlink></heading>"
         
    }
}
Add-Content $xmlFilePath "`n</headings>"
Add-Content $xmlFilePath "`n</navigation>"
$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()
}

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

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

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