Importer et exporter des données en dehors de Sitecore

Dans certains projets, on m’a demandé d’exporter et d’importer des données qui se trouvaient dans Sitecore afin que le personnel non technique puisse facilement les utiliser. Il peut s’agir de tout, de l’exportation des données personnelles des utilisateurs à la mise à jour des informations sur les produits dans un site Sitecore Commerce. Les exigences étaient que ces personnels non techniques ne devraient pas avoir à apprendre quoi que ce soit avec Sitecore pour faire leur travail. Ma solution consistait à exporter les données Sitecore pertinentes vers un fichier Excel et à créer un script afin d’importer les données mises à jour vers Sitecore.

We have this hierarchical list of product items under /sitecore/content/exhibitor/Product items/Products. The items could be of different templates: Product, EBMSProduct or LinkProduct. We are interested in managing some of their properties, but not all of them. Some of those properties, like “Serie”, are keys to other Sitecore objects.

Dans cet example, nous avons une liste hiérarchique d’articles de produit sous /sitecore/content/exhibitor/Product items/Products. Les éléments peuvent être de différents templates: Product, LegacyProduct ou LinkProduct. Nous allons relever certaines de leurs propriétés, mais pas toutes. Certaines de ces propriétés, comme “Serie”, sont des clés vers d’autres objets Sitecore.

Export Sitecore data to an Excel/CSV file

Get-Item -Path master:// -Query "/sitecore/content/exhibitor/Product items/Products//[@@TemplateName = 'Product' or @@TemplateName = 'LegacyProduct' or @@TemplateName = 'LinkProduct']" -Language "" | Show-ListView -Property `
@{ Name="Item path"; Expression={$_.FullPath}},
@{ Name="Template"; Expression={$_.TemplateName}},
@{ Name="Displaynamn"; Expression={$_."_Display name"}}, @{ Name="Intro"; Expression={$."Intro"}},
@{ Name="Språk"; Expression={$_.Language}},
@{ Name="Artikelnr"; Expression={Split-Path -Path $_.FullPath -Leaf -Resolve}},
@{ Name="Serie"; Expression={get-item -ID $_."Serie" -Path master:// | select-object -Property Name}},
@{ Name="USP"; Expression={$_."USP"}},
@{ Name="Egenskaper (kort)"; Expression={$_."PropertiesShort"}},
@{ Name="Viktig att-tänka-på"; Expression={$_."ImportantNote"}},
@{ Name="Beskrivning lång"; Expression={$_."Description"}},
@{ Name="Egenskaper lång"; Expression={$_."PropertiesFull"}},
@{ Name="Tillbehörstext"; Expression={$_."Accessories"}},
@{ Name="Tillståndstext"; Expression={$_."Permits"}},
@{ Name="Villkorstext"; Expression={$_."Terms"}},
@{ Name="Taggar för filtrering"; Expression={$_."ProductTags"}},
@{ Name="Link (LinkProductOption)"; Expression={$_."Link"}}

Nous récupérons tous les pbjets sous /sitecore/content/exhibitor/Product items/Products avec un template correct. Ensuite, nous utilisons la commande Show-ListView pour présenter les informations dans un tableau sous SPE, ses colonnes etant définies avec le paramètre -Property

Quand ce tableau s’ouvre, on peut alors vérifier les informations et les sauvegarder dans un fichier CSV.

Importer des informations depuis un fichier Excel/CSV vers Sitecore

Avant d’exécuter ce script, assurez-vous que le fichier CSV est au codage UTF-8.

Le script lit le fichier (Import-CSV) et demande spécifiquement un “;” comme délimiteur de colonne.

Il parcourt ensuite toutes les lignes du fichier, obtenant des objets Sitecore avec l’identifiant de la première colonne (Get-Item). Si l’objet existe, il est mis à jour avec les données du fichier, suivant une logique basée sur le template de l’objet.

$importData = Import-CSV "C:\Olivier\example_produkt_taggar_import.csv" -Delimiter ";"
$cols = $importData[0].psobject.properties.name
$i = 0;
foreach ( $row in $importData ) {
    IF ([string]::IsNullOrWhitespace($row.$($cols[0]))){continue}
	$language = $row.$($cols[4])
    $item = Get-Item -Path master:$($row.$($cols[0])) -ErrorAction SilentlyContinue -Language $language
	# Write-Host $i $item."__Display name"
    $DiamondsId = "{00A922C7-2834-4C9E-92F9-51130AC408C7}"
	$SpaceWallId = "{2BFCB42A-EC2E-4426-A66F-3B296222C42F}"
	$template = $row.$($cols[1])
    if ($item) {
		$i++;
		$series = $row.$($cols[6])
        $item.Editing.BeginEdit()
		if (!$template.Contains("Option")) {
			$item."Intro" = $row.$($cols[3])
			$item."USP" = $row.$($cols[7])
			$item."PropertiesShort" = $row.$($cols[8])
			$item."ImportantNote" = $row.$($cols[9])
			$item."Description" = $row.$($cols[10])
			$item."PropertiesFull" = $row.$($cols[11])
			if ($series) {
				if ($series.Contains("Diamonds")) {
					$item."Serie" = $DiamondsId
				} else {
					if ($series.Contains("Spacewall")) {
						$item."Serie" = $SpaceWallId
					}
				}
			}
		} 
		if ($template.Contains("Link") -and $template.Contains("Option")) {
			$item."Link" = $row.$($cols[16])
		}
		$item."ProductTags" = $row.$($cols[15])

        $item."__Display name" = $row.$($cols[2])
        
		$item.Editing.EndEdit() | Out-Null
    }
    else {
        Write-Host "Couldn't find: $($row.$($cols[0]))"
    }
}

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: