Sunday, April 30, 2023

Add rendering to the existing page and change the datasource using Powershell Script in Sitecore

  This blog can help you to work with Sitecore CMS and work with PowerShell script more efficiently. The following code snippet will be used to add rendering to the page and change the datasource to the rendering programmatically using the PowerShell script.

This code should work with any version of Sitecore. 

Open - Development Tools -> PowerShell ISE and paste the following code.

Modify the paths and fields according to your template fields.


1. Add rendering to the existing page

    PowerShell script code:    

$masterdatabase = "master"
$webdatabase = "web"
$root = Get-Item -Path (@{$true="$($masterdatabase):\sitecore\content\AKWeb\Home\Articles"; $false="$($masterdatabase):\content"}[(Test-Path -Path "$($masterdatabase):\content\home")])
$RenderingItem = Get-Item -Path (@{$true="$($masterdatabase):\sitecore\layout\Renderings\Feature\SubHeader";$false="$($masterdatabase):\content"}[(Test-Path -Path "$($masterdatabase):\content\home")])
$DatasourcePath = Get-Item -Path (@{$true="$($masterdatabase):\sitecore\content\AKWeb\Shared\Datasources\SubHeader\SubHeader";$false="$($masterdatabase):\content"}[(Test-Path -Path "$($masterdatabase):\content\home")])
$placeholderH = "header"
#Find the rendering item and convert to a rendering
$renderingItemWithPlaceholder = $RenderingItem | New-Rendering -Placeholder "header"
$IsRenderingAdded= $true
$count=0
$changedItems=New-Object System.Collections.ArrayList
$props = @{
    Parameters = @(
        @{Name="root"; Title="Choose the report root"; Tooltip="Only items from this root will be returned."; }
        @{Name="RenderingItem"; Title="Choose the Rendering"; Tooltip="Only items from this root will be returned."; }
        @{Name="DatasourcePath"; Title="Choose the Datasource"; Tooltip="Only items from this root will be returned."; }
           )
    Title = "Add Rendering to Article Pages"
    Description = "Choose the criteria for the report."
    Width = 550
    Height = 300
    ShowHints = $true
    Icon = [regex]::Replace($PSScript.Appearance.Icon, "Office", "OfficeWhite", [System.Text.RegularExpressions.RegexOptions]::IgnoreCase)
}

$result = Read-Variable @props

if($result -eq "cancel") {
    exit
}

