Friday, December 8, 2006

Customização da Content Query Web Part

Uma das web parts mais flexíveis fornecidas pelo SharePoint 2007 é a Content Query Web Part. Alguns exemplos de aplicações para esta web part:

  • Mostrar conteúdos de uma lista com uma apresentação diferente da oferecida pela List Web Part
  • Mostrar conteúdos provenientes de um ou mais subsites ou listas, definindo ordenação, filtragem e agrupamentos específicos
  • Ter mais de uma forma de apresentar os mesmos conteúdos

Tudo isto sem ter que fazer uma linha de código e configurando separadamente acesso a dados e apresentação.

No que respeita ao acesso a dados, a configuração é bastante linear bastando indicar o site ou lista de onde se pretende obter o conteúdo e indicar qual o seu content type. O resto é praticamente o mesmo que definir uma vista numa lista comum, configurando filtros, ordenação e agrupamento, bem como número limite de itens.

A configuração da apresentação assenta na selecção de dois estilos:

  • O Group Style, que é utilizado no cabeçalho dos agrupamentos de itens (se for definido um agrupamento)
  • O Item Style, que é utilizado para representar cada item

Como é provável que nenhuma das opções para estes estilos seja exactamente o que procuramos para mostrar a informação na web part, o SharePoint permite que se altere a forma como a web part o faz através da configuração de três ficheiros XSL-T: ContentQueryMain.xsl, Header.xsl e ItemStyle.xsl. Qualquer um destes ficheiros pode ser encontrado acedendo à pasta /Style Library/XSL Style Sheets, usando o SharePoint Designer ou Site Actions > Manage Content and Structure ou ainda, Site Actions > Site Settings > Content and Structure.

O ficheiro ContentQueryMain.xsl contém o XSL principal que executado para formatar a web part, e em grande parte dos casos não precisará de ser alterado.

Group Style


O ficheiro Header.xsl contém um conjunto de templates XSL que correspondem às opções disponíveis na caixa de selecção Group Style. Para criar um novo Group Style basta criar um novo template neste ficheiro. O template seleccionado será chamado no início de cada agrupamento de dados (group by).

Exemplo de um template de Group Style:

<xsl:template
name="MyGroupStyle"

match="*[@GroupStyle='MyGroupStyle']"

mode="header"
>
<div class="MyStyle">
<xsl:call-template name="OuterTemplate.GetGroupName">
<xsl:with-param
name="GroupName"

select="@*[name()=$Group]"
/>
<xsl:with-param
name="GroupType"

select="$GroupType"
/>
</xsl:call-template>
</div>
</xsl:template>

Este template limita-se a representar o nome do grupo (corresponde ao valor do campo pelo qual é feito o agrupamento) usando um estilo MyStyle definido na CSS do site.

Item Style

O ficheiro ItemStyle.xsl contém um conjunto de templates XSL que correspondem às opções disponíveis na caixa de selecção Item Style. Para criar um novo Item Style basta criar um novo template neste ficheiro. O template seleccionado será chamado para cada item de lista apresentado na web part.

Exemplo de um template de Item Style:

<xsl:template
name="MyItemStyle"

match="Row[@Style='MyItemStyle']"

mode="itemstyle"
>

<xsl:variable
name="SafeLinkUrl"
>

<xsl:call-template
name="OuterTemplate.GetSafeLink"
>

<xsl:with-param
name="UrlColumnName"

select="'LinkUrl'"
/>

</xsl:call-template>

</xsl:variable>

<xsl:variable
name="DisplayTitle"
>

<xsl:call-template
name="OuterTemplate.GetTitle"
>

<xsl:with-param
name="Title"

select="@Title"
/>

<xsl:with-param
name="UrlColumnName"

select="'LinkUrl'"
/>

</xsl:call-template>

</xsl:variable>

<xsl:variable
name="LinkTarget"
>

<xsl:if
test="@OpenInNewWindow = 'True'" >_blank</xsl:if
>

</xsl:variable>

<div
id="itemlink"

class="ItemLinkStyle"
>

