Inherits Cloud

Loving Microsoft Cloud, specially Office 365

Mes: marzo 2012

Office 365: No me aparecen los tipos de contenido de Excel, PowerPoint y OneNote

Sinceramente, desconozco el motivo, pero mi SharePoint Online no viene por defecto con los tipos de contenido de Office (excepto Word, que es el tipo por defecto para las bibliotecas de documentos).

En este post he encontrado la solución, aunque no la explicación:

http://office.microsoft.com/en-us/sharepoint-online-enterprise-help/add-multiple-office-templates-to-a-document-library-HA102409514.aspx

Tras seguir los pasos, que básicamente consiste en crear un nuevo tipo de contenido personalizado, que hereda de documento, y configurar sus propiedades avanzadas, donde en la plantilla a utilizar, la damos un fichero en blanco de tipo Office que queramos.

En ese mismo post, pone la siguiente nota:

“if your organization is using SharePoint Online/Microsoft Office 365, and you use the Microsoft Office Web Applications instead of Microsoft Office client programs, you must follow the steps in this article to enable users to create multiple Microsoft Office document types in a document library from within the browser.”

Esto pretende ser la explicación de por qué no aparecen esos tipos de contenido por defecto. Pero como os digo, pues no lo tengo muy claro, ya que en mi caso, usamos los clientes de Office. Al menos hasta donde yo lo entiendo.

Sea como sea, por lo menos tenemos una solución. Yo lo he hecho con OneNote, y funciona bien:

image

Si alguien sabe el motivo, que lo deje como comentario y actualizaré el post. Yo voy a seguir indagando.

Saludos!!

SharePoint 2010: Cacheando webparts visuales con OutputCache

¿Te va lento tu sitio de SharePoint? … menuda preguntita

Si la respuesta es que sí, o al menos, crees que sí, es posible que este post te pueda ayudar. Ojo, no voy a preguntar, cómo has llegado hasta esa “lentitud”, y ya te aseguro, que habrá muchas más soluciones, pero aquí vamos a ver una posible solución, bastante rápida de probar, y de deshacer en caso de que no te sirva.

Otra condición para que te pueda ser útil tu post, es que tu desarrollo haga uso de UsersControls de asp.net (si tienes webparts visuales, tienes UserControls Sonrisa)

Y la última condición, es la de siempre, cuando se trata de Cache, y es que la información que muestras en ese caso, no necesitas que sea “tiempo real”

Un caso concreto, bastante típico, es cuando has desarrollado algún control para una navegación personalizada. Es muy posible que tengas algoritmos recursivos complejos, que penalizan el rendimiento, y también es muy posible, que ese menú, cambie muy de vez en cuando.

Al lío. Partimos de un visual webpart. Si queremos cachear el contenido que genera ese user control, es tan sencillo como usar la directiva OutputCache sobre el .ascx:


El atributo Duration indica el tiempo que se cacheará el contenido, y se expresa en segundos. El atributo VaryByParam, ahora luego lo explicaremos. De momento lo dejamos a “None”, que indica que no se tenga en cuenta (es obligado indicar algún valor).

Para probar que se cachea, vamos a añadir una etiqueta a nuestro control, que muestre la hora actual:


Hacemos el deploy y lo añadimos a una página.

image

No se puede ver, pero cuando refresco el navegador, el valor sigue siendo el mismo, hasta dentro de 10 segundos, que se refresca a la hora actual. Funciona!! Sonrisa

¿Y que ocurre si mi webpart, muestra datos en función de algún parámetro que llega por QueryString? Pues para eso, podemos utilizar el VaryByParam, indicando el nombre del parámetro que viaja en la querystring:


Si modificamos ligeramente el código del usercontrol con:


Y volvemos a probar, veremos que en este caso, el contenido se cachea según el valor de la querystring “option”. Por ejemplo, cargamos la página por primera vez, y obtenemos:

QuestyString option: A. Time: 3/23/2012 6:29:54 PM

Si acto seguido (antes de que pasen los 10 segundos), cargamos la página de nuevo, pero pasando por querystring: “?option=B”, tenemos:

QuestyString option: B. Time: 3/23/2012 6:29:58 PM

Fijaros que todavía no se han cumplido los 10 segundos, y vemos un valor actualizado con la “option=B”.

Te recomiendo que le eches un vistazo a todas las posibilidades de la directiva OutputCache, ya que tiene más opciones que quizá te interesen (por ejemplo, cachear, no en función de un parámetro, sino del valor que tome otro control: listbox, textbox, etc).

Para acabar, otra recomendación importante, es que antes de hacer nada, midas que es lo que está causando ese mal rendimiento. Porque: ¿seguro que va lento? ¿seguro que es un problema de tu código? (igual es la red, o que el servidor está mal dimensionado, o la instalación, o la alineación de Júpiter con Saturno…)

Para medir esto, podemos utilizar 2 objetos:

Lecturas recomendadas:

Articulos panel del desarrollador (Por Gustavo Velez):

http://www.gavd.net/servers/sharepointv4/spsv4_item.aspx?top=4&itm=972

http://www.gavd.net/servers/sharepointv4/spsv4_item.aspx?top=art&itm=1417

http://www.gavd.net/servers/sharepointv4/spsv4_item.aspx?top=1&itm=1433

Serie “Developing for Perfomance” (por Tobias Zimmergren)

http://www.zimmergren.net/technical/sp-2010-developing-for-performance-part-1-developer-dashboard

Office 365: Configurando Lync 2010 para iPad

Ya hace un tiempo que tenemos disponible Lync para iPad, pero todavía no lo había probado, y la verdad, es que me ha sorprendido gratamente.

