SharePoint 4 Developers

Guia de referência adicional em desenvolvimento .NET / SharePoint

Customização de Form Templates

Trabalhe com a customização de Form Templates no SharePoint 2010. O autor mostra 3 abordagens para a realização da tarefa.

Oi pessoal, tudo bem?

Tenho encontrado coisas interessantes no SharePoint Server 2010 após o projeto de migração do MOSS 2007 que trabalhei recentemente. Segue uma delas, você consegue identificar a diferença entre as Figuras 1 e 2 abaixo?

DocContentType
Figura 1 – Document Content Type

RepContentType
Figura 2 – Report Content Type

Parece óbvio não? Os botões de Salvar e Cancelar ficam evidentes, mas a principal diferença que afeta os usuários está na seleção do tipo de content type.

No exemplo das Figuras 1 e 2 foram utilizados os content types Document e Report respectivamente. Cada um deles faz referência a um tipo de Form Template.

OBS: Para efeito de comparação excluí as demais colunas que compõe o content type Report da Figura 2.

O que fazer se você precisar disponibilizar o campo Content Type Choice (Figura 1)? Vou mostrar algumas abordagens para mudar esse cenário.

Abordagem 1 - SharePoint Manager 2010

Essa ferramenta é sensacional, pois facilita muito o trabalho. Ajudando na rápida alteração dos objetos do SharePoint. Se você é SharePointer, precisa conhecer!

Utilizando a ferramenta fica muito simples de alterar o Form Template, conforme a Figura 3:

SharePointManager
Figura 3 – Alteração do Form Template

O Form Template chamado RptLibraryForm é responsável por não apresentar o campo para seleção de content types (Figura 2). Conforme Figura 3, a solução seria a alteração dos atributos DisplayFormTemplateName, EditFormTemplateName e NewFormTemplateName para um outro form, ex: DocumentLibraryForm (Esse form é o mesmo exibido na Figura 1).

Os form templates são encontrados nos content types, e eles podem ser alterados em 2 locais: no root do site collection ou em document libraries. Esse tipo de alteração seria recomendada apenas para alteração direta em document libraries, pois não recomendo mudar um objeto base do root do site collection. Qualquer erro nesse nível afetará os seu site e sub-sites!

Nesse ponto é que entra uma solução mais sustentável, com o desenvolvimento de form templates.

Abordagem 2 – Script

O script pode ser criado com um Console Application no Visual Studio ou via PowerShell.

Independente da maneira que isso será executado, o resultado será o mesmo da utilização do SharePoint Manager 2010, porém será realizado através de script.

Segue código abaixo para atualização via Console Application:

Code Snippet
  1. static void Main(string[] args)
  2. {
  3.     using (SPSite site = new SPSite("http://portal.sharepoint4developers.net"))
  4.     {
  5.         using (SPWeb web = site.RootWeb)
  6.         {
  7.             // Get the library
  8.             SPDocumentLibrary library = web.Lists["Sample"] as SPDocumentLibrary;
  9.  
  10.             // Change the form template
  11.             library.ContentTypes["Report"].DisplayFormTemplateName = "CustomLibraryForm";
  12.             library.ContentTypes["Report"].EditFormTemplateName = "CustomLibraryForm";
  13.             library.ContentTypes["Report"].NewFormTemplateName = "CustomLibraryForm";
  14.  
  15.             // Update the content type
  16.             library.ContentTypes["Report"].Update();
  17.         }
  18.     }
  19. }

OBS: O código acima é aplicado na alteração de um content type vinculado a um Document Library.

Esse é o Powershell script equivalente ao Console Application:

Powershell
Figura 4 – Powershell script

Faça o download do script aqui.

Abordagem 3 - Desenvolvimento de Form Templates

Uma solução segura é o desenvolvimento de features no SharePoint, pois os pacotes podem ser facilmente adicionados e ativados. Da mesma forma quando não utilizados, desativados e removidos.

Recomendo sempre abordagens sustentáveis, pois vão funcionar sem problemas e não te trarão dores de cabeça no futuro.

Crie uma nova solução no Visual Studio 2010 e nomeie de CustomLibraryFormSolution, conforme a Figura 5:

EmptySolution1
Figura 5 – Nova Solução

Defina a solução como uma Farm Solution, valide-a e aguarde sua criação pelo Wizard, conforme Figura 6:

EmptySolution2
Figura 6 – Wizard

