Restaurando el Managed Metadata Service y Content Type Hub de Desarrollo a Producción – Parte 1

Cuando trabajamos con la nueva funcionalidad de content type hubs que nos permiten centralizar los tipos de contenido para poder reutilizarlos en todas nuestras colecciones de sitios, se presenta la necesidad de trasladar lo trabajado de un ambiente de desarrollo hacia el ambiente final en producción. Esta actividad involucra 4 pasos fundamentales:

1. Restaurar el servicio de metadatos administrados.

2. Restaurar nuestro content type hub.

3. Reconfigurar el content type hub asociado al servicio de metadatos.

4. Republicar los content types desde el content type hub.

En este primer post explicaré los pasos para restaurar nuestro servicio de metadatos.

El primer paso es exportar nuestro servicio de metadatos para lo cual deberemos ejecutar el siguiente comando desde PowerShell:

a. capturar el Id del servicio de metadatos mediante el comando: Get-SPServiceApplication. (Especificarlo en la variable $mms).

b. capturar el Id del Proxy del servicio de metadatos con el comando: Get-SPServiceApplicationProxy. (Especificarlo en la variable $mmsproxy).

c. Ejecutar lo siguiente desde PowerShell:

$mms = «Id MMS»

$mmsproxy = «Id MMS Proxy»

Export-SPMetadataWebServicePartitionData -Identity $mms -ServiceProxy $mmsproxy -Path \rutabackupMMS.bak;

A continuación debemos importar nuestro servicio de metadatos sobre el nuevo ambiente, pero esto seguir los siguientes pasos:

a. copiar el backup del servicio de metadatos en una ruta compartida ubicada en el servidor de Base de datos (Muy importante!).

b. Dar permisos de lectura/escritura sobre la carpeta compartida a la cuenta del Application Pool del servicio de Metadatos (en mi caso la cuenta que yo empleo es sp_serviceapps tal y como se muestra en la imagen).

c. Asignar el rol de Bulkadmin sobre SQL a la cuenta mencionada en el paso b (sp_serviceapps).

 

d. Crear un nuevo servicio de metadatos en blanco en el nuevo ambiente.

e. capturar el Id del servicio de metadatos mediante el comando: Get-SPServiceApplication. (Especificarlo en la variable $mms).

f. capturar el Id del Proxy del servicio de metadatos con el comando: Get-SPServiceApplicationProxy. (Especificarlo en la variable $mmsproxy).

g. Ejecutar lo siguiente desde PowerShell:

$mms = «Id MMS»

$mmsproxy = «Id MMS Proxy»

Import-SPMetadataWebServicePartitionData -Identity $mms -ServiceProxy $mmsproxy -path \rutabackupMMS.bak -OverwriteExisting;

Con esto abremos restaurado de manera exitosa nuestro servicio de metadatos.

En el siguiente post explicaré como restaurar el content type hub y asociar este a nuestro servicio de metadatos administrados.

Agregando usuarios de otros dominios desde el Peoplepicker – SharePoint 2010

En un cliente se dio el escenario en el que se había instalado un granja de servidores de SharePoint 2010 sobre un dominio X, sin embargo esta Empresa disponía de múltiples dominios con relación de confianza que requerían tener acceso sobre el nuevo portal de SharePoint.

Adicionalmente un usuario con un mismo alias existía hasta en dos dominios distintos (Ej. DOMINIOXjperez y DOMINIOYjperez), los datos de la cuenta eran identicos en ambos dominios.

Cuando se intentaba buscar un usuario del DOMINIO Y en la mayoría de casos no se encontraba, habian casos excepcionales en donde si se encontraba el usuario de ese dominio, sin embargo, al intentar agregar salía un mensaje de error: «el usuario no es único».

Para resolver este problema fue necesario ejecutar el siguiente comando:

stsadm -o setproperty -pn peoplepicker-searchadforests -pv «domain:dominiox.com;domain:dominioy.com;domain:dominioz.com»  -url http://miportal

Debemos listar todos los dominios con relación de confianza de los cuales queremos agregar usuarios inclusive del dominio en donde se encuentra instalada la granja.

Conexiones entre DataFormWebParts – SharePoint 2010

En este post mostraré la forma de conectar webparts para mostrar información en base a los elementos seleccionados, esto nos resulta bastante útil en distintos escenarios, uno de ellos podría ser una galería de imágenes.

A continuación vemos una biblioteca de imágenes que he creado previamente, así mismo cargue algunas imágenes de ejemplo:

