In un progetto che sto seguendo si ha la necessità di creare, in modo automatico, all’interno di una Document Library dei link a dei documenti che appartengono ad un’altra Document Library.
I documenti da linkare vengono gestiti con un Workflow e solo al termine dello stesso si può creare la copia.
Dato che la pubblicazione non deve essere sincrona alla fine del Workflow e dato che volevo eseguire un po’ di test su dei servizi Windows ho creato un piccolo Windows Service che non fa altro che chiamare una libreria esterna che esegue una serie di operazioni che desidero compiere: creare link, gestire le cartelle ecc…
Nella mia situazione partivo da questi dati preliminari:
1) La struttura tra le due Document Library è speculare: quindi stesse cartelle e stessi percorsi
2) La Document Library in cui andavo a copiare i documenti era autorizzata a vedere tutti i documenti in questione. Non avevo quindi bisogno di pormi il problema della gestione dell’authority.
Detto questo: ho creato una libreria che espone un metodo statico
public static void LinkAllDocuments(string WebSite, string FromLibrary, string DestLibrary)
, metodo che richiamerà poi una funzione ricorsiva (di tipo private), che scorrerà tutte gli item e le subfolder della list che stiamo analizzando
Il metodo pubblico accetta come parametri di input il WebSite dove si va ad operare e le due Document Library.
Questo metodo, volutamente, scorre brutalmente tutti i documenti della library.
Per poter creare un Item di tipo Content Type LINK è necessario inserire nella pagina ASPX che si va a creare del codice XSLT al fine di comunicare a MOSS che stiamo lavorando su un link.
Nel codice sottostante il percorso al documento che funge da template è in chiaro: è poi facilmente inseribile in una configurazione applicativa.
public static void LinkAllDocuments(string WebSite, string FromLibrary, string DestLibrary)
{
SPSite Site = new SPSite(WebSite);
Web = Site.OpenWeb();
oList = Web.Lists[FromLibrary];
CreaLink(oList.RootFolder, DestLibrary);
}
private static void CreaLink(SPFolder folder, string DestLibrary)
{
try
{
foreach (SPFile file in folder.Files)
{
//controllo che lo stato di un documento sia nello stato che desidero
if (file.Item["Stato"].ToString().ToUpper() == “PUBBLICATO”)
{
string _fldDest = file.ParentFolder.ToString();
SPFolder _c = Web.GetFolder(_fldDest);
if (_c.Exists)
{
//link al file
string fileLinkUrl = Web.Url + “/” + file.Url;
StringBuilder builder = new StringBuilder();
using (TextReader reader = new StreamReader(@”C:\linktodocumenttemplate.txt”))
{
builder.Append(reader.ReadToEnd());
}
builder.Replace(“{0}”, fileLinkUrl);
SPFile _newFile = _c.Files.Add(file.Name + “.aspx”, UTF8Encoding.UTF8.GetBytes(builder.ToString()), true);
//impostiamo le proprietà del nuovo link
SPListItem item = _newFile.Item;
item["Content Type"] = “Link”;
SPFieldUrlValue itemUrl = new SPFieldUrlValue();
itemUrl.Description = file.Title;
itemUrl.Url = fileLinkUrl;
item["URL"] = itemUrl;
//eseguiamo la COMMIT dei dati inseriti
item.Update();
}
}
}
//scorriamo tutte le sotto cartelle della cartella attuale
foreach (SPFolder subfolder in folder.SubFolders)
{
CreaLink(subfolder, DestLibrary);
}
}
catch (Exception e)
{
//Gestiamo l’errore
}
}
Qui di seguito il contenuto del file TXT che usiamo come template:
<%@ Assembly Name=‘Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c‘ %>
<%@ Register TagPrefix=‘SharePoint‘ Namespace=‘Microsoft.SharePoint.WebControls‘ Assembly=‘Microsoft.SharePoint‘ %>
<%@ Import Namespace=‘System.IO‘ %>
<%@ Import Namespace=‘Microsoft.SharePoint‘ %>
<%@ Import Namespace=‘Microsoft.SharePoint.Utilities‘ %>
<%@ Import Namespace=‘Microsoft.SharePoint.WebControls‘ %>
<html xmlns:mso=“urn:schemas-microsoft-com:office:office“ xmlns:msdt=“uuid:C2F41010-65B3-11d1-A29F-00AA00C14882“>
<Head> <META Name=‘progid‘ Content=‘SharePoint.Link‘>
<!–[if gte mso 9]><xml>
<mso:CustomDocumentProperties>
<mso:URL msdt:dt=”string”>{0}, {0}</mso:URL>
<mso:ContentType msdt:dt=”string”>Link to a Document</mso:ContentType>
</mso:CustomDocumentProperties>
</xml><![endif]–>
</head>
<body>
<form id=‘Form1‘ runat=‘server‘>
<SharePoint:UrlRedirector id=‘Redirector1‘ runat=‘server‘ />
</form>
</body>
</html>
File Word con l’articolo: creare-un-link-automaticamente-tra-due-document-library-in-moss-2007