<a
href="{$SafeLinkUrl}"

target="{$LinkTarget}"

title="{@LinkToolTip}"
>

<xsl:value-of
select="$DisplayTitle"
/>

</a>

</div>

<div
id="itemdescription"

class="DescriptionStyle"
>

<xsl:value-of
disable-output-escaping="yes"

select="@MyCustomField"
/>

</div>

</xsl:template>


Analisando este template podemos retirar as seguintes conclusões:

  • O template chama-se MyItemStyle.
  • A variável SafeLinkUrl é definida para guardar o URL do item em causa. Este URL é obtido chamando o template OuterTemplate.GetSafeLink.
  • A variável DisplayTitle é definida para guardar o título do item em causa. O título é obtido chamando o template OuterTemplate.GetTitle.
  • A variável LinkTarget é definida para guardar o valor do atributo target da tag a no HTML final.
  • Para obter o valor de uma variável local deve usar-se a notação $nome-variável
  • Para obter o valor de um campo do item deve usar-se a notação @nome-campo
  • O atributo disable-output-escaping define se o conteúdo da variável deve ser escrito sem qualquer transformação, ou se os caracteres como "<" devem ser escritos como entidades "&lt;"

Notas

No último exemplo é usado um campo customizado do item a representar na web part. Porque é um campo customizado, a Content Query Web Part não conseguirá obter o seu valor e mostrá-lo. Para isso é necessário alterar a configuração da web part para que esta passe conhecer o tal campo:

  1. No menu da web part, seleccionar Export... e guardar o ficheiro .webpart
  2. Editar o ficheiro .wepart
  3. Alterar o elemento
    <property name="CommonViewFields" type="string">
    para
    <property name="CommonViewFields" type="string">MyCustomField</property>.
  4. Caso existam mais campos customizados, então deve ser adicionados a este elemento, separados por caracteres ponto-e-vírgula.
  5. Importar o ficheiro .webpart (pode ser feito acedendo a Site Actions > Site Settings > Galleries > Web Parts e pressionando o botão Upload)
  6. Usar a nova versão da web part

Atenção: Quando se colocam campos (site columns) neste elemento tem que ser usado o Internal Name dos mesmos. O Internal Name é o nome inicial que foi dado ao campo, mesmo que depois disso tenha sido renomeado. Adicionalmente todos os caracteres especiais (espaços e acentos) são substituídos pelos códigos dos mesmos (por exemplo, os espaços são substituídos por _x0020_), por isso, o mais simples é não usar caracteres especiais nos nomes dos campos.

O que escrevi aqui decorre directamente da minha experiência com esta web part, mas encontrei alguns recursos que podem ser úteis:


Master Pages e Content Place Holders

Uma das razões pelas quais customizar o aspecto do WSS v3 (operação também designada por branding) é muito mais simples do que na versão anterior, é o facto de este utilizar Master Pages. Basicamente, uma master page é um ficheiro .aspx (mas com extensão .master) que serve de base às páginas de um site (estas com extensão .aspx). Funcionam um pouco como os templates do Powerpoint em que podemos definir um Slide Master e depois, em cada novo slide que criarmos, só precisamos de preencher os espaços com conteúdos. Neste caso o que fazemos é criar uma master page, na qual colocamos controlos ASP.Net do tipo ContentPlaceHolder. Em todas as páginas que forem baseadas nessa master page, só precisamos de escrever o conteúdo desses place holders através também de um controlo ASP.Net: o Content.

Quando é pedida uma página destas ao servidor web, este encarregar-se-á de ir buscar a master page e preencher os espaços dos place holders com o código colocado página requisitada dentro dos controlos Content, criando assim a página final que é depois transmitida ao browser cliente. A grande vantagem deste mecanismo é a reutilização de todo o código que se repete em todas as páginas de um site facilitando muito a manutenção do mesmo.

Em SharePoint, um site utiliza duas master pages:

  • A Site Master Page, que é usada nas páginas de publishing e portanto normalmente alvo de mais customização; e
  • A System Master Page, que é usada nas páginas de configuração e listas que muita vezes não estão acessíveis aos utilizadores comuns do portal.

