{"id":1527,"date":"2015-04-14T10:00:11","date_gmt":"2015-04-14T09:00:11","guid":{"rendered":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/?p=1527"},"modified":"2015-04-15T09:34:18","modified_gmt":"2015-04-15T08:34:18","slug":"office-365-aprovisionando-el-branding","status":"publish","type":"post","link":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/office-365-aprovisionando-el-branding\/","title":{"rendered":"Office 365: Aprovisionando el Branding"},"content":{"rendered":"<p><a href=\"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2015\/04\/Sharepoint_Branding_Small.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-1529\" src=\"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2015\/04\/Sharepoint_Branding_Small.png\" alt=\"Sharepoint_Branding_Small\" width=\"280\" height=\"160\" \/><\/a>En la entrada de la semana anterior vimos como se pod\u00eda aprovisionar los Displays Templates en un SharePoint OnPremise. A ra\u00edz de varias preguntas que me han realizado, creo que es la hora de abordar el tratamiento del aprovisionamiento de los sitios alojados en SharePoint Online. <strong>En este primer post vamos a ver como podemos aprovisionar los aspectos relativos al branding dentro de SharePoint Online.<\/strong><!--more--><\/p>\n<h1>Introducci\u00f3n<\/h1>\n<p>La personalizaci\u00f3n es uno de los aspectos que m\u00e1s requerimientos tienen los clientes a la hora de adoptar la plataforma, quieren que su Site Collection tenga por lo menos su identidad corporativa \u00a0(logo, tama\u00f1o\/fuente de letra, colores,etc&#8230;) Todo esto es posible con SharePoint Online, aunque hay que tener ciertos aspectos a la hora \u00a0de realizar esta customizaci\u00f3n (todos estos aspectos los podemos aprender aprender y conocer dentro del proyecto <a href=\"https:\/\/github.com\/OfficeDev\/PnP\" target=\"_blank\">GitHub\u00a0Patterns and Practices<\/a>\u00a0) Aunque<a href=\"http:\/\/blogs.office.com\/2014\/10\/02\/office-365-developer-podcast-episode-018-steve-walker-sharepoint-ux-developer-guidance\/\" target=\"_blank\"> la idea inicial y recomendada por Microsoft<\/a> es limitar la customizaci\u00f3n de la site collection a la minima expresi\u00f3n y realizar esta customizaci\u00f3n en la APP correspondiente, vamos a ver como poder aplicar un poco de dise\u00f1o a nuestro SharePoint Online.<\/p>\n<p>Como opini\u00f3n personal, <span style=\"text-decoration: underline;\">creo que estos dos aspectos son distintos:<\/span> por un lado aplicar <em>estilo a un SharePoint Online debe de ser posible<\/em> y por otro lado la customizaci\u00f3n excesiva y vinculada a la versi\u00f3n, es m\u00e1s un desarrollo a medida y por lo tanto nuestra forma de enfocar este proyecto deber\u00eda de ser utilizando el modelo APP.<\/p>\n<h1>Manos a la obra<\/h1>\n<p>El primer paso que es definir que artefactos\u00a0vamos a desplegar:<\/p>\n<ul>\n<li>Hojas de estilo, ficheros Javascript, imagenes<\/li>\n<li>Master Page<\/li>\n<li>PageLayouts<\/li>\n<\/ul>\n<h1>Despliegue de Ficheros<\/h1>\n<p>En soluciones OnPremise el despliegue de ficheros era de una forma muy sencilla haciendo uso de Modulos desde Visual Studio, indicarle la ruta y activar la feature. Para realizar esto en SharePoint Online, en primer lugar tendr\u00edamos que utilizar soluciones <strong>SandBox que est\u00e1n deprecated<\/strong>. El que est\u00e9n deprecated no significa que no se puedan utilizar, pero si que es conveniente no utilizarlas por <strong>un motivo principal<\/strong>: no sabemos si en futuras versiones tendremos compatibilidad.<\/p>\n<p>Descartada la opci\u00f3n Sandbox, nos quedar\u00eda utilizar PowerShell o bien utilizar el modelo de objetos de Cliente (CSOM). Si estuvi\u00e9ramos en un entorno OnPremises no tendr\u00edamos ninguna \u00a0duda \u00a0con PowerShell tenemos una API muy rica, junto con toda la potencia del lenguaje \u00a0pero desgraciadamente en SharePoint Online los cmdlets de PowerShell est\u00e1n bastante limitados. La diferencia entre los Cmdlets que hay en Online en OnPremise es 700\/30. \u00a0Por lo que la \u00fanica opci\u00f3n que disponemos es de utilizar CSOM. Una practica muy habitual es crear los propios Cmdlet haciendo uso de CSOM y de esta forma disponer de un gran n\u00famero de comandos PowerShell para facilitar la vida en el desarrollo en SharePoint Online.<\/p>\n<p>Para subir un fichero, lo que vamos a realizar es por un lado comprobar si la ruta donde vamos a alojar el fichero existe, comprobar que si el fichero existe no esta desprotegido, subir el fichero y posteriormente publicarlo y aprobarlo. Para ello utilizaremos un funci\u00f3n como la siguiente:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\npublic static void UploadFile(ClientContext clientContext, string name, string folder, string path)\r\n        {\r\n            var web = clientContext.Web;\r\n            var filePath = web.ServerRelativeUrl.TrimEnd(Program.trimChars) + &quot;\/&quot; + path + &quot;\/&quot;;\r\n           Console.WriteLine(&quot;Uploading file {0} to {1}{2}&quot;, name, filePath, folder);\r\n            EnsureFolder(web, filePath, folder);\r\n            CheckOutFile(web, name, filePath, folder);\r\n            var uploadFile = AddFile(web.Url, web, &quot;Branding\\\\Files\\\\&quot;, name, filePath, folder);\r\n            CheckInPublishAndApproveFile(uploadFile);\r\n        }\r\n<\/pre>\n<p>La definici\u00f3n de la funci\u00f3n EnsureFolder es la siguiente<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\nprivate static void EnsureFolder(Web web, string filePath, string fileFolder)\r\n        {\r\n            if (string.IsNullOrEmpty(fileFolder))\r\n            {\r\n                return;\r\n            }\r\n\r\n            var lists = web.Lists;\r\n            web.Context.Load(web);\r\n            web.Context.Load(lists, l =&gt; l.Include(ll =&gt; ll.DefaultViewUrl));\r\n            web.Context.ExecuteQuery();\r\n\r\n            ExceptionHandlingScope scope = new ExceptionHandlingScope(web.Context);\r\n            using (scope.StartScope())\r\n            {\r\n                using (scope.StartTry())\r\n                {\r\n                    var folder = web.GetFolderByServerRelativeUrl(string.Concat(filePath, fileFolder));\r\n                    web.Context.Load(folder);\r\n                }\r\n\r\n                using (scope.StartCatch())\r\n                {\r\n                    var list = lists.Where(l =&gt; l.DefaultViewUrl.IndexOf(filePath, StringComparison.CurrentCultureIgnoreCase) &gt;= 0).FirstOrDefault();\r\n\r\n                    ListItemCreationInformation newFolder = new ListItemCreationInformation();\r\n                    newFolder.UnderlyingObjectType = FileSystemObjectType.Folder;\r\n                    newFolder.FolderUrl = filePath.TrimEnd(Program.trimChars);\r\n                    newFolder.LeafName = fileFolder;\r\n\r\n                    ListItem item = list.AddItem(newFolder);\r\n                    web.Context.Load(item);\r\n                    item.Update();\r\n                }\r\n\r\n                using (scope.StartFinally())\r\n                {\r\n                    var folder = web.GetFolderByServerRelativeUrl(string.Concat(filePath, fileFolder));\r\n                    web.Context.Load(folder);\r\n                }\r\n            }\r\n\r\n            web.Context.ExecuteQuery();\r\n        }\r\n<\/pre>\n<p>La funci\u00f3n CheckOutFile tendr\u00eda la siguiente definici\u00f3n:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n  private static void CheckOutFile(Web web, string fileName, string filePath, string fileFolder)\r\n        {\r\n            var fileUrl = string.Concat(filePath, fileFolder, (string.IsNullOrEmpty(fileFolder) ? string.Empty : &quot;\/&quot;), fileName);\r\n            var temp = web.GetFileByServerRelativeUrl(fileUrl);\r\n\r\n            web.Context.Load(temp, f =&gt; f.Exists);\r\n            web.Context.ExecuteQuery();\r\n\r\n            if (temp.Exists)\r\n            {\r\n                web.Context.Load(temp, f =&gt; f.CheckOutType);\r\n                web.Context.ExecuteQuery();\r\n\r\n                if (temp.CheckOutType != CheckOutType.None)\r\n                {\r\n                    temp.UndoCheckOut();\r\n                }\r\n\r\n                temp.CheckOut();\r\n                web.Context.ExecuteQuery();\r\n            }\r\n        }\r\n\r\n<\/pre>\n<p>La funci\u00f3n de A\u00f1adir el fichero:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\nprivate static File AddFile(Web web, string filePath, string fileName, string serverPath, string serverFolder)\r\n        {\r\n            var fileUrl = string.Concat(serverPath, serverFolder, (string.IsNullOrEmpty(serverFolder) ? string.Empty : &quot;\/&quot;), fileName);\r\n            var folder = web.GetFolderByServerRelativeUrl(string.Concat(serverPath, serverFolder));\r\n\r\n            FileCreationInformation spFile = new FileCreationInformation()\r\n            {\r\n                Content = System.IO.File.ReadAllBytes(filePath + fileName),\r\n                Url = fileUrl,\r\n                Overwrite = true\r\n            };\r\n            var uploadFile = folder.Files.Add(spFile);\r\n            web.Context.Load(uploadFile, f =&gt; f.CheckOutType, f =&gt; f.Level);\r\n            web.Context.ExecuteQuery();\r\n\r\n            return uploadFile;\r\n        }\r\n<\/pre>\n<p>La definici\u00f3n de CheckIn PublishAndApproveFile:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n      private static void CheckInPublishAndApproveFile(File uploadFile)\r\n        {\r\n            if (uploadFile.CheckOutType != CheckOutType.None)\r\n            {\r\n                uploadFile.CheckIn(&quot;Updating branding&quot;, CheckinType.MajorCheckIn);\r\n            }\r\n\r\n            if (uploadFile.Level == FileLevel.Draft)\r\n            {\r\n                uploadFile.Publish(&quot;Updating branding&quot;);\r\n            }\r\n\r\n            uploadFile.Context.Load(uploadFile, f =&gt; f.ListItemAllFields);\r\n            uploadFile.Context.ExecuteQuery();\r\n\r\n            if (uploadFile.ListItemAllFields&#x5B;&quot;_ModerationStatus&quot;].ToString() == &quot;2&quot;) \/\/ SPModerationStatusType.Pending\r\n            {\r\n                uploadFile.Approve(&quot;Updating branding&quot;);\r\n                uploadFile.Context.ExecuteQuery();\r\n            }\r\n\r\n<\/pre>\n<h1>Despliegue de MasterPage<\/h1>\n<p>Para desplegar las masterPage que hemos dise\u00f1ado en primer lugar subiremos la master dentro de la carpeta de MasterPage. A continuaci\u00f3n protegemos y publicamos el fichero y por \u00faltimo establecemos esta MasterPage como p\u00e1gina maestra del sitio. Para ello (y utilizando gran parte de las funciones anteriores) utilizamos un c\u00f3digo similar al siguiente:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\npublic static void UploadMasterPage(ClientContext clientContext, string name, string folder)\r\n        {\r\n            var web = clientContext.Web;\r\n            var lists = web.Lists;\r\n            var gallery = web.GetCatalog(116);\r\n            clientContext.Load(lists, l =&gt; l.Include(ll =&gt; ll.DefaultViewUrl));\r\n            clientContext.Load(gallery, g =&gt; g.RootFolder.ServerRelativeUrl);\r\n            clientContext.ExecuteQuery();\r\n\r\n            Console.WriteLine(&quot;Uploading and applying {0} to {1}&quot;, name, web.ServerRelativeUrl);\r\n\r\n            var masterPath = gallery.RootFolder.ServerRelativeUrl.TrimEnd(new char&#x5B;] { '\/' }) + &quot;\/&quot;;\r\n\r\n            EnsureFolder(web, masterPath, folder);\r\n            CheckOutFile(web, name, masterPath, folder);\r\n\r\n            var uploadFile = AddFile(web.Url, web, &quot;Branding\\\\MasterPages\\\\&quot;, name, masterPath, folder);\r\n\r\n            SetMasterPageMetadata(web, uploadFile);\r\n            CheckInPublishAndApproveFile(uploadFile);\r\n\r\n            \/\/store the currently used master pages so we can switch back upon deactivation\r\n            var allWebProperties = web.AllProperties;\r\n            allWebProperties&#x5B;&quot;OriginalMasterUrl&quot;] = web.MasterUrl;\r\n            allWebProperties&#x5B;&quot;CustomMasterUrl&quot;] = web.CustomMasterUrl;\r\n\r\n            var masterUrl = string.Concat(masterPath, folder, (string.IsNullOrEmpty(folder) ? string.Empty : &quot;\/&quot;), name);\r\n            web.MasterUrl = masterUrl;\r\n            web.CustomMasterUrl = masterUrl;\r\n            web.Update();\r\n            clientContext.ExecuteQuery();\r\n        }\r\n<\/pre>\n<p>La funci\u00f3n \u00abSetMasterPageMetadata tiene la siguiente definici\u00f3n:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\nprivate static void SetMasterPageMetadata(Web web, File uploadFile)\r\n        {\r\n            var parentContentTypeId = &quot;0x010105&quot;; \/\/ Master Page\r\n            var gallery = web.GetCatalog(116);\r\n            web.Context.Load(gallery, g =&gt; g.ContentTypes);\r\n            web.Context.ExecuteQuery();\r\n\r\n            var contentTypeId = gallery.ContentTypes.FirstOrDefault(ct =&gt; ct.StringId.StartsWith(parentContentTypeId)).StringId;\r\n            var item = uploadFile.ListItemAllFields;\r\n            web.Context.Load(item);\r\n\r\n            item&#x5B;&quot;ContentTypeId&quot;] = contentTypeId;\r\n            item&#x5B;&quot;UIVersion&quot;] = Convert.ToString(15);\r\n            item&#x5B;&quot;MasterPageDescription&quot;] = &quot;Violin master page&quot;;\r\n            item.Update();\r\n            web.Context.ExecuteQuery();\r\n        }\r\n<\/pre>\n<h1>Desplegando los PageLayouts<\/h1>\n<p>Para desplegar los pageLayouts, realizaremos una funci\u00f3n similar al despliegue de las Master pero modificando los valores del PageLayout.<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n  public static void UploadPageLayout(ClientContext clientContext, string name, string folder, string title, string publishingAssociatedContentType)\r\n        {\r\n            var web = clientContext.Web;\r\n            var lists = web.Lists;\r\n            var gallery = web.GetCatalog(116);\r\n            clientContext.Load(lists, l =&gt; l.Include(ll =&gt; ll.DefaultViewUrl));\r\n            clientContext.Load(gallery, g =&gt; g.RootFolder.ServerRelativeUrl);\r\n            clientContext.ExecuteQuery();\r\n\r\n            Console.WriteLine(&quot;Uploading page layout {0} to {1}&quot;, name, clientContext.Web.ServerRelativeUrl);\r\n\r\n            var masterPath = gallery.RootFolder.ServerRelativeUrl.TrimEnd(Program.trimChars) + &quot;\/&quot;;\r\n\r\n            EnsureFolder(web, masterPath, folder);\r\n            CheckOutFile(web, name, masterPath, folder);\r\n\r\n            var uploadFile = AddFile(web.Url, web, &quot;Branding\\\\PageLayouts\\\\&quot;, name, masterPath, folder);\r\n\r\n            SetPageLayoutMetadata(web, uploadFile, title, publishingAssociatedContentType);\r\n            CheckInPublishAndApproveFile(uploadFile);\r\n        }\r\n\r\n<\/pre>\n<p>La funci\u00f3n \u00abSetPageLayoutMetadata\u00bb tiene la siguiente definici\u00f3n:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\nprivate static void SetPageLayoutMetadata(Web web, File uploadFile, string title, string publishingAssociatedContentType)\r\n        {\r\n            var parentContentTypeId = &quot;0x01010007FF3E057FA8AB4AA42FCB67B453FFC100E214EEE741181F4E9F7ACC43278EE811&quot;; \/\/Page Layout\r\n            var gallery = web.GetCatalog(116);\r\n            web.Context.Load(gallery, g =&gt; g.ContentTypes);\r\n            web.Context.ExecuteQuery();\r\n\r\n            var contentTypeId = gallery.ContentTypes.FirstOrDefault(ct =&gt; ct.StringId.StartsWith(parentContentTypeId)).StringId;\r\n            var item = uploadFile.ListItemAllFields;\r\n            web.Context.Load(item);\r\n\r\n            item&#x5B;&quot;ContentTypeId&quot;] = contentTypeId;\r\n            item&#x5B;&quot;Title&quot;] = title;\r\n            item&#x5B;&quot;PublishingAssociatedContentType&quot;] = publishingAssociatedContentType;\r\n\r\n            item.Update();\r\n            web.Context.ExecuteQuery();\r\n        }\r\n\r\n<\/pre>\n<h2>Conclusi\u00f3n<\/h2>\n<p>Poco a poco tenemos que ir viendo todas las posibilidades que hay en Office 365 para poder realizar los desarrollos y requerimientos de los clientes. Office 365 es la evoluci\u00f3n natural de nuestro SharePoint tradicional, cada vez tenemos m\u00e1s herramientas y utilidades para que las diferencias entre Online y OnPremise se acorten. Est\u00e1 claro que <strong>en la nube NUNCA vamos a tener las FARM Solutions<\/strong> pero esto desde mi punto de vista no es algo que limite a la plataforma sino m\u00e1s bien al contrario, la enriquece y hace utilizar cada herramienta en lo que realmente es su fuerte.<\/p>\n<p>En este post hemos visto como podemos aplicar branding a nuestros desarrollos de una forma relativamente simple. <strong>En futuros post veremos como podemos aprovisionar el resto de artefactos en Office 365.<\/strong><\/p>\n<p><strong>Referencias<\/strong><\/p>\n<p><a href=\"http:\/\/channel9.msdn.com\/Blogs\/Office-365-Dev\/Applying-Branding-to-SharePoint-Sites-with-an-App-for-SharePoint-Office-365-Developer-Patterns-and-P\" target=\"_blank\">http:\/\/channel9.msdn.com\/Blogs\/Office-365-Dev\/Applying-Branding-to-SharePoint-Sites-with-an-App-for-SharePoint-Office-365-Developer-Patterns-and-P<\/a><\/p>\n<p><a href=\"https:\/\/github.com\/OfficeDev\/PnP\" target=\"_blank\">https:\/\/github.com\/OfficeDev\/PnP<\/a><\/p>\n<span class=\"et_bloom_bottom_trigger\"><\/span>","protected":false},"excerpt":{"rendered":"<p>En la entrada de la semana anterior vimos como se pod\u00eda aprovisionar los Displays Templates en un SharePoint OnPremise. A ra\u00edz de varias preguntas que me han realizado, creo que es la hora de abordar el tratamiento del aprovisionamiento de &hellip; <a href=\"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/office-365-aprovisionando-el-branding\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":8,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[113],"tags":[138,139,38],"class_list":["post-1527","post","type-post","status-publish","format-standard","hentry","category-office-365-2","tag-aprovisionando","tag-branding-diseno","tag-office-365"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v18.2.1 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Office 365: Aprovisionando el Branding - Desarrollando sobre SharePoint<\/title>\n<meta name=\"description\" content=\"En este post vamos a ver como podemos aprovisionar el Branding en SharePoint Online haciendo uso CSOM.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/office-365-aprovisionando-el-branding\/\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"Office 365: Aprovisionando el Branding - Desarrollando sobre SharePoint\" \/>\n<meta name=\"twitter:description\" content=\"En este post vamos a ver como podemos aprovisionar el Branding en SharePoint Online haciendo uso CSOM.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2015\/04\/Sharepoint_Branding_Small.png\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Adri\u00e1n D\u00edaz\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/office-365-aprovisionando-el-branding\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/office-365-aprovisionando-el-branding\\\/\"},\"author\":{\"name\":\"Adri\u00e1n D\u00edaz\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/#\\\/schema\\\/person\\\/c9bfaede1bfba9564bb7f500788782bb\"},\"headline\":\"Office 365: Aprovisionando el Branding\",\"datePublished\":\"2015-04-14T09:00:11+00:00\",\"dateModified\":\"2015-04-15T08:34:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/office-365-aprovisionando-el-branding\\\/\"},\"wordCount\":1652,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/office-365-aprovisionando-el-branding\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2015\\\/04\\\/Sharepoint_Branding_Small.png\",\"keywords\":[\"aprovisionando\",\"branding dise\u00f1o\",\"office 365\"],\"articleSection\":[\"Office 365\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/office-365-aprovisionando-el-branding\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/office-365-aprovisionando-el-branding\\\/\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/office-365-aprovisionando-el-branding\\\/\",\"name\":\"Office 365: Aprovisionando el Branding - Desarrollando sobre SharePoint\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/office-365-aprovisionando-el-branding\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/office-365-aprovisionando-el-branding\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2015\\\/04\\\/Sharepoint_Branding_Small.png\",\"datePublished\":\"2015-04-14T09:00:11+00:00\",\"dateModified\":\"2015-04-15T08:34:18+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/#\\\/schema\\\/person\\\/c9bfaede1bfba9564bb7f500788782bb\"},\"description\":\"En este post vamos a ver como podemos aprovisionar el Branding en SharePoint Online haciendo uso CSOM.\",\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/office-365-aprovisionando-el-branding\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/office-365-aprovisionando-el-branding\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2015\\\/04\\\/Sharepoint_Branding_Small.png\",\"contentUrl\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2015\\\/04\\\/Sharepoint_Branding_Small.png\",\"width\":280,\"height\":160},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/#website\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/\",\"name\":\"Desarrollando sobre SharePoint\",\"description\":\"Arquitectura, buenas pr\u00e1cticas y desarrollo sobre la nueva herramienta de Microsoft SharePoint 2016\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/#\\\/schema\\\/person\\\/c9bfaede1bfba9564bb7f500788782bb\",\"name\":\"Adri\u00e1n D\u00edaz\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g\",\"caption\":\"Adri\u00e1n D\u00edaz\"},\"description\":\"Adri\u00e1n D\u00edaz es Ingeniero Inform\u00e1tico por la Universidad Polit\u00e9cnica de Valencia. Es MVP de Microsoft en la categor\u00eda Office Development desde 2014, MCPD de SharePoint 2010, Microsoft Active Profesional y Microsoft Comunity Contribuitor 2012. Cofundador del grupo de usuarios de SharePoint de Levante LevaPoint. Lleva desarrollando con tecnolog\u00edas Microsoft m\u00e1s de 10 a\u00f1os y desde hace 3 a\u00f1os est\u00e1 centrado en el desarrollo sobre SharePoint. Actualmente es Software &amp; Cloud Architect Lead en ENCAMINA.\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/author\\\/desarrollandosobresharepoint\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Office 365: Aprovisionando el Branding - Desarrollando sobre SharePoint","description":"En este post vamos a ver como podemos aprovisionar el Branding en SharePoint Online haciendo uso CSOM.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/office-365-aprovisionando-el-branding\/","twitter_card":"summary_large_image","twitter_title":"Office 365: Aprovisionando el Branding - Desarrollando sobre SharePoint","twitter_description":"En este post vamos a ver como podemos aprovisionar el Branding en SharePoint Online haciendo uso CSOM.","twitter_image":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2015\/04\/Sharepoint_Branding_Small.png","twitter_misc":{"Escrito por":"Adri\u00e1n D\u00edaz","Tiempo de lectura":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/office-365-aprovisionando-el-branding\/#article","isPartOf":{"@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/office-365-aprovisionando-el-branding\/"},"author":{"name":"Adri\u00e1n D\u00edaz","@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/#\/schema\/person\/c9bfaede1bfba9564bb7f500788782bb"},"headline":"Office 365: Aprovisionando el Branding","datePublished":"2015-04-14T09:00:11+00:00","dateModified":"2015-04-15T08:34:18+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/office-365-aprovisionando-el-branding\/"},"wordCount":1652,"commentCount":0,"image":{"@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/office-365-aprovisionando-el-branding\/#primaryimage"},"thumbnailUrl":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2015\/04\/Sharepoint_Branding_Small.png","keywords":["aprovisionando","branding dise\u00f1o","office 365"],"articleSection":["Office 365"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/office-365-aprovisionando-el-branding\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/office-365-aprovisionando-el-branding\/","url":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/office-365-aprovisionando-el-branding\/","name":"Office 365: Aprovisionando el Branding - Desarrollando sobre SharePoint","isPartOf":{"@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/office-365-aprovisionando-el-branding\/#primaryimage"},"image":{"@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/office-365-aprovisionando-el-branding\/#primaryimage"},"thumbnailUrl":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2015\/04\/Sharepoint_Branding_Small.png","datePublished":"2015-04-14T09:00:11+00:00","dateModified":"2015-04-15T08:34:18+00:00","author":{"@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/#\/schema\/person\/c9bfaede1bfba9564bb7f500788782bb"},"description":"En este post vamos a ver como podemos aprovisionar el Branding en SharePoint Online haciendo uso CSOM.","inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/office-365-aprovisionando-el-branding\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/office-365-aprovisionando-el-branding\/#primaryimage","url":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2015\/04\/Sharepoint_Branding_Small.png","contentUrl":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2015\/04\/Sharepoint_Branding_Small.png","width":280,"height":160},{"@type":"WebSite","@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/#website","url":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/","name":"Desarrollando sobre SharePoint","description":"Arquitectura, buenas pr\u00e1cticas y desarrollo sobre la nueva herramienta de Microsoft SharePoint 2016","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/#\/schema\/person\/c9bfaede1bfba9564bb7f500788782bb","name":"Adri\u00e1n D\u00edaz","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g","caption":"Adri\u00e1n D\u00edaz"},"description":"Adri\u00e1n D\u00edaz es Ingeniero Inform\u00e1tico por la Universidad Polit\u00e9cnica de Valencia. Es MVP de Microsoft en la categor\u00eda Office Development desde 2014, MCPD de SharePoint 2010, Microsoft Active Profesional y Microsoft Comunity Contribuitor 2012. Cofundador del grupo de usuarios de SharePoint de Levante LevaPoint. Lleva desarrollando con tecnolog\u00edas Microsoft m\u00e1s de 10 a\u00f1os y desde hace 3 a\u00f1os est\u00e1 centrado en el desarrollo sobre SharePoint. Actualmente es Software &amp; Cloud Architect Lead en ENCAMINA.","url":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/author\/desarrollandosobresharepoint\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/posts\/1527","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/comments?post=1527"}],"version-history":[{"count":0,"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/posts\/1527\/revisions"}],"wp:attachment":[{"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/media?parent=1527"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/categories?post=1527"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/tags?post=1527"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}