Após a criação do projeto é necessária a configuração de um User Control e Feature para deploy.

Criação do User Control Custom Library Form

Esse User Control representará o novo form template que criaremos. Para começar faça o mapeamento do diretório 14\TEMPLATE\CONTROLTEMPLATES no seu projeto, conforme Figura 7:

MappedFolder1MappedFolder2
Figura 7 – Mapeamento de diretório do SharePoint

OBS: Esse mapeamento é importante para deploy do User Control no local correto.

Adicione um novo User Control nesse diretório e nomeie de CustomLibraryForm, conforme Figura 8:

UserControl
Figura 8 – User Control para criação do Form Template

OBS: Se você abrir o diretório 14\TEMPLATE\CONTROLTEMPLATES verá que contém diversos User Controls. Os principais form templates utilizados estão concentrados no arquivo DefaultTemplates.ascx.

Apague os arquivos .cs e deixe apenas o ascx disponível. Abra o User Control, delete todo o conteúdo e adicione o código abaixo:

Code Snippet
  1.    <%@ Control Language="C#"AutoEventWireup="false" %>
  2. <%@Assembly Name="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
  3. <%@Register TagPrefix="SharePoint" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" namespace="Microsoft.SharePoint.WebControls"%>
  4. <%@Register TagPrefix="ApplicationPages" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" namespace="Microsoft.SharePoint.ApplicationPages.WebControls"%>
  5. <%@Register TagPrefix="SPHttpUtility" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" namespace="Microsoft.SharePoint.Utilities"%>
  6. <%@ Register TagPrefix="wssuc" TagName="ToolBar" src="~/_controltemplates/ToolBar.ascx" %>
  7. <%@ Register TagPrefix="wssuc" TagName="ToolBarButton" src="~/_controltemplates/ToolBarButton.ascx" %>
  8.  
  9. <SharePoint:RenderingTemplate id="CustomLibraryFormCore" runat="server">
  10.     <Template>
  11.             <table class="ms-formtable" style="margin-top: 8px;" border="0" cellpadding="0" id="formTbl" cellspacing="0" width="100%">
  12.             <SharePoint:ChangeContentType runat="server"/>
  13.             <SharePoint:DocumentLibraryFields runat="server"/>
  14.             <SharePoint:ApprovalStatus runat="server"/>
  15.             </table>
  16.             <SharePoint:WebPartPageMaintenanceMessage runat="server"/>
  17.             <SharePoint:DocumentTransformersInfo runat="server"/>
  18.             <table cellpadding="0" cellspacing="0" width="100%"><tr><td class="ms-formline"><img src="/_layouts/images/blank.gif" width='1' height='1' alt="" /></td></tr></table>
  19.             <table cellpadding="0" cellspacing="0" width="100%" style="padding-top: 7px"><tr><td width="100%">
  20.             <SharePoint:ItemHiddenVersion runat="server"/>
  21.             <SharePoint:InitContentType runat="server"/>
  22.             <wssuc:ToolBar CssClass="ms-formtoolbar" id="toolBarTbl" RightButtonSeparator="&amp;#160;" runat="server">
  23.                 <Template_Buttons>
  24.                     <SharePoint:CreatedModifiedInfo runat="server"/>
  25.                 </Template_Buttons>
  26.                 <Template_RightButtons>
  27.                     <SharePoint:SaveButton runat="server"/>
  28.                     <SharePoint:GoBackButton runat="server"/>
  29.                 </Template_RightButtons>
  30.             </wssuc:ToolBar>
  31.             </td></tr></table>
  32.     </Template>
  33. </SharePoint:RenderingTemplate>
  34.  
  35. <SharePoint:RenderingTemplate id="CustomLibraryForm" runat="server">
  36.     <Template>
  37.             <SharePoint:InformationBar runat="server"/>
  38.             <wssuc:ToolBar CssClass="ms-formtoolbar" id="toolBarTbltop" RightButtonSeparator="&amp;#160;" runat="server">
  39.                 <Template_RightButtons>
  40.                     <SharePoint:SaveButton runat="server"/>
  41.                     <SharePoint:GoBackButton runat="server"/>
  42.                 </Template_RightButtons>
  43.             </wssuc:ToolBar>
  44.             <SharePoint:FormToolBar runat="server"/>
  45.             <SharePoint:FormComponent TemplateName="CustomLibraryFormCore" runat="server"/>
  46.     </Template>
  47. </SharePoint:RenderingTemplate>