Uma das primeiras tarefas que são executadas no branding de um site em SharePoint é a criação de novas Master Pages que darão o aspecto desejado a todo o portal. No entanto, há que ter em conta que, ao mudarmos a master page de um site, todas as páginas existentes vão passar a usar a nova master page. Ou seja, vão colocar conteúdos nos place holders que esta define e que, se lá não estiverem, causarão um erro de execução no site.

Para poupar trabalho a quem queira saber quais são os place holders que tem que colocar (nem que seja num asp:panel invisível) nas suas master pages, coloco abaixo uma lista.

Na Site Master Page:

  • PlaceHolderPageTitle
  • PlaceHolderAdditionalPageHead
  • PlaceHolderLogin
  • PlaceHolderSearchArea
  • PlaceHolderTitleBreadcrumb
  • PlaceHolderLeftNavBar
  • PlaceHolderPageTitleInTitleArea
  • PlaceHolderMain
  • PlaceHolderPageImage
  • PlaceHolderBodyLeftBorder
  • PlaceHolderNavSpacer
  • PlaceHolderTitleLeftBorder
  • PlaceHolderTitleAreaSeparator
  • OSSConsole
  • PlaceHolderMiniConsole
  • PlaceHolderCalendarNavigator
  • PlaceHolderLeftActions
  • PlaceHolderPageDescription
  • PlaceHolderBodyAreaClass
  • PlaceHolderTitleAreaClass

Na System Master Page:

  • PlaceHolderPageTitle
  • PlaceHolderAdditionalPageHead
  • PlaceHolderSiteName
  • PlaceHolderSearchArea
  • PlaceHolderTopNavBar
  • WSSDesignConsole
  • SPNavigation
  • PlaceHolderTitleLeftBorder
  • PlaceHolderTitleBreadcrumb
  • PlaceHolderPageTitleInTitleArea
  • PlaceHolderMiniConsole
  • PlaceHolderTitleRightMargin
  • PlaceHolderTitleAreaSeparator
  • PlaceHolderLeftNavBarDataSource
  • PlaceHolderCalendarNavigator
  • PlaceHolderLeftNavBarTop
  • PlaceHolderLeftNavBar
  • PlaceHolderLeftActions
  • PlaceHolderNavSpacer
  • PlaceHolderLeftNavBarBorder
  • PlaceHolderBodyLeftBorder
  • PlaceHolderPageDescription
  • PlaceHolderMain
  • PlaceHolderBodyRightMargin
  • PlaceHolderFormDigest
  • PlaceHolderUtilityContent
  • PlaceHolderBodyAreaClass
  • PlaceHolderTitleAreaClass

Saturday, December 2, 2006

Tip #2: Alterar Templates e Layouts usados em Subsites

O Administrador de um site tem a possibilidade de limitar quais os templates que podem ser utilizados para criar subsites e quais os layouts de páginas que podem ser utilizados para criar novas páginas. Essa configuração é feita acedendo a:

  1. Menu Site Actions
  2. Opção Site Settings
  3. Secção Look and Feel
  4. Opção Page layouts and site templates

Neste ecrã podemos indicar se os subsites podem usar todos os templates disponíveis ou apenas um conjunto limitado destes, e se as páginas criadas neste site podem usar todos os layouts disponíveis ou apenas um conjunto limitado destes.

Tip #1: Alterar o Nome a uma Site Column

Em Windows SharePoint Services v3.0, as site columns têm dois nomes:

  • o Internal Name que é o nome que lhe foi atribuído aquando da sua criação e que ficará sempre associado à site column; e
  • o nome actual da site column que inicialmente é o mesmo que o Internal Name mas pode ser alterado posteriomente.

Este facto pode causar alguns problemas se, quando estivermos escrever código que interaja com o object model ou a configurar alguma funcionalidade do SharePoint, for necessário identificar uma coluna pelo nome. Nesta situação, o SharePoint estará sempre à espera do Internal Name e não do nome actual.