Kleine Helferlein – Teil 3

Heute folgt Teil 3 der kleinen Helferlein.

Stellen wir uns folgendes vor: Wir wollen in jedem Web auf der Startseite ein ListView-Webpart hinzufügen, welches Daten aus einer Liste im jeweiligen Web anzeigt.

Um nicht alle Seiten manuell bearbeiten zu müssen, benötigen wir ein PowerShell Script, mit dem wir alle Webs durchgehen und die Startseite bearbeiten können. Um die Webpart Datei nicht manuell erzeugen zu müssen, konfigurieren wir uns das Webpart und exportieren es im Anschluss. Da die ID der Liste in jedem Web unterschiedlich sein wird, ersetzen wir diese durch einen Platzhalter.

Es gibt hier zwei Herausforderungen:

  1. Der Platzhalter der Listen ID steht in der Webpart Datei und muss im Skript automatisch gegen die ID der Liste im jeweiligen Web ausgetauscht werden. Den Platzhalter ersetze ich in der Methode GetWebpartXml.
  2. Nach Hinzufügen des Webparts muss die View angepasst werden, die zur Anzeige im Webpart verwendet wird, da nicht alle benötigten Spalten in der automatisch erzeugten View enthalten sind. Die fehlende Spalte füge ich in der Methode UpdateView hinzu.

Um das Skript übersichtlich zu halten, verzichte ich an dieser Stelle auf Logging und Fehlerbehandlung.

Import-Module SharePointPnPPowerShell2016;

#Konfiguration
$urlStartWeb = "Url"; # URL des Start Webs
$listTitle = "Name"; #Name der Liste (ListViewWebpart)
$listUrl = "Url"; #URL der Liste (ListViewWebpart)
$webpartPath = "Pfad"; # Pfad zur WebpartDatei
$webpartTitle = "WebpartTitel"; #Titel des Webparts


cls
Connect-PnPOnline $urlStartWeb  -Credentials (Get-Credential); 


# Methode um das Webpart XML generieren: Austausch des Platzhalters gegen die ID der Liste
function GetWebpartXml($web){
    # Zugriff auf die Liste im Web
    $tempList = Get-PnPList -Identity $listUrl -Web $web;  
    
    # ID der Liste auslesen
    $newId = $tempList.Id;
    
    # Webpart XML einlesen
    $webpartXML = [XML](Get-Content -Path ($webpartPath));
    $xml = $webpartXML.OuterXml;
    
    # Platzhalter durch ID der Liste ersetzen
    $xml = $xml.Replace("_#ListId#_", $newId);

    return $xml; 
}

# Methode umd die View anzupassen: Fehlende Spalten werden ergänzt
function UpdateView($web, $viewId){
    # Zugriff auf die View
    $view = Get-pnpView -web $web -List $listTitle -Identity $viewId;
    # Spalten hinzufügen
    $view.ViewFields.Add("Spalte1");
    $view.ViewFields.Add("Spalte2");
    $view.ViewFields.Add("Spalte3");
    $view.Update();
    $view.Context.ExecuteQuery();
}

# jedes Web: Homepage anpassen und Webpart hinzufügen
$subwebs = Get-PnPSubWebs -Recurse;
Foreach ($subWeb in $subwebs){
    $pageUrl = "Sitepages/Homepage.aspx";
    $pageUrlServerRelative = $subWeb.ServerRelativeUrl + "/" + $pageUrl;

    # auschecken
    Set-PnPFileCheckedOut -Url $pageUrlServerRelative -Web $subWeb;
    
    # Webpart hinzufügen
    Add-PnPWebPartToWikiPage -ServerRelativePageUrl $pageUrl -Web $subWeb -Xml (GetWebpartXml($subWeb)) -Row 1 -Column 1;
        
    # verwendete View auslesen
    $webpart =  Get-PnPWebPart -Web $subWeb -ServerRelativePageUrl $pageUrl -Identity $webpartTitle;
    $viewProperty = Get-PnPWebPartProperty -Web $subWeb -ServerRelativePageUrl $pageUrl -Identity $webpart.Id -Key "XmlDefinition";
    $xml = New-Object -TypeName System.Xml.XmlDocument;
    $xml.LoadXml($viewProperty);

    # Update der View
    UpdateView -web $subWeb -viewId $xml.FirstChild.Name;

    # einchecken
    Set-PnPFileCheckedIn -Url $pageUrlServerRelative -Web $subWeb;
}

Leave a Comment

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