Podéis descargarlo desde iTunes (http://itunes.apple.com/us/app/microsoft-lync-2010-for-ipad/id484222449?mt=8), y es muy sencillo de configurar. Lo único que os puede marear, es en el caso de que estéis utilizando más de un dominio de Office 365: por ejemplo, el típico de “nnn.onmicrosoft.com”, y el corporativo de la empresa: “fabrikam.com”.

En este caso, tenemos que introducir 2 nombres de usuario diferentes. El primero es el del dominio “nnn.onmicrosoft.com”, mientras que el segundo, es el usuario de tu dominio corporativo: “fabrikam.com”

login_lync_ipad

Y una vez configurado, ya podemos usar lync desde el iPad:

image

Espero que os sirva.

Saludos!!

Office 365: Provisionando PropertyBags de forma declarativa (idem para SharePoint 2010)

Seguramente, si habéis desarrollado alguna solución para SharePoint, más allá de los típicos webparts, habréis necesitado almacenar “parámetros” de configuración, por ejemplo, la URL de un servicio web en Azure, tu AppId para usar Bing Maps, etc.

Existen varias opciones para hacer esto, yo hoy os voy a hablar de usar las PropertyBags. En SharePoint, la mayoría de los objetos, tienen una propiedad “Properties” que suele ser un HashTable o un SPPropertyBag para poder almacenar propiedades en modo key-value.

Algunas clases que contienen esa propiedad son:

Si queremos provisionar valores a ese campo de forma declarativa, lo podemos hacer usando un elemento Module, de Visual Studio.

En su Elements,xml, usaremos el nodo PropertyBag. En el MSDN está perfectamente explicado el significado de cada propiedad. Yo os dejo un ejemplo de uso de todas las combinaciones posibles:


































Con esto, al desplegar nuestra solución, provisionaremos esas Properties a nuestros elementos (webs, ficheros o items de listas).

Para acabar, un simple ejemplo de como iterar por esa bolsa de propiedades. En este caso, recorremos las Properties del SPWeb raíz:














Espero que os sirva.

Un saludo!!

SharePoint 2010: Cambiando el GUID de una clase que hereda de SPFeatureReceiver

Recientemente, he tenido que cambiar GUIDs, nombres y demás, a un proyecto SharePoint de Visual Studio.

Pues bien, si se cambia el GUID de una clase que es manejadora de los eventos de una Feature:


Tendremos que cambiar también el ID que aparece en las propiedades de la Feature, desde Visual Studio.

image

Sin embargo, si usamos la herramienta para generar GUIDs de Visual Studio:

image

Nos generará un GUID en mayúsculas, que si tal cual colocamos, tanto en el fichero de la clase, como en las propiedades de la feature, al desplegarlo en SharePoint, no encontraremos el pantallazo de error.

No sé si, porque me sonaba de haber leído algo parecido, o porque lo soñé, o porque ya llevo mis añitos viendo cosas “raras”, se me ocurrió que podía ser que el GUID debiera estar en minúsculas, así que, a ello fui. Y, sin cambiar nada más, la cosa funcionó!!, así que me temo que esa era la causa.

Espero que os sirva.

Saludos!!

Office 365: Branding en SharePoint Online con URLs relativas a mi colección de sitios (II)

Previously on Fringe

Digo, anteriormente vimos cómo referenciar hojas de estilos con rutas relativas a una colección de sitios de SharePoint Online, o a un sitio concreto. Sin embargo, esa misma técnica, no es aplicable si lo que queremos son añadir referencias a archivos .js.

Si intentamos hacer algo como lo siguiente:


Obtendremos una pantalla de error, con su correspondiente CorrelationID. En ese mismo error, ya veremos una pista de cómo resolverlo. Ya que nos dirá que debemos sustituirlo por un asp:literal.

Si le hacemos caso, y lo colocamos en el lugar adecuado, obtendremos el resultado esperado. Quedando como:

<script type="text/javascript" src='<asp:Literal runat="server" Text="<%$SPUrl:~SiteCollection/Style Library/JQUERY/mainFunctions.js%>" />’></script>

Otra opción que también parece funcionar, consiste en utilizar el control de SharePoint ScriptLink


Saludos!!

Office 365: Añadir opciones a un campo SPFieldChoice, no es tan evidente con la Sandbox!!

Hoy me he encontrado que algo tan “sencillo”, como añadir “options” a un campo de tipo SPFieldChoice, no es tan sencillo cuando lo hacemos en SharePoint online.

Si queremos añadir una opción más a un campo dado, el código sería tan sencillo como:


Si eso mismo, lo desplegamos en una solución de granja, funciona perfectamente.

Sin embargo, si lo hacemos en una solución sandbox, no obtendremos ningún error, pero la opción nunca se añadirá al SPFieldChoice.

En principio, la clase SPFieldChoice es perfectamente válida en Sandboxed solutions, su propiedad Choices también lo es.

El motivo lo desconozco por completo, y además, me parece rarísimo, ya que he revisado con Reflector el código del método UpdateInternal, y me parece de lo más sencillo, así que no me explico que puede haber diferente en la dll de la Sandbox, para que no funcione.

Por suerte, sí tenemos solución, y es tan “sencilla”, como editar la propiedad SchemaXml, y añadirle el XML necesario para la nueva Opción. Aquí podemos ver un ejemplo:


Esto lo podemos hacer bien sencillo con LINQ to XML:


Y así, podemos añadir una nueva opción a nuestro campo SPFieldChoice en soluciones Sandbox.

Saludos!!

© 2024 Inherits Cloud

Tema por Anders NorenArriba ↑