Skip Ribbon Commands
Skip to main content

Laura Sánchez

:

Home
Blog de Laura Sánchez
June 04
PowerShell para crear aplicación web y colección de sitios

 

Aunque SharePoint 2010 sigue ofreciendo la posibilidad de utilizar la herramienta STSADM, la recomendación de Microsoft es usar Windows PowerShell para realizar tareas administrativas mediante linea de comandos.

 

Para utilizar los comandos de SharePoint en una consola de PowerShell tenemos dos opciones:

  1. Abrir una consola de PowerShell y cargar el ensamblado de SharePoint:

      [void][System.Reflection.Assembly]::LoadWithPartialName(“Microsoft.SharePoint”)

2.  Abrir la consola de admistración de SharePoint  2010 tal y como se ve en la siguiente imagen:

                                   Abrir ventana de comandos powershell

 

Vamos a comenzar por unas operaciones básicas: crear una aplicación web y crear una colección de sitios.

Estos son los comandos para cada una de las aplicaciones:

Crear una aplicación web

$spfarm = [microsoft.sharepoint.administration.spfarm]::local
$spWABuilder = new-object microsoft.sharepoint.administration.SPWebApplicationBuilder($spfarm)
$spWABuilder.ApplicationPoolId = "<NOMBRE_DEL_POOL_APLICACIONES>"
$spWABuilder.ApplicationPoolUsername = "<USERNAME_USUARIO_POOL>"
$securestring = ConvertTo-SecureString "<PASSWORD>" -asplaintext -force
$spWABuilder.ApplicationPoolPassword = $securestring
$spWABuilder.Port = <PUERTO (número)>
$spWABuilder.ServerComment = "<NOMBREAPPWEB>" (PEJ Sharepoint- Puerto)
$spWABuilder.CreateNewDatabase = $true
$spWABuilder.DatabaseServer = "<SERVIDOR\INSTANCIA>"
$spWABuilder.DatabaseName = "<NOMBRE BD>" (EJ: WSS_Content_SharePoint_Puerto)
$spWABuilder.RootDirectory = "C:\Inetpub\wwwroot\wss\VirtualDirectories\<PUERTO>"
$spWABuilder.UseSecureSocketsLayer = $false
$spWABuilder.AllowAnonymousAccess = $false
$webapp = $spWABuilder.Create()
$webapp.Provision()

Crear una colección de sitios

$template = Get-SPWebTemplate "<PLANTILLA_DE_SITIO (EJ:BLANKINTERNETCONTAINER#0)>"
New-SPSite -url
<URL DEL SITIO> -owneralias "<USUARIO>" -language <LCID (EJ:1033)> -name "<TITLE DEL SITIO>" -Template $template

 

Para obtener una lista de las plantillas existentes podemos utilizar el comando "Get-SPWebTemplate" sin pasar ningún parámetro:

                           Lista de plantillas

March 05
"Style.display is null" al editar un WebPart en MOSS

      Problema1: Obtenía este error javascript cuando quería modificar las propiedades de un WebPart desarrollado a medida o eliminarlo, y solo en esa página porque al añadir ese mismo WebPart a otra página de elementos web no lograba reproducir el error.

Para modificar sus propiedades tenía que editarlo desde la barra de herramientas de edición de la página.

      Problema2: Al intentar publicarla obtenía un error de validación de la página. La unica solución temporal era ir a la biblioteca de páginas y hacerlo desde allí.

 

El origen de todo este problema era que dos web part en la misma página tenían el mismo ID. ¿Y por qué? Pues "mea culpa". En el evento OnInit había borrado el base.OnInit(e), con lo cual no se estaba asignando un id correcto al WebPart.

 

¡¡OJO!! Buscando información sobre el tema, encontré varios casos similares pero con WebParts de MOSS. (Content Editor, Content Query..)

July 18
Mis Sitios de SharePoint : Membership y Web Part (Parte 1)

Una de las nuevas características de SharePoint 2007 es mostrar en la parte superior derecha de la página maestra un enlace desplegable con vínculos que el usuario ha configurado y otros a sitios de SharePoint.

