Come propagare su una lista l'aggiunta di un Field ad un Content Type
Può capitare, in SharePoint, che un content type (CT) deployato con una solution non aggiorni il CT figlio associato alla lista.
In particolare mi è capitato di aggiungere dei field ad un CT a livello di site collection e non vederli nel CT associato alla lista (la lista conteneva già degli item che usavano quel CT, quindi non potevo rimuoverlo e poi aggiungerlo).
Anche facendo, sul CT di site collection, un update spuntando il flag per aggiornare i figli, non ho ottenuto risultati, sembra un bug.
Infatti andando a vedere nell'oggetto SPContentType della lista, risultavano presenti i campi nella collection FieldLinks ma non in quella Fields.
L'unica alternativa che ho trovato per risolvere il problema, è questo codice C#:
che ovviamente va ripetuto per ogni campo mancante.
Questa la versione in PowerShell:
In particolare mi è capitato di aggiungere dei field ad un CT a livello di site collection e non vederli nel CT associato alla lista (la lista conteneva già degli item che usavano quel CT, quindi non potevo rimuoverlo e poi aggiungerlo).
Anche facendo, sul CT di site collection, un update spuntando il flag per aggiornare i figli, non ho ottenuto risultati, sembra un bug.
Infatti andando a vedere nell'oggetto SPContentType della lista, risultavano presenti i campi nella collection FieldLinks ma non in quella Fields.
L'unica alternativa che ho trovato per risolvere il problema, è questo codice C#:
C#
string url = "http://sharepoint.sgart.local/helpdesk/";
using (SPSite site = new SPSite(url))
{
using (SPWeb web = site.RootWeb)
{
SPList list = web.Lists["Requests"];
SPContentType ct = list.ContentTypes["SgartCTHelpDesk"];
//prendo il riferimento al campo nella site collection
SPField fld = web.Fields.GetFieldByInternalName("SgartCostCenter");
//lo elimino dal CT di lista
ct.FieldLinks.Delete(fld.Id);
//lo riaggiungo
ct.FieldLinks.Add(new SPFieldLink(fld));
//aggiorno il content type
ct.Update();
}
}
Questa la versione in PowerShell:
PowerShell
$u = "http://sharepoint.sgart.local/helpdesk/"
$w = Get-SPWeb $u
$l = $w.lists["Requests"]
$ct = $l.ContentTypes["SgartCTHelpDesk"]
$f = $w.Fields.GetFieldByInternalName("SgartCostCenter")
$ct.FieldLinks.Delete($f.Id);
$fl = New-Object Microsoft.SharePoint.SPFieldLink $f
$ct.FieldLinks.Add($fl)
$ct.update()