OBS: O código acima foi extraído do User Control RptLibTemplate.ascx. A linha 12 foi a única linha adicionada que permite a seleção do Content Type.

Criação da Feature Custom Report

Essa feature será responsável pelo deploy de um Content Type que se utiliza do novo Form Template criado. Adicione um novo item do tipo Content Type e o nomeie de CustomReport, conforme Figura 9:

Feature2
Figura 9 – Novo Item do tipo Content Type

O Wizard será exibido conforme Figura 10, então selecione o content type base do qual o novo content type herdará as configurações.

wizard1
Figura 10 – Wizard

O XML do Content Type será exibido automaticamente após sua criação, modifique-o conforme o código abaixo:

Code Snippet
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  3.   <!-- Parent ContentType: Report (0x01010058DDEB47312E4967BFC1576B96E8C3D4) -->
  4.   <ContentType ID="0x01010058DDEB47312E4967BFC1576B96E8C3D4006440fbf80e1849a8bc00166a8703769d"
  5.                Name="Custom Report"
  6.                Group="Business Intelligence"
  7.                Description="References a Custom Form Template"
  8.                Inherits="FALSE"
  9.                Version="0">
  10.     <FieldRefs/>
  11.     <XmlDocuments>
  12.       <XmlDocument NamespaceURI="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms">
  13.         <FormTemplates xmlns="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms">
  14.           <Display>CustomLibraryForm</Display>
  15.           <Edit>CustomLibraryForm</Edit>
  16.           <New>CustomLibraryForm</New>
  17.         </FormTemplates>
  18.       </XmlDocument>
  19.     </XmlDocuments>
  20.   </ContentType>
  21. </Elements>

OBS: Assegure-se de que a linha 8 seja alterada para Inherits=”FALSE”, pois isso impede que o Form Template informado na seção XmlDocuments seja sobrescrito pela herança. O interessante é que mesmo definindo esse atributo como falso, as colunas serão herdadas automaticamente. :)

Uma feature precisa ser criada para deploy do content type. Adicione uma Feature no projeto e defina seus atributos conforme a Figura 11:

Feature2
Figura 11 – Detalhes da Feature Custom Report

Antes de qualquer coisa, check a propriedade Reset Web Server do package para garantir que o User Control seja identificado imediatamente após o deploy, conforme Figura 12:

Package
Figura 12 – Detalhes do package

OBS: Baixe a solução pronta aqui.

Form Template Customizado

Ao final da criação do form, o resultado esperado pode ser visto logo abaixo na Figura 13, que mostra a utilização do CustomLibraryForm:

CustomRepContentType
Figura 13 – Custom Form Template

OBS: Como podemos ver, trata-se do próprio form RptLibraryForm com a adição do campo Content Type Choice.

As três abordagens utilizadas funcionam muito bem. Conforme já disse, utilize sempre boas práticas e crie soluções sustentáveis.

Ao contrário da utilização de features, com scripts a solução é rápida, porém nesse caso temporária. Digo isso pois no futuro alguma coisa pode “quebrar” em função do script executado (com ou sem documentação).

Espero que esse post venha a te ajudar.

Referências:
http://msdn.microsoft.com/en-us/library/aa544142.aspx
http://msdn.microsoft.com/en-us/library/ms468437.aspx
http://msdn.microsoft.com/en-us/library/aa544154.aspx

[]’s

Marcel Medina

Clique aqui para ler o mesmo conteúdo em Inglês.

Business Connectivity Services – Parte IV

Entenda a estrutura hier&#225;rquica do modelo de metadados do BDC (Business Data Connectivity Model) e as novas ferramentas do Visual Studio 2010 para design de modelos do BDC (Parte IV)

Oi pessoal, tudo bem?

Essa é a quarta parte do artigo sobre as novidades de integração de dados externos com o Business Connectivity Services (BCS) no SharePoint 2010!

Apenas para recapitular, na parte I do artigo tivemos uma introdução ao funcionamento do BCS pela análise de sua arquitetura e componentes, na parte II tivemos a oportunidade de criar External Content Types (ECT) via Database e na parte III trabalhamos na criação de ECTs via Web Service.

A leitura da parte I é extremamente importante para o entendimento desta parte. Nesse artigo vou explicar a estrutura hierárquica do modelo de metadados do BDC (Business Data Connectivity Model) e dar uma introdução às novas ferramentas do Visual Studio 2010 na criação de objetos do BDC.

