Con questo post inauguro (si fa per dire) una nuova sezione dedicata al CMS Open Source (scritto in C#) Umbraco. Durante questa settimana, abbiamo avuto la necessità di migrare un vecchio sito verso questa piattaforma, il problema principale è stato l'importazione di documenti PDF all'interno della sezione Media di Umbraco, e agganciare l'ID del nodo media di ogni file, al rispettivo controllo MediaPicker per i rispettivi documenti nella sezione Content. I PDF erano situati in una struttura di directory e sottodirectory con un particolare significato. Volevo condividere un piccolo esempio d'importazione per due motivi: per ricordarmelo ;-) e perchè magari qualcuno potrebbe capitare nella mia stessa situazione, in fondo il CMS è open source, quindi mi sembra il minimo...
Supponiamo di avere in Media un Folder denominato Documentazione, il cui nodo ha ID 8734
Supponiamo di avere tra i Documet Types, un NodeType denominato PaginaMediaPicker, contenente un Tab denominato content con due proprietà: title (Textstring) e attach (MediaPicker):
Inoltre nella sezione Content, supponiamo di avere una nodo denominato Importazione con ID=8806. A questo punto non ci resta che eseguire l'importazione dei dati, per aggiungendo così i documenti PDF nella cartella Documenti PDF della sezione Media, sotto il nodo Documentazione, e i rispettivi documenti di Content (istanze di PaginaMediaPicker) sotto il nodo Importazione. Possiamo creare una classe per l'importazione dei dati, come ad esempio:
1 public class ImportMedia
2 {
3 private umbraco.BusinessLogic.User _user = null;
4
5 public ImportMedia(umbraco.BusinessLogic.User user)
6 {
7 _user = user;
8 }
9
10 /// <summary>
11 /// Crea un nuovo Folder in Media. Se la funzione ha successo, ritorna
12 /// l'id del nodo creato
13 /// </summary>
14 /// <param name="parentId">ID del Parent sotto il quale creare il folder</param>
15 /// <param name="nome">Nome del folder da creare</param>
16 /// <returns></returns>
17 public int MakeFolderMedia(int parentId, string folderName)
18 {
19 try
20 {
21 MediaType folderType = MediaType.GetByAlias("Folder");
22 Media folder = Media.MakeNew(folderName, folderType, _user, parentId);
23
24 return folder.Id;
25 }
26 catch
27 {
28 return -1;
29 }
30 }
31
32 /// <summary>
33 /// Esegue la scansione ricorsiva della directory
34 /// </summary>
35 /// <param name="fullDirectoryPath">Percorso completo della directory contenente i documenti</param>
36 /// <param name="searchPattern">Pattern di ricerca dei file</param>
37 /// <param name="documentTypeName">Nome del tipo di documento (Document Type) da creare</param>
38 /// <param name="parentContentId">ID del nodo Content a cui aggiungere i nodi di tipo Content</param>
39 /// <param name="parentMediaId">ID del nodo Media a cui aggiungere i nodi documenti caricati</param>
40 public void ScanDirectory(string fullDirectoryPath, string searchPattern,
41 string documentTypeName, int parentContentId, int parentMediaId)
42 {
43 DirectoryInfo dInfo = new DirectoryInfo(fullDirectoryPath);
44 foreach (DirectoryInfo dir in dInfo.GetDirectories())
45 {
46 ScanDirectory(dir.FullName, searchPattern, documentTypeName, parentContentId, parentMediaId);
47 }
48
49 foreach (FileInfo file in dInfo.GetFiles(searchPattern))
50 {
51 MediaType fileType = MediaType.GetByAlias("File");
52 //Crea un oggetto Media, lo inserisce nell'albero sotto il nodo con ID uguale a parentMediaId
53 Media m = Media.MakeNew(file.Name, fileType, _user, parentMediaId);
54 m.getProperty("umbracoFile").Value = UploadFile(file.FullName,
55 m.getProperty("umbracoFile").Id,
56 m.getProperty("umbracoFile").VersionId);
57
58 if (m.Id > 0)
59 MakeDocument(documentTypeName, file.Name, parentContentId,
60 new string[] { "title", "attach" },
61 new string[] { file.Name, m.Id.ToString() }
62 );
63 }
64 }
65
66 /// <summary>
67 /// Crea un nuovo documento
68 /// </summary>
69 /// <param name="documentTypeName">Nome del Document Type da creare</param>
70 /// <param name="documentName">Nome del documento</param>
71 /// <param name="parentContentId">ID del nodo Content a cui aggiungere i nodi di tipo Content</param>
72 /// <param name="properties">Nomi delle proprietà del Document Type che devono essere valorizzate</param>
73 /// <param name="values">Valori delle proprietà del Document Type </param>
74 /// <returns></returns>
75 private int MakeDocument(string documentTypeName, string documentName, int parentContentId,
76 string[] properties, string[] values)
77 {
78
79 DocumentType dt = DocumentType.GetByAlias(documentTypeName);
80
81 if (properties.Length == values.Length)
82 {
83 Document d = Document.MakeNew(documentName, dt, _user, parentContentId);
84
85 for (int index = 0; index < properties.Length; index++)
86 d.getProperty(properties[index]).Value = values[index];
87
88 d.Publish(_user);
89
90 return d.Id;
91 }
92 else
93 {
94 throw new System.Exception("Wrong Data");
95 }
96 }
97
98
99 private string UploadFile(string fullFilePath, int propertyID, System.Guid versionID)
100 {
101 //Code...
102 }
103 }
Il sorgente completo della classe ImportMedia è in allegato al post. Il codice sopra, può essere utilizzato, ad esempio in una Web Form, nel seguente modo:
1 User user = new User(0);
2 ImportMedia import = new ImportMedia(user);
3
4 //8734, ID del Parent nella sezione Media
5 int mediaParentId = import.MakeFolderMedia(8734, "Documenti PDF");
6 if (mediaParentId > 0)
7 {
8 //8806, ID del Parent nella sezione Content
9 import.ScanDirectory(@"C:\Percorso_Cartella\PDFs",
10 "*.pdf", "PaginaMediaPicker", 8806, mediaParentId);
11 }
12 else
13 Response.Write("Errore nella creazione del folder in Media");
Una volta eseguito il codice, nella sezione Media, otterremo:
Mentre nel Content avremo:
Per la corretta esecuzione del codice, in un'applicazione web differente da quella di Umbraco, è necessario impostare correttamente il web.config.
La versione di Umbraco utilizzata è la 3.0.6.
Codice Completo della classe ImportMedia
Technorati Tag:
Umbraco,
Media