El resultado esperado sería el mostrado en la imágen siguiente.

Tengo la lista de imágenes disponibles en la galería al lado izquierdo y al lado derecho la imágen en tamaño completo.

Cuando doy clic al enlace de la imágen que deseo ver automáticamente aparecerá al lado derecho. 

Los pasos son sencillos. Primero desde SharePoint Designer debo agregar mis 2 DataFormWebParts. Al lado izquierdo solo mostraré el campo Título y al lado derecho solo mostraré la imágen.

 A continuación seleccionar el WebPart del lado izquierdo y dar clic en el botón Agregar Conexión ubicada en el Ribbon.

En la ventana que aparece dar clic en Siguiente.

 Dejar las opciones por defecto y Siguiente.

Nuevamente Siguiente. 

Seleccionar el ID como el campo que se enviará para comparar con el ID del segundo webpart.

 Finalmente seleccionar como campo que tendrá el vínculo al Título.

 Dar clic en Finalizar.

Y probemos nuestra página! un éxito!

Aplicando Filtros con cadenas de consultas en URL – SharePoint 2010

El diseño de páginas personalizadas que muestren contenido filtrado de elementos de una lista mediante parámetros en la URL resulta una características bastante útil y bastante empleada en múltiples portales.

Los requerimientos de clientes en cuanto al aspecto de los portales son muy variados y cada vez mas exigentes, no se sienten comodos con las vistas por defecto proporcionadas por el producto.

Es en estos escenarios cuando la personalización de páginas mediante el uso de HTML, CSS y XSLT nos permite lograr los resultados deseados.

Al personalizar nuestras páginas y pasar por parámetros los filtros tenemos la ventaja de no mostrar los elementos de listas tales como Anuncios, Eventos o Contactos con las vista de formulario por defecto.

En este post mostraré el uso de filtros de manera sencilla.

 Lo primero que debemos hacer es crear una nueva página de WebParts y desde SharePoint Designer insertar una vista de datos de la lista que deseemos filtrar.

En mi caso cree una lista de Contactos «Mis Contactos» y llene algunos datos para mis pruebas.

Una vez insertada nuestra vista de datos debemos dar clic al botón Parámetros en la parte superior (Ribbon).

Debemos agregar un nuevo parámetro del tipo Cadena de consulta. En mi caso agregue el parámetro Empresa.

En el ribbon dar clic la botón Filtro y agregar el Filtro que se muestra a continuación.

 Probar el filtro desde la página agregando a la url el parámetro. Debería ser algo así: http://miportal/SitePages/MiPagina.aspx?Empresa=CONTOSO

Se mostrará el filtro de manera adecuada.

 

 Ahora probemos agregando un segundo parámetro, en este caso Cargo.

 De la misma manera debemos añadir el Filtro correspondiente.

Finalmente para probar nuestro filtro deberemos añadir el parámetro a nuestra URL. Debería ser algo así: http://miportal/SitePages/MiPagina.aspx?Empresa=CONTOSO&Cargo=Analista

 

Espero les sea de utilidad!

Diseñando webparts con XSLT – Parte I (Mi Primer WebPart)

En este post les explicaré como diseñar sus propios webparts mediante SharePoint Designer. Estos diseños los he trabajado inclusive desde Office 365 por lo que en la nube tienen toda la flexibilidad para hacer este tipo de trabajos.

Lo que buscaremos es lograr la apariencia del webpart de Eventos que se muestra al lado derecho en la página de contenido que se muestra en la siguiente imagen:

Mi recomendación es siempre trabajar el diseño HTML a parte y desde aplicarlo sobre SharePoint.

Como verán trabaje un HTML con una hoja de estilos y el acabado es el siguiente:

Desde SharePoint designer abriremos nuestro HTML para analizarlo.

Debemos identificar en primer lugar la sección que hace referencia a la cabecera del webpart. Deberá ser un DIV.

De la misma manera debemos identificar el DIV asociado a el contenido del WebPart.

También debemos identificar las clases en el CSS utilizadas para formatear al WebPart.

Ahora para aplicarlo no es muy complicado. Abrimos una página de SharePoint desde SharePoint Designer, previamente debemos haber creado nuestra lista de eventos y registrar un par de eventos de ejemplo para efectos de las pruebas.

El css lo podemos copiar en la carpeta Style Library y referenciarla desde nuestro masterpage.

Debemos insertar en un WebPart Zone nuestro DataFormWebPart y obtendremos un XSLT.

