Inserito da: mandev | Ottobre 9, 2008

Creare un link automaticamente tra due Document Library in MOSS 2007

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

 


Lascia un commento

La tua risposta:

Categorie