
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]))"
}
}