filter Where-Addrendering {
    param(
        [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
        [Sitecore.Data.Items.Item]$item
    )
    
    if ($item) {
		$defaultLayout = Get-LayoutDevice "Default"
        $AllRenderingsInPlaceholder= Get-Rendering -Item $item -Rendering $RenderingItem -Placeholder "*header*" -Device $defaultLayout -FinalLayout
        foreach($rItem in $AllRenderingsInPlaceholder){
    if($rItem.ItemId -eq $RenderingItem.Id){
       #$count+=1
       #if($count -eq 1)
       #{
                    #$renderingItem = Get-Item -Path $rendering.ItemID
                    Write-Host "Removing Rendering: $($rItem) for Item $($item.Name)"
                    Remove-Rendering -Item $item -Instance $rItem -Device $defaultLayout -FinalLayout
                    
            Write-Host "Removing Rendering: $($rItem) for Item $($item.Name)"
           #$count=0;
       #}
    }
}
             $sidebarComponentInPlaceholder= Get-Rendering -Item $item -Rendering $RenderingItem -Placeholder "*header*" -Device $defaultLayout -FinalLayout
		   if($sidebarComponentInPlaceholder -eq $null){
		  # if($IsRenderingAdded){
		        Add-Rendering -Item $item -PlaceHolder "header" -Instance $renderingItemWithPlaceholder -Index 1 -Datasource $DatasourcePath.Paths.Path -Device $defaultLayout -FinalLayout
		    	$count+=1;
		    	Write-Host "Removing Rendering: $($rItem) for Item $($item.Name)"
		    	#$IsRenderingAdded=$false
		    	$changedItem=New-Object PSObject -Property @{
		    	    Name=$item.Name
		    	    ItemPath=$item.Paths.Path
		    	    RenderingName=$RenderingItem.Name
		    	    DatasourcePath=$DatasourcePath.Paths.Path
		    	}
		    	$changedItems.Add($changedItem)
		   }
        #}
    }
}

$items = @($root) + @(($root.Axes.GetDescendants())) | Where-Object {$_.TemplateName -eq "Article Page"} | Initialize-Item
$finalitems = $items | Where-Addrendering

if($changedItems.Count -eq 0) {
    Show-Alert "Zero Renderings added."
} else {
      #$finalitems = $items | Where-Addrendering
    $props = @{
        Title = "Rendering Added on Items"
        InfoTitle = "Rendering Added on Items  $($count)"
        InfoDescription = "Rendering Added on Items  $($changedItems.Count)"
        PageSize = 25
    }
    
    $changedItems |
        Show-ListView @props -Property @{Label="Icon"; Expression={$_.__Icon} },
            @{Label="Name"; Expression={$_.Name} },
            @{Label="RenderingName"; Expression={$RenderingItem.Name} },
            @{Label="Datasource Path"; Expression={$DatasourcePath.Paths.Path} },
            @{Label="ItemPath"; Expression={$_.ItemPath} }
}

Close-Window

2. Change the datasource to the rendering

    PowerShell script code:    

$masterdatabase = "master"
$webdatabase = "web"
$root = Get-Item -Path (@{$true="$($masterdatabase):\sitecore\content\AKWeb\Home"; $false="$($masterdatabase):\content"}[(Test-Path -Path "$($masterdatabase):\content\home")])
$RenderingItem = Get-Item -Path (@{$true="$($masterdatabase):\sitecore\layout\Renderings\Feature\AKWeb\Components\Banner\Banner Rendering";$false="$($masterdatabase):\content"}[(Test-Path -Path "$($masterdatabase):\content\home")])
$DatasourcePath = Get-Item -Path (@{$true="$($masterdatabase):\sitecore\content\AKWeb\Shared\Datasources\Banner Dark Theme\Test Rendering Datasource";$false="$($masterdatabase):\content"}[(Test-Path -Path "$($masterdatabase):\content\home")])
$placeholderH = "*footer*"
#Find the rendering item and convert to a rendering
$renderingItemWithPlaceholder = $RenderingItem | New-Rendering -Placeholder $placeholderH
$IsRenderingAdded= $true
$count=0
$changedItems=New-Object System.Collections.ArrayList
$props = @{
    Parameters = @(
        @{Name="root"; Title="Choose the report root"; Tooltip="Only items from this root will be returned."; }
        @{Name="RenderingItem"; Title="Choose the Rendering"; Tooltip="Only items from this root will be returned."; }
        @{Name="DatasourcePath"; Title="Choose the Datasource"; Tooltip="Only items from this root will be returned."; }
           )
    Title = "Add Rendering to Article Pages"
    Description = "Choose the criteria for the report."
    Width = 550
    Height = 300
    ShowHints = $true
    Icon = [regex]::Replace($PSScript.Appearance.Icon, "Office", "OfficeWhite", [System.Text.RegularExpressions.RegexOptions]::IgnoreCase)
}

$result = Read-Variable @props

if($result -eq "cancel") {
    exit
}

filter Where-Addrendering {
    param(
        [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
        [Sitecore.Data.Items.Item]$item
    )
    
    if ($item) {
		$defaultLayout = Get-LayoutDevice "Default"
        $AllRenderingsInPlaceholder= Get-Rendering -Item $item -Placeholder $placeholderH -Device $defaultLayout -FinalLayout
        $sidebarComponentInPlaceholder= Get-Rendering -Item $item -Rendering $RenderingItem -Placeholder $placeholderH -Device $defaultLayout -FinalLayout
        
        if($sidebarComponentInPlaceholder -eq $null)
        {
             Add-Rendering -Item $item -PlaceHolder $placeholderH -Instance $renderingItemWithPlaceholder -Datasource $DatasourcePath.Paths.Path -Device $defaultLayout -FinalLayout
		    	$count+=1;
		    	$changedItem=New-Object PSObject -Property @{
		    	    Name=$item.Name
		    	    ItemPath=$item.Paths.Path
		    	    RenderingName=$RenderingItem.Name
		    	    DatasourcePath=$DatasourcePath.Paths.Path
		    	}
		    	$changedItems.Add($changedItem)
        }
        else{
       # Get-Rendering -Item $item -Placeholder $placeholderH | 
        foreach($rendering in $AllRenderingsInPlaceholder)
        {
		   #if($sidebarComponentInPlaceholder -ne $null){
		   if($rendering.ItemId -eq '{6YUIY897-H67L-4B89-MMA7F-0OJKY78L9}'){
		       $rendering.DataSource = $DatasourcePath.Paths.Path
                Set-Rendering -Item $item -Instance $rendering
		        #Set-Rendering -Item $item -PlaceHolder $placeholderH -Instance $renderingItemWithPlaceholder -Datasource $DatasourcePath.Paths.Path -Device $defaultLayout -FinalLayout
		    	$count+=1;
		    	#$IsRenderingAdded=$false
		    	$changedItem=New-Object PSObject -Property @{
		    	    Name=$item.Name
		    	    ItemPath=$item.Paths.Path
		    	    RenderingName=$rendering.Name
		    	    DatasourcePath=$DatasourcePath.Paths.Path
		    	}
		    	$changedItems.Add($changedItem)
		   }
		       
		   #}
        }
       }
    }
}

$items = @($root) + @(($root.Axes.GetDescendants())) | Where-Object {$_.TemplateName -eq "Article Page"} | Initialize-Item
$finalitems = $items | Where-Addrendering

if($changedItems.Count -eq 0) {
    Show-Alert "Zero Renderings added."
} else {
      #$finalitems = $items | Where-Addrendering
    $props = @{
        Title = "Rendering Added on Items"
        InfoTitle = "Rendering Added on Items  $($count)"
        InfoDescription = "Rendering Added on Items  $($changedItems.Count)"
        PageSize = 25
    }
    
    $changedItems |
        Show-ListView @props -Property @{Label="Icon"; Expression={$_.__Icon} },
            @{Label="Name"; Expression={$_.Name} },
            @{Label="RenderingName"; Expression={$RenderingItem.Name} },
            @{Label="Datasource Path"; Expression={$DatasourcePath.Paths.Path} },
            @{Label="ItemPath"; Expression={$_.ItemPath} }
}

Close-Window


No comments:

Post a Comment

How to Create a Public Link Using the Sitecore Content Hub REST API

Creating a public link using the Sitecore Content Hub REST API is a straightforward process that enables you to share content externally whi...