Mis Sitios

 

El nombre del enlace, “Mis sitios de SharePoint” puede llevar a confusiones si no se lee bien la descripción: “Acceso rápido a sitios de los que es miembro”. Un usuario es miembro de un sitio cuando forma parte del grupo que se haya configurado en el sitio como Integrantes del sitio (por defecto, el grupo de Integrantes). Para ver en cualquier sitio cual es el grupo de integrantes, desde la configuración de Personas y Grupos (_layouts/people.aspx) debemos hacer clic en “Configuración” y en el desplegable seleccionar “Configurar grupos”).

clip_image004

Hay dos trabajos encargados de comprobar los sitios de los que es miembro un usuario: Sincronización de perfiles y Sincronización rápida de perfiles. Estos trabajos, entre otras cosas, actualizan la propiedad Memberships de los perfiles de usuario (http://msdn.microsoft.com/en-us/library/microsoft.office.server.userprofiles.userprofile.memberships.aspx) que es la utilizada por el control para pintar “Mis sitios de SharePoint”.

Además también podemos consultar el contenido de la propiedad mediante la página _layouts/MyMemberships.aspx o desde el sitio personal del usuario (enlace “Pertenencia a grupos”)

clip_image006

Pero, ¿qué pasa si hay usuarios que no tienen perfil? ¿O si en los permisos utilizamos grupos de DA y no usuarios individuales? ¿O si necesitamos buscar en más de un grupo y no solo en el grupo de miembros del sitio?

Pues que si por “Mis sitios de SharePoint” entendíamos sitios a los que tiene acceso el usuario (como es mi caso), esto no es suficiente.

En la parte 2 os enseño cómo obtener los sitios que puede ver un usuario.

July 18
Modificar Web Part de resultados de la búsqueda: enlace al elemento de un documento

En ocasiones el formato o los datos en el que se presentan los resultados de la búsqueda no satisfacen las necesidades del cliente.

La propiedad XSL del Web Part que muestra estos resultados (“Search Core Results”), permite modificar la forma en la que se muestran. Podéis ver más información aquí: http://msdn.microsoft.com/en-us/library/ms584121.aspx.

En este post encontré un ejemplo muy útil http://lanouse.spaces.live.com/Blog/cns!ECD2400FABABC2E2!334.entry. Se trata de mostrar un enlace al formulario de visualización del elemento si el resultado de la búsqueda es un documento de una biblioteca.

En resumen, los pasos a seguir son:

1)    Crear una nueva propiedad administrada que haga referencia al id del elemento (ows_id)

2)    Añadir nuestra nueva propiedad administrada a la lista de columnas que se podrán utilizar en el Web Part de resultados de la búsqueda

3)    Modificar el XSL para que muestre el enlace al elemento (si se trata de un documento) utilizando el id.

Tan solo una modificación del post referenciado: si las bibliotecas tienen carpetas el enlace al formulario de visualización no se forma correctamente. Este es el XSL que incluye la modifcación:

 

<xsl:template match="Result">

    <xsl:variable name="id" select="id"/>

    <xsl:variable name="url" select="url"/>

    <span class="srch-Icon">

      <a href="{$url}" id="{concat('CSR_IMG_',$id)}" title="{$url}">

        <img align="absmiddle" src="{imageurl}" border="0" alt="{imageurl/@imageurldescription}" />

      </a>

    </span>

   

    <script type="text/javascript">

      function GetUrlDispForm(strUrl,siteUrl, idEle)

      {

      siteUrl = siteUrl.toLowerCase() + "/";

      strUrl = strUrl.toLowerCase().replace(siteUrl,"");

      siteUrl += strUrl.substring(0,strUrl.indexOf("/"));

      siteUrl += "/Forms/DispForm.aspx?ID=";

      siteUrl += idEle;

      siteUrl += "&amp;Source=" + document.location.href;     

      window.navigate(siteUrl);

      }

    </script>

 

    <span class="srch-Title">

      <a href="{$url}" id="{concat('CSR_',$id)}" title="{$url}">

        <xsl:choose>

          <xsl:when test="hithighlightedproperties/HHTitle[. != '']">

            <xsl:call-template name="HitHighlighting">

              <xsl:with-param name="hh" select="hithighlightedproperties/HHTitle" />

            </xsl:call-template>

          </xsl:when>

          <xsl:otherwise>

            <xsl:value-of select="title"/>

          </xsl:otherwise>

        </xsl:choose>

      </a>   

        <xsl:if test="isdocument=1">

         

          <img align="absmiddle" src="/_layouts/images/slideShow.gif" border="0" alt="Ver Propiedades" />

          <a>

            <xsl:attribute name="href">

              javascript:GetUrlDispForm('<xsl:value-of select="url"/>','<xsl:value-of select="sitename"/>',<xsl:value-of select="idelemento"/>);

            </xsl:attribute>

            Ver Propiedades

          </a>

        </xsl:if>

     

    </span>

 

    <xsl:choose>

      <xsl:when test="$IsThisListScope = 'True' and contentclass[. = 'STS_ListItem_PictureLibrary'] and picturethumbnailurl[. != '']">

        <div style="padding-top: 2px; padding-bottom: 2px;">

          <a href="{$url}" id="{concat('CSR_P',$id)}" title="{title}">

            <img src="{picturethumbnailurl}" alt="" />

          </a>

        </div>

      </xsl:when>

    </xsl:choose>

    <div class="srch-Description">

      <xsl:choose>

        <xsl:when test="hithighlightedsummary[. != '']">

          <xsl:call-template name="HitHighlighting">

            <xsl:with-param name="hh" select="hithighlightedsummary" />

          </xsl:call-template>

        </xsl:when>

        <xsl:when test="description[. != '']">

          <xsl:value-of select="description"/>

        </xsl:when>

      </xsl:choose>

    </div >

    <p class="srch-Metadata">

      <span class="srch-URL">

        <a href="{$url}" id="{concat('CSR_U_',$id)}" title="{$url}" dir="ltr">

          <xsl:choose>

            <xsl:when test="hithighlightedproperties/HHUrl[. != '']">

              <xsl:call-template name="HitHighlighting">

                <xsl:with-param name="hh" select="hithighlightedproperties/HHUrl" />

              </xsl:call-template>

            </xsl:when>

            <xsl:otherwise>

              <xsl:value-of select="url"/>

            </xsl:otherwise>

          </xsl:choose>

        </a>

      </span>

      <xsl:call-template name="DisplaySize">

        <xsl:with-param name="size" select="size" />

      </xsl:call-template>

      <xsl:call-template name="DisplayString">

        <xsl:with-param name="str" select="author" />

      </xsl:call-template>

      <xsl:call-template name="DisplayString">

        <xsl:with-param name="str" select="write" />

      </xsl:call-template>

      <xsl:call-template name="DisplayCollapsingStatusLink">

        <xsl:with-param name="status" select="collapsingstatus"/>

        <xsl:with-param name="urlEncoded" select="urlEncoded"/>

        <xsl:with-param name="id" select="concat('CSR_CS_',$id)"/>

      </xsl:call-template>

    </p>

  </xsl:template>

 

 

July 17
Ámbito de búsqueda obligatorio

 

En una página de búsqueda avanzada de un centro de búsqueda podemos modificar las propiedades del Web Part para que muestre un selector de ámbito ordenados tal y como se configuran en los grupos de presentación de ámbitos (_layouts/viewscopes.aspx).

 

Sin embargo, si en la búsqueda avanzada no se selecciona ninguno de ellos, los resultados obtenidos serán, no solo del sitio en el que se configuran los ámbitos sino de cualquiera.

 

         Para seleccionar por defecto el ámbito predeterminado y/o hacer que sea obligatorio podemos añadir un Web Part Editor de contenido con código javascript que lo controle.