Boa leitura!

Entendendo o Modelo de Metadados do BDC

No exemplo desse artigo trabalharemos com um novo template do Visual Studio 2010 chamado Business Data Connectivity (BDC) Model, que permite a criação de Entidades (BDC Entities) também conhecidas como External Content Types, que já vimos na parte I.

As entidades são objetos que compõem o modelo de metadados do BDC, que representam o núcleo de funcionamento do BDC. Nessa abordagem quero ir um pouco mais a fundo nesse modelo, vejamos a Figura 1:

BDCModelFigura 1 - Modelo de Metadados do BDC

Agora fica claro onde os ECTs estão dentro do Modelo de Metadados do BDC, mas ainda não conhecemos em detalhes o papel de cada um desses objetos que compõem a Figura 1, apenas podemos notar que os objetos estão em uma estrutura hierárquica.

Para entendimento desses objetos veremos o detalhamento de cada um:

OBS: Esse conteúdo pode ser encontrado na seção referências, porém resolvi detalhar mais do que o conteúdo encontrado no MSDN. :)

  • Model - Esse é objeto principal, núcleo do funcionamento do BDC que mapeia os dados externos. Trata-se do agrupador de todos os objetos que compõem a hierarquia desse modelo.

  • LobSystem - Dentro do modelo figura como sendo a representação de um serviço externo que contém a lógica de negócio, simplesmente pelo fato de definir o tipo da fonte de dados externos que será utilizada, podendo ser:
  1. Database – Define o mapeamento de um banco de dados;
  2. DotNetAssembly – Define o mapeamento de um assembly .NET;
  3. Wcf – Define o mapeamento de um endpoint do serviço WCF;
  4. WebService – Define o mapeamento de um Web Service. Considerado “deprecated”, portanto utilize um serviço WCF;
  5. Custom – Define o mapeamento de um Conector customizado, implementado para gerenciar a conexão e a transferência de dados.
  • LobSystemInstance - Trata-se da implementação de um LobSystem. Contém todos os detalhes de conexão a um serviço externo para a criação da instância de um LobSystem.

  • Entity - Trata-se da representação dentro do modelo de metadados do BDC de um ECT do BCS, que conforme já visto na Parte I determina o schema de dados da entidade, utiliza-se de recursos de acesso a dados e disponibiliza um comportamento dentro do Office e SharePoint através de métodos.

  • Identifier - Um identificador funciona como uma chave primária nas entidades.

  • Method - Os métodos são os comportamentos de uma entidade. Dentro do modelo funciona como um agrupador das configurações (FilterDescriptor, Parameter, MethodInstance) do método que representa.

  • FilterDescriptor - Basicamente um filterdescriptor pode ser criado dentro de um método para selecionar tanto a entrada quanto o retorno de valores do mesmo. Diversos tipos de filtros podem ser utilizados (veja a seção referências).

  • Parameter - Define o tipo de parâmetro que será utilizado dentro do método, sendo:
  1. In – Utilizado para parâmetros de entrada;
  2. Out – Utilizado para parâmetros de saída, similar ao parâmetro "out" em C#.
  3. InOut – Representa um parâmetro que tem as duas funções (entrada / saída), similar ao parâmetro "ref" em C#.
  4. Return – Define o tipo para retorno de um método, no BDC isso é considerado como um parâmetro de retorno.
  • TypeDescriptor - Um typedescriptor é nada mais nada menos do que uma definição do tipo do parâmetro. Ex: Int32, String. É recursivo, pois permite que outro typedescriptor seja referenciado como sendo o tipo de um parâmetro.

  • MethodInstance - Trata-se da implementação de um Method. As operações Create, Update, ReadItem, ReadList e Delete já são pré-definidas para utilização.

  • Action - As ações possibilitam a adição de funcionalidades extras aos ECTs, pois funcionam como um link adicional aos dados externos. Por padrão as ações View Item, Edit Item, e Delete Item são adicionadas na interface do usuário (veja a seção referências) e qualquer nova ação adicionada, como por exemplo um link para abrir uma página, acompanha o ECT em qualquer parte do SharePoint.

  • ActionParameter - Define a URL da ação que se refere para o funcionamento do link criado. Utiliza-se de identificadores ou typedescriptors da entidade para a criação da URL.

  • AssociationGroup - Associações representam os relacionamentos entre as entidades, similar a um relacionamento de tabelas. Um AssociationGroup deve ser utilizado para amarrar métodos de associação que são aplicados em um relacionamento de entidades. Ex: Considerando duas entidades Cliente e Pedido, um AssociationGroup armazenaria métodos como ObterPedidosPorCliente e ObterClientePorPedido.