En el XSLT ubicar la plantilla dvt_1 pues esta define la cabecera del WebPart, en realidad es la sección en donde aparecen los campos de la lista pero la formatearemos para que se muestre la cabecera de eventos.

Debajo de la sección de comparación $dvt_IsEmpty despues de <xsl:otherwise> debemos copiar la estructura del HTML de nuestra cabecera incluyendo el DIV principal que engloba a todo el WebPart, deberemos mantener algunas secciones del XSLT y debería quedar algo como esto (Entre las secciones <xsl:otherwise> y </xsl:otherwise>:

<div id=»wpart»>
  <div id=»wpart_tit» style=»width:310px»>
      <xsl:if test=»$dvt_1_automode = ‘1’» ddwrt:cf_ignore=»1″>
       <th class=»ms-vh» width=»1%» nowrap=»nowrap»></th>
      </xsl:if>

      <a href=»http://miportal.sharepoint.com/TeamSite/Lists/Eventos» style=»color:white»>Eventos</a> <img src=»http://miportal.sharepoint.com/TeamSite/SiteAssets/imagenes/ico_eventos.png» alt=»imagen» width=»40″ height=»40″ class=»iconos» />
  </div>
     <xsl:call-template name=»dvt_1.body»>
      <xsl:with-param name=»Rows» select=»$Rows»/>
      <xsl:with-param name=»FirstRow» select=»1″ />
      <xsl:with-param name=»LastRow» select=»$LastRow – $FirstRow + 1″ />
      </xsl:call-template>
</div>

Las secciones marcadas en negro son las que debemos mantener.

A continuación debemos ubicar la plantilla dvt_1.rowview y borrar todo el contenido que aparece por defecto.

Debemos copiar el HTML que define el cuerpo del WebPart algo así:

<div id=»wpart_cont» style=»padding:10px 10px 10px 10px;vertical-align:middle;width:310px»>
   <span class=»fecha_eventos»><xsl:value-of select=»@EventDate»/></span>
   <br />
   <span class=»nombre_evento»><a href=»{ concat(‘http://miportal.sharepoint.com/TeamSite/Lists/Eventos/DispForm.aspx?ID=’,@ID)}» class=»nombre_evento»><xsl:value-of select=»@Title»/></a></span>
   <br />
   <span class=»lugar_evento»><xsl:value-of select=»@Location»/></span><br/>
   <img src=»http://miportal.sharepoint.com/TeamSite/SiteAssets/imagenes/linea_h.jpg» alt=»imagen» class=»linea_h» />
  </div>

Las secciones en negro son aquellas donde mediante XSLT debemos referenciar a los campos de nuestra lista de eventos en reemplazo de los textos estáticos colocados en nuestro HTML inicial.

Guardamos los cambios y listo! tenemos nuestro primer WebPart diseñado con HTML, CSS y XSTL.

Configurando AAM para publicación de una aplicación web en SharePoint 2010

En un cliente donde se implementó una Intranet Corporativa con SharePoint 2010, se dio la necesidad de acceder al portal desde una red externa, esto debido a que los Gerentes desean consultar información desde su IPAD.

En vista de este requerimiento, se tuvo que configurar inicialmente dos nombre uno para acceso interno que sería http://intranet y otro para acceso hacia afuera que sería algo como http://intranet.contoso.com.

Esta configuración se logró mediante el uso de Alternate Access Mappings de SharePoint 2010, y los pasos los describo a continuación:

1. En la administración central, en application management, clic en Configure alternate access mappings.

2. Seleccionar nuestra aplicación web y dar clic en Edit Public URLs.

 

 3. En internet ingresar nuestro nombre alternativo http://intranet.contoso.com

 4. Para probar el acceso, en nuestro archivo hosts especificar la IP interna de nuestro servidor web de SharePoint y el nombre intranet.contoso.com

 5. Probar que tenemos acceso al nombre indicado haciendo un ping.

 6. La última parte es importante, debemos acceder a IIS y seleccionar nuestra aplicación web de SharePoint, en el panel de acciones dar clic en Bindings.

 7. Agregar el binding que se muestra en la imagen:

 8. Finalmente probar el acceso a la aplicación con el nuevo nombre.

JQuery desde mi Portal con SharePoint 2010 – Parte 4 (Slider de Imágenes)

Uno de los requerimientos más comunes en cuanto a diseño en portales es el uso de animaciones sobre el contenido publicado, por ejemplo el uso común de slider para mostrar imágenes dinámicamente que alimentemos en una biblioteca de imágenes.

Para lograr esta funcionalidad jquery nos sirve inmensamente, en Internet podemos encontrar varias animaciones trabajadas con jquery que están disponibles de manera gratuita y podemos reutilizar a nuestro gusto sobre SharePoint, yo elegí el uso de Nivo Slider: http://nivo.dev7studios.com/ pues su aplicación es sencilla.

Adicionalmente me base en 2 artículos que me sirvieron mucho durante este proceso:

http://sp365.co.uk/2011/09/making-use-of-the-nivo-slider-in-sharepoint/

https://www.nothingbutsharepoint.com/sites/eusp/Pages/Building-a-fully-featured-jQuery-content-slider-for-SharePoint-2010.aspx

A continuación paso a describir las actividades necesarias para lograr el resultado esperado:

1. Primero debemos descargar el archivo jquery.nivo.slider.pack.js de la página http://nivo.dev7studios.com/

2. Deberemos copiar dentro de Style Library, Scripts donde también se encuentra nuestra librería jquery.

3. Adicionalmente deberemos crear nuestro archivo actions.js para colocar nuestras funciones aquí.

4. Debemos abrir el archivo actions.js y pegar el siguiente código:

 $(document).ready(function() {
      var soapEnv = «<soapenv:Envelope xmlns:soapenv=’http://schemas.xmlsoap.org/soap/envelope/’>
          <soapenv:Body>
            <GetListItems xmlns=’http://schemas.microsoft.com/sharepoint/soap/’>
              <listName>Thumbs</listName>
              <viewFields>
                <ViewFields>
                  <FieldRef Name=’MiURL’ />
                </ViewFields>
              </viewFields>
            </GetListItems>
          </soapenv:Body>
        </soapenv:Envelope>»;
       
 $.ajax({
        url: «http://intranetdemo/_vti_bin/lists.asmx«,
        type: «POST»,
        dataType: «xml»,
        data: soapEnv,
        complete: renderSlides,
        contentType: «text/xml; charset=»utf-8″»
      });
     
    });
   
 function renderSlides(xData, status){
       $(xData.responseXML).find(«z\:row»).each(function() {
       var imgHtml = «<img src=’http://intranetdemo/» + $(this).attr(«ows_MiURL») + «‘ alt=» />»;
         $(«#slider»).append(imgHtml);
     });

  $(«#slider»).nivoSlider();    
 }

En la etiqueta <listName></listName> debemos especificar el nombre de nuestra biblioteca de imágenes.

En FieldRef Name debemos especificar el nombre de nuestro campo de donde obtendremos la URL del elemento actual (En mi caso cree un campo MiURL y mediante un workflow en designer cada vez que creo un nuevo elemento lo actualizo con su respectiva URL)

En la función renderSildes construyo la etiqueta <img src=»» /> especificando mi campo MiURL pero debo anteponerle ows_

Al final se construye un HTML con todas las imágenes de mi biblioteca y los coloco en un DIV con Id Slider, este DIV lo especificaremos más adelante en nuestra página de SharePoint.

De la misma manera ejecuto el evento nivoSlider() sobre el DIV antes mencionado.

 5. A continuación deberemos copiar nuestras hojas de estilo: nivo-slider.css y themes/default.css que obtuvimos con la descarga de Nivo Slider. Estas hojas de estilo las consolidaremos en una sola que deberemos copiar en la ruta Style Library/Styles

 6. Ahora deberemos actualizar las referencias a nuestra hoja de estilo y scripts sobre nuestro Master Page.

Referencia a Nivo Slider

<script src=»http://mirul/Style Library/Scripts/jquery.nivo.slider.pack.js» type=»text/javascript»></script>

Referencia a Actions.js

<script src=»http://mirul/Style Library/Scripts/actions.js» type=»text/javascript»></script>

Referencia a la hoja de estilos:

 <SharePoint:CssRegistration name=»<% $SPUrl:~sitecollection/Style Library/Styles/style.css %>» After=»corev4.css» runat=»server»/>

 7. Finalmente deberemos insertar el siguiente HTML sobre una página de SharePoint que hayamos creado:

<div id=»wrapper»  style=»width:100px»>
      <div class=»silder-wrapper theme-default»>
         <div id=»slider» class=»s4-notdlg»>
         </div>
     </div>
</div>

8. El resultado final será el siguiente:

 

http://stackoverflow.com/questions/7210294/sharepoint-trying-to-get-the-latest-id

Añadir servidores de base de datos a una granja existente

En SharePoint 2010 se administran una gran variedad de bases de datos. Tenemos la BD de Configuración, BDs de Contenido y BDs para las aplicaciones de servicio.

En algunos escenarios es recomendable que las bases de datos de contenido estén alojadas en servidores de BD separados, el mismo caso se cumple para las BDs de Aplicaciones de Servicio como por ejemplo las  BDs del servicio de búsqueda.

El procedimiento para agregar nuevos servidores de BD a la granja lo obtuve del siguiente enlace: http://technet.microsoft.com/en-us/library/cc262781.aspx

Paso a describir el procedimiento:

1. Primero debemos instalar un servidor de SQL Server 2008 R2 que disponga de las mismas actualizaciones del servidor de BD que aloja nuestra de BD de configuración (Verificar las actualizaciones). Este servidor debe estar unido al dominio.

2. Una vez que tenemos el servidor listo debemos dar los permisos de dbcreator y securityadmin a las cuentas administradores de la granja (Cuenta de instalación sp_install y cuenta de la granja sp_farm).

3. Habilitar el acceso al puerto 1433 desde el firewall del nuevo servidor de SQL.

4. Verificar la conexión desde el servidor de SharePoint 2010.

5. Configurar el Alias para SQL.

6. Crear una nueva aplicación web.

7. En la sección de Database Server por defecto se mostrará el servidor empleado durante la instalación de la granja.

8. Debemos especificar el alias del nuevo servidor de SQL.

9. Si no hemos dado permisos a las cuentas anteriormente especificadas (sp_install y sp_farm) obtendremos el siguiente mensaje de error:

 10. Una vez especificados los permisos de manera correcta, podremos crear la aplicación web sin problemas.

11. Se mostrará el nuevo servidor agregado. 

 12. La BD se habrá creado sin problemas en el nuevo servidor de SQL.

Forzar la publicación de los content types de un content type hub

Si después de publicar los content types de un content type hub estos no se muestran en nuestro portal subscrito esto se debe a que existen 2 timer jobs que se deben ejecutar y están programados para hacerlo, sin embargo su ejecución no es inmediata.

Para comprobar que la publicación funcione correctamente podemos iniciar los timer jobs mediante el Central Admin o vía PowerShell:

Ejecutar el siguiente script the PowerShell para poder ver nuestros content types publicados (Lo obtuve del siguiente link http://get-spscripts.com/2010/08/use-powershell-to-push-changes-from.html) :

#Run the Content Type Hub timer job
$ctHubTJ = Get-SPTimerJob «MetadataHubTimerJob«
$ctHubTJ.RunNow()

#Run the Content Type Subscriber timer job for a specific Web Application
$ctSubTJ = Get-SPTimerJob «MetadataSubscriberTimerJob» -WebApplication http://portal
$ctSubTJ.RunNow()

El http://portal representa la aplicación web que sea subscrito a nuestro content type hub, tendremos que ejecutar esa parte del script para cada aplicación web subscrita.

Si queremos realizar este procedimiento de manera manual tendremos que ingresar a la Aministración Central y en la sección de Monitoring seleccionar Review job definitions.

A continuación deberemos buscar el timer job Content Type Hub  y darle clic.

 

Después deberemos ejecutarlo de inmediato para lo cual deberemos dar clic en Run Now.

 Adicionalmente buscar el timer job Content Type Subscriber, existirá uno por cada aplicación web que este subscrita al Content type hub, por lo cual deberemos ejecutar el timer job de la aplicación web donde queramos ver replicados los content types de inmediato.

Personalizando el Search Center en SharePoint 2010 – Parte 3 (XML Search Results)

En el siguiente post veremos como obtener los resultados de búsqueda en formato XML esto nos será útil pues mediante este XML tendremos el control total para personalizar a nuestro gusto los resultados de búsqueda haciendo uso de XSLT.

A continuación los pasos:

1. Editar el Search Result WebPart

2. En el Editor XSLT copiar el siguiente XSLT:

<xsl:stylesheet version=»1.0″
  xmlns:xsl=»http://www.w3.org/1999/XSL/Transform«>
<xsl:output method=»xml» version=»1.0″ encoding=»UTF-8″ indent=»yes»/>
<xsl:template match=»/»>
  <xmp><xsl:copy-of select=»*»/></xmp>
</xsl:template>
</xsl:stylesheet>

3. Guardar los cambios. El resultado debería ser el siguiente: