miércoles, 30 de septiembre de 2015

Desarrollando soluciones WSP separando las responsabilidades en SharePoint

Separar las responsabilidades implica escribir el código de tal forma que el código solo tenga una responsabilidad y delege a otro segmento de codigo la responsabilidad que no le compete al codigo escrito.  Este principio en el desarrollo de software se aplicado a Desarrollo en N-Capas, Diseño basado en Dominio.  Pero en SharePoint es un reto desarrollar de esta forma ya que deforma predeterminada todo se instala en el GAC y los cambios del codigo se ven reflajados hasta que el GAC se actualice.  Y en ambientes de producción en la implementación es un stress inecesario y riesgo.

Que podemos hacer?  Podemos definir a nivel quel Paquete de SharePoint que los ensamblados se instalen en la Web Application en vez del Global Assembly Cache.  Para ello también es necesario firmar cada ensambaldo.

Primero separamos en Proyectos de librerias de clases exceptuando el Project de Visual WebPart de SharePoint.

image

En el proyecto común tenemos la definición de las entidades de negocio y las interfases de los repositorios y servicios.

image

El proyecto de Repositorio tenemos las implementaciones de el código de acceso a base de datos de las operaciones básicas hacia la base de datos o CRUD (Create Read Update & Delete).  Ninguna lógica de negocio, como validaciones u operaciones entre diferentes Repositorios.

image

El proyecto de Servicios es donde se encuentra la lógica del negocio e invoca a los repositorios necesarios para cumplir con la regla de negocio.

image

Este proyecto es otro Repositorio Especializado para invocar las librerias de SharePoint y acceder los objetos de SharePoint, separado de la base de datos ya que no comparten las mismas librerias.

image

Para finalizar el proyecto de SharePoint que representa la Capa de Presentación o Visualización.  Aquí podemos aplicar el patrón MVP o Model View Presenter.

image

Detalles a Conocer.

1) Para cada Ensamblado firmamos el emsamblado esto lo relizamos en las propiedades del proyecto en la opción Signing.

image

2) Referenciar los proyectos según su dependencia que debe de ser jerarquica y no cruzada, evitar la referencia ciclica.

image

En el paquete agregamos los ensamblados que deben de incluirse en la solución WSP.

image

Y debemos indicar que es a nivel de Web Application y no a nivel de GAC.

image

Y eso es todo.  Una ultima nota si en caso le reporta que no encuentra algunas referencias solo seleccione la opción Clean Solution en Build. 

SharePoint4Fun!,

Juan Manuel Herrera Ocheita

martes, 29 de septiembre de 2015

Cinta o ribbon se oculta al adicionar elemento Web personalizado en SharePoint

A veces se desea integrar personalizaciones con funcionalidades de SharePoint.  Este es el caso de adicionar en la página de una biblioteca en SharePoint un elemento Web Personalizado.

El problema radica que cuando adicionamos este elemento Web Personalizado la barra superior o Ribbon de administración de la biblioteca desaparece.

 

Para hacerla aparecer es necesario agregar el siguiente código JavaScript dentro de la declaración html del elemento Web Visual:

<script type=”text/javascript”>

setTimeout(function() { var elem = document.getElementById("MSOZoneCell_WebPartWPQ2"); if(elem != null) { var dummyevent = new Array(); dummyevent["target"] = elem; dummyevent["srcElement"] = elem; WpClick(dummyevent); _ribbonStartInit("Ribbon.Browse", true) } }, 2000);

</script>

image

El resultado será ver la barra de configuración esperada.

image

 

Referencia de la solución aplicada:

http://stackoverflow.com/questions/4848892/list-tools-tab-is-no-longer-available-after-adding-webpart-to-the-page

SharePoint4Fun!,

Juan Manuel Herrera Ocheita

miércoles, 16 de septiembre de 2015

Clases Fuertemente Tipados en una ListView para un WebPart en SharePoint

El control ListView nos permite desplegar colecciones de Clases definidas en codigo (Ej.:List<MiEntidad> ).  

Normalmente utlizamos el metodo Eval(“Atributo de la Clase”) para desplegar la información que enlazamos en el control con el evento miListView.DataBind().

Una mejor forma es utilizando el Atributo ItemType del control ListView.  De la siguiente forma:

<asp:ListView ID="uiListado" runat="server" ItemPlaceholderID="DetalleListado"
          OnPagePropertiesChanged="uiListado_PagePropertiesChanged"
          ItemType="Infoware.Comun.Dominio.Entidad.MiClase">

En el detalle lo definimos de la siguiente forma:

<ItemTemplate>
      <tr class="">
          <td id="Td2" runat="server"><%#: Item.Perfil %></td>
          <td id="Td3" runat="server"><%#: Item.Plazas %></td>
          <td id="Td4" runat="server"><%#: Item.Seccion %></td>
          <td id="Td10" runat="server"><%#: Item.Departamento %></td>
          <td id="Td7" runat="server"><%#: Item.PlazasTotal %></td>
          <td id="Td9" runat="server"> Del: <%#: Item.InscripcionesFechaInicial.HasValue? Item.InscripcionesFechaInicial.Value.ToString("dd/MM/yyyy"):"" %> 
              Al: <%#: Item.InscripscionesFechaFin.HasValue?Item.InscripscionesFechaFin.Value.ToString("dd/MM/yyyy"):"" %></td>
          <td id="Td8" runat="server"><%#: Item.InscripscionesFechaFin.HasValue? Item.InscripscionesFechaFin.Value.ToString("dd/MM/yyyy"):"" %></td>
           <td id="Td1" runat="server"><%#: Item.ExamenLugar %></td>
          <td id="Td5" runat="server"><%#: Item.TipoConvocatoria %></td>
        
          <td class="clasebotones">
              <asp:LinkButton ID="uiVer" runat="server"  ToolTip="Ver"
                  OnClick="evento_ver" CommandArgument='<%#: Item.Id %>' ValidationGroup='<%#: Item.CircularNo %>'
                  OnClientClick="javascript:setFormSubmitToFalse()">Circular PDF</asp:LinkButton>
           
              <asp:LinkButton ID="LinkButton3" runat="server"  ToolTip="Ver"
                  OnClick="evento_Recrear" CommandArgument='<%#: Item.Id %>' ValidationGroup='<%#: Item.CircularNo %>'
                  OnClientClick="javascript:setFormSubmitToFalse()">Recrear Circular PDF</asp:LinkButton>
          </td>
      </tr>
  </ItemTemplate>

Como podemos observar utilizamos la clase Item.NombreAtributoClaseDefiniaEnItemType.

image

Uselo es práctico y evita errores de escritura.

SharePoint4Fun!,

Juan Manuel Herrera Ocheita