OBS: Na próxima parte dessa lição trabalharemos com a maioria desses objetos, e esse overview vai ser consolidado ao colocarmos a mão na massa, principalmente quando trabalharmos com o XML que está por trás dessas definições.

Ferramenta de Design para o Modelo de Metadados do BDC

O Visual Studio 2010 foi turbinado com várias novas ferramentas para design e o BDC não ficou de fora. Agora ficou mais fácil a criação de modelos no BDC, pois o mais trabalhoso (a criação da maioria dos objetos) pode ser feito visualmente e outros pequenos detalhes podem ser feitos manualmente no XML gerado.

A Figura 2 mostra os novos painéis que estão disponíveis no VS2010 para design de modelos no BDC:

NewDesignerFigura 2 - Painéis para design de modelos do BDC

Com exceção do painel de Propriedades, três (3) novos painéis foram incorporados ao VS2010. São eles:

  • BDC Designer - Possibilita a criação e edição de Entidades, Identificadores, Métodos e Associações entre as Entidades. Trata-se de uma área para design que permite a criação dos objetos via drag-and-drop da palheta Toolbox ou mesmo utilizando o menu de contexto (pelo botão direito do mouse).

  • BDC Method Details - Assim como o próprio nome diz, exibe os detalhes de configuração dos métodos. Permite a criação e edição de métodos, parâmetros, typedescriptors e filtros (conforme o modelo de metadados do BDC).

  • BDC Explorer - Organiza e exibe os objetos do modelo de metadados do BDC em uma tree view. Sua principal finalidade é o de apresentar os objetos numa estrutura hierárquica, porém também permite a criação de typedescriptors e validação dos objetos.

Durante o desenvolvimento na próxima parte veremos como manipular os objetos do Modelo de Metadados do BDC por esses painéis. Aguardem!

Referências:
http://msdn.microsoft.com/en-US/library/ee556378.aspx
http://msdn.microsoft.com/en-us/library/ee557835.aspx
http://msdn.microsoft.com/en-us/library/ee559393.aspx

[]’s

Marcel Medina

Clique aqui para ler o mesmo conteúdo em Inglês.

The required feature is not enabled for this column type

Segue mais uma dica de como contornar problemas que aparecem durante a utiliza&#231;&#227;o do SharePoint 2010. A mensagem: The required feature is not enabled for this column type, aparece na tentativa de cria&#231;&#227;o de um Metadata Column.

Oi pessoal,

Segue mais uma dica de como contornar problemas que aparecem durante a utilização do SharePoint 2010. Esse caso acontece na tentativa de criação de um Metadata Column.

Problema

Em alguns casos você pode se deparar com a seguinte mensagem ao tentar criar Metadata Columns:

“The required feature is not enabled for this column type”

Conforme podemos ver na Figura 1:

mensagem

Figura 1 - Mensagem

O que está acontecendo é que o SharePoint 2010 está alertando para que a coluna seja disponibilizada, a ativação de uma feature é necessária. Mas qual feature?

Solução

A feature que necessita ser ativada é uma Site Collection Hidden Feature, ou seja, uma Site Collection Feature que não está disponível para ativação via UI. Precisa ser ativada via comando. A Figura 2 mostra a feature que precisa ser ativada:

SiteHiddenFeature

Figura 2 – Hidden Feature

Essa feature pode ser ativada via comando no PowerShell através da seguinte execução (repare que o Id é mesmo da Figura 2):

Enable-SPFeature -id "73ef14b1-13a9-416b-a9b5-ececa2b0604c" -Url <Site-Url>

Resultado

Após a ativação da feature, qualquer Metadata Column poderá ser criado sem problemas, conforme Figura 3:

resultado

Figura 3 – Criação do Metadata Column

Se a mensagem informasse qual fosse a feature para ativação, com certeza esse post não seria necessário, porém esse não é o caso…rs. Essa é mais uma das pegadinhas que nos fazem perder tempo em investigação.

Espero que esse post ajude.

[]’s

Marcel Medina

Clique aqui para ler o mesmo conteúdo em Inglês.