Reutilizando parte de código y de ideas de estos dos post (http://blogs.msdn.com/sharepointdesigner/archive/2007/06/13/using-javascript-to-manipulate-a-list-form-field.aspx, http://siderys.blogspot.com/2007/10/validacin-de-campos-en-un-formulario.html ) estos son los pasos que tenemos que seguir:

 

1)    Añadir nuestra función a la colección de funciones que se ejecutan en el evento PageLoad

        

       _spBodyOnLoadFunctionNames.push("CheckScopes");

 

2)    En la función CheckScopes, primero seleccionamos el primer check de ámbito de búsqueda que encontramos (que será el ámbito predeterminado),  y posteriormente nos registramos al evento “onmouseup” del botón “Buscar”.

 

function CheckScopes(){

 

var defaultCheck = getTagFromIdentifierAndTitle("input","ASB_SS_scb","",false);

if (defaultCheck != null){

defaultCheck.checked = true;

}

var objBuscar = getTagFromIdentifierAndTitle("input","ASB_BS_SRCH_1","",true);

if (objBuscar != null){

objBuscar.attachEvent("onmouseup",BuscarClick);

}

}

 

3)    Cuando se pulsa el botón “Buscar” debemos comprobar que al menos uno de los ámbitos está seleccionado. En caso contrario mostramos un mensaje de error.

 

 

function BuscarClick(){

 var cheked = false;

 var tags = document.getElementsByTagName("input");

 

 for (var i=0; i < tags.length; i++)  {

    var tempString = tags[i].id;

    if (tempString.indexOf("ASB_SS_scb") != -1)    {

        if (tags[i].checked){

            cheked = true;

            break;

        }

    }       

  }

 if (!cheked) {

     alert("Debe seleccionar un ámbito de búsqueda");

 }

 return cheked;

}

 

 

function getTagFromIdentifierAndTitle(tagName, identifier, title, same) {

    var len = identifier.length;

    var tags = document.getElementsByTagName(tagName);

   

    for (var i=0; i < tags.length; i++){

        var tempString = tags[i].id;

        if (tempString.indexOf(identifier) != -1){

            if (same){           

                if (tags[i].title == title && (identifier == "" || tempString.indexOf(identifier) == tempString.length - len)){

                    return tags[i];

                }

            }

            else{

                return tags[i];

            }

        }

    }

    return null;

}

 

NOTA: El id del botón “Buscar” del WebPart “AdvancedSearchBox” es ASB_BS_SRCH_1 y los id’s de los check de los ámbitos siempre contienen ASB_SS_scb_<posición>_<idambito>

 

June 23
Al actualizar una columna de sitio promocionada desde InfoPath, desaparece de la galería de columnas de sitio

Cuando creamos un formulario con InfoPath podemos, no solo publicarlo en SharePoint para utilizarlo como plantilla de una biblioteca de documentos sino promocionar algunos campos para que su valor se copie en columnas de dicha biblioteca.

Tal y como se describe en este post , cuando se promocionan campos del formulario, en la galería de columnas de sitio en el que se ha publicado podemos ver que se han creado columnas que posteriormente se pueden utilizar en las bibliotecas que utilicen el formulario como plantilla.

Hace poco, tras publicar un formulario tuve la necesidad de modificar el tipo de una de estas columnas de una línea de texto (text) a varias líneas de texto (note). Tras hacerlo, la columna “desapareció” de la galería y de las bibliotecas que la utilizaban.

Lo que ocurrió realmente fue que aunque el cambio se había hecho correctamente, la propiedad “ReadOnlyField” de la columna era “true”.

Para comprobarlo/modificar este valor podemos utilizar un código similar a éste:

SPSite site = new SPSite(<url del sitio>);

SPWeb web = site.OpenWeb();

         SPField field = web.Fields[<displayName de la columna>];

field.ReadOnlyField = false;

 

 About this blog

 
About this blog
Welcome to SharePoint Blogs. Use this space to provide a brief message about this blog or blog authors. To edit this content, select "Edit Page" from the "Site Actions" menu.