domingo, Novembro 22, 2009

Configurar WebPart para Meteorologia

Autor:André Lage
Publicação:
__________
Download:Documento
(EN)Translate:Link

Configurar WebPart para Meteorologia
O  Sharepoint é daquelas ferramentas que devemos parar e explorar antes de realizar desenvolvimento, uma das grande capacidade do Sharepoint é a sua integração com outras tecnologias Web o que torna bastante flexivel e toda a personalização das paginas simples e directas.
Para este tipo de desenvolvimento, o sharepoint tem uma Webpart chamada "DataViewWebpart" que realiza chamada a dado através de diferentes camadas de dados, desde Listas de Sharepoint, WebServices, Banco de Dados e XML.
Para desenho da Webpart utilizei a estrutra XSL "EXtensible Stylesheet Language" que é uma camada de Desenho que serve para modelos em diferentes Webpart, desde que tenha os mesmo tipo de dados a receber.
Neste artigo mostra como podemos utilizar os acessos a Dados XML em WebPart com Desenho XSL, tendo como finalidade criar uma WebPart de Meterologia.

Configurar XSL para conteudo

Antes de começar a criar a WebPart temos que desenhar a estrutura como a nossa Webpart vai ficar, para isso podemos utilizar o Sharepoint Designer 2007 e utilizar a (DVWP) DataViewWebPart, para chamar a nossa Datasource precisamos chamar o WebService de Meterologia da Google.
Exemplo: 
WebService da Google para Meterologia.*
Autor

* Google disponibiliza um webservice para aceder ao estado tempo através de um conjunto de parâmetros.
Parâmetros:
Weather: Cidade onde estamos a pesquisar a Meterologia
hl: Lingua em que o conteudo vem traduzido, pt-PT(Portugal), pt-BR (Brasil)


Ao chamar o WebService, pretendo que fique em ficheiro XML para poder trabalhar e realizar alterações.
Depois de criar o ficheiro de XML, podemos utiliza a opção "Datasource Library" para fazer uma pré-visualização dos nossos dados e selecionar e importar.

Depois  seleccionamos os campos a importar adicionamos a Datasource e os campos a importar de uma maneira simples simple :).

 Depois de importar os campos que queres utilizar dos WebServices podemos utilizar o HTML para desenhar o resultado final da Webpart.


Depois de criado a alterado dados do output da nossa WebPart, devemos copiar o seu conteudo desde 
"<xls:stylesheet" até "</xls:stylesheet">, este conteudo irá ser utilizado para configuração da XML WebPart.

Configurar XML WebPart

Já na página de Sharepoint, adicionamos a nossa "XML WebPart" e podemos começar a configurar.


No modo de Edição da WebPart, podemos definir de onde provem os nossos dados de XML, neste caso eu defini o nosso WebService da Google para meterologia.
No campos:
XML Link: Devemos adicionar o Link onde se encontra o nosso conteudo de XML neste caso o WebService da Google.
XSL Editor: Da cópia do conteudo do XSL realizada no Sharepoint Designer 2007 devemos passar para este editor de conteúdo, onde irá ficar a estrutura da WebPart de Meteorologia. 


Feito, agora é so fazer "OK" e a nossa WebPart está pronta para ficar disponível na página de Sharepoint.


Aqui temos mais um exemplo de como podemos utilizar o que vem por defeito do Sharepoint sem realizar nenhum desenvolvimento, apenas alteração de XSL e serviços disponibilizados pela internet, de uma maneira, simples simples.
Anexo  "Tempo _São Paulo_ - By André Lage.dwp"
Anexo "Microsoft Stock" - MSFT_Stock.dwp
Anexo "Graficos Bolsas" "Google, Microsoft, Oracle, Sybase"
Exemplo:

 

Se pretenderem mudar as imagens que o serviço da API da google disponibiliza para algo mais personalizado podes alterar o caminho.


images/weather/chance_of_rain.gif
images/weather/sunny.gif
images/weather/mostly_sunny.gif
images/weather/partly_cloudy.gif
images/weather/mostly_cloudy.gif
images/weather/chance_of_storm.gif
images/weather/rain.gif
images/weather/chance_of_rain.gif
images/weather/chance_of_snow.gif
images/weather/cloudy.gif
images/weather/mist.gif
images/weather/storm.gif
images/weather/thunderstorm.gif
images/weather/chance_of_tstorm.gif
images/weather/sleet.gif
images/weather/snow.gif
images/weather/icy.gif
images/weather/dust.gif
images/weather/fog.gif
images/weather/smoke.gif
images/weather/haze.gif
images/weather/flurries.gif



Um grande abraço a todos e espero que tenham gostado de mais este Artigo.


quarta-feira, Novembro 18, 2009

Sharepoint 2010 Beta is Official and Out

Yep,

Sharepoint 2010 Beta is Official and Out and ready to Download.
http://sharepoint2010.microsoft.com/try-it/Pages/Trial.aspx

terça-feira, Novembro 17, 2009

Menu Lista de colaboradores

Autor:André Lage
Publicação:__________ 
Download: Documento
(EN)TranslateLink


Menu Lista de colaboradores


Este Artigo é dedicado a todos os colunistas do CanalSharepoint, como mostra da capacidades do Sharepoint e readaptar os Layouts para divulgar a comunidade. 
Espero que gostem. ;) 

OverView


Esta WebPart encontra-se em desenvolvimento para integração com Lista de Sharepoint, enquanto se encontra em desenvolvimento deixo um amostra do resultado final, utilizando um (CEWP) Content Editor Web Part, 

Selecionar a opção "Add a Web Part>Choose template Gallery>Import" depois realiza-mos upload do nosso anexo.

 




Com a webPart adicionada realizamos o Drag and Drop para a Webpart Zone onde irá estar a nosso menu Personalizado do CanalSharePoint :). 



 
Feito, a parti de aqui podemos seleccionar a opção "Canal Sharepoint Colunistas", onde irá Listar os Colunistas com uma pequena descrição e imagem associada, caso o Colunista tenha um Link, este encontra-se associado.

Este Layout de Menu  foi criado por Christophe http://pathtosharepoint.wordpress.com/ é bastante prático e podem adicionar como exemplo, de como se utiliza os Layouts de Menu de Sharepoint de uma maneira personalizada.  

Anexo "ColaboradoresCanalsharepoint.dwp"
Mais um artigo e um grande abraço para quem ler este artigo.



segunda-feira, Novembro 16, 2009

SharePoint 2010 Beta Release on MSDN and Technet

Yes news run faster than fire, Technet and MSDN have release the for some Level the Versions of Sharepoint 2010, go and see if you have access and can download, i already download...



PS:
Only for
Available to Levels: TechNet Plus SA Media; TechNet Plus (Retail); TechNet Direct (Retail); TechNet Plus (VL); TechNet Plus Direct (VL); TechNet Cert Partner; TechNet Gold Cert Partner; TechNet Plus Consumer Service Professional Pilot;

quinta-feira, Novembro 12, 2009

Ghosted e UnGhosted em Sharepoint

Autor:André Lage
Publicação:__________
Download:Documento
(EN)TranslateLink


Ghosted e UnGhosted em Sharepoint


Esta é uma daquelas questões que um antigo colega de trabalho me abordou sobre a diferença entre estes 2 conceitos "Ghosted e UnGhosted".

OverView


Com o Sharepoint as pagina de .aspx podem ser renderizadas de 2 formas possíveis, quando um pedido e recebido para uma páginas de aspx, o filtro de Sharepoint isapi determina quem ira tratar a renderização da paginas, ou o ASP.Net ou o "Parser SafeMode do Sharepoint", este metodo apenas existe com o Sharepoint Services.

 





Por defeito as páginas que se encontram na pasta 12"Hive" são compiladas via ASP.NET, 



Todas as páginas de site de Conteudo Sharepoint estão alojadas em Base de dados. Ou seja para cada documento, vamos encontrar um linha na tabela de documentos existente no documento. O ficheiro actual é guardada numa linha da Tabela de Base de dados. Isto é verdade para todos os ficheiros. Mas existe uma excepção, algumas páginas não são guardadas em Base de dados, em vez disso são guardadas em File System, mais concretamente na pasta 12"Hive" da Instalação do SharePoint, ai estão as nossas paginas Ghosted


Se a Coluna SetupPath da BD de Conteúdos de Sharepoint sobre a página de ASPX estiver como null entao é um ficheiro Ghosted  e vai ser compilada em File System 12"Hive" com parse de ASP.NET, se o Campo da BD "SetupPath" estiver preenchida entao a página esta Unghosted e vai utilizar o SafeMode parse do Sharepoint Services, com as regras definidas.
Podemos visualizar a diferença das paginas de Sharepoint e File System atraves dos url com extençao "/_Layouts/*" e "/_vti_bin/*" para WebServices. 

Quando adicionamos um pedaço de código ASP.NET, em uma página de .ASPX que esteja Unghosted, ou seja dentro do Site de Sharepoint o Filtro ISAPI activa o " Parser SafeMode do Sharepoint" para Sharepoint Services retornando a mensagem de erro.

Exemplo:
Adicionar a Tag de Código ASP.NET numa página no Site de Sharepoint Unghosted:
"<%= ctrl.ClientID %>" 
OutPut: Error: Parser Error Message : Code blocks are not allowed in this file

Por resolver este problema, temos que adicionar na Web.Config a Tag "PageParserPaths" com o caminho da Pagina para considerar a pagina segura para compilar código.
<PageParserPaths>
        <PageParserPath VirtualPath="/*" CompilationMode="Always" AllowServerSideScript="true" IncludeSubFolders="true" />
</PageParserPaths> 

Qual é a diferença em utilizar o SafeMode parse e o ASP.NET?


Compilação do Código.

ASP.NET vai realizar o parse da página na primeira renderização e compilar em uma Assembly.

O Metodo "SafeMode Parse" NÃO ira compilar as Páginas está desenhada para criar uma estrutura de Objectos da página. Se encontrar um linha de código "Server Side" na página "ASPX ou ASCX" o metodo SafeMode parser nao deixa a página renderizar. Adicionalmente, os objectos marcados como "runat=server" que podem ser instanciado são os objectos que podem utilizar na Lista de SafeControls que podemos utilizar no desenvolvimento das nossas páginas. 



Porque existe 2 tipos de metodos de renderização?

Segurança e Estabilidade.



O Metodo SafeMode parse  para paginas unghosted serve para proteger de codigo malicioso e injecção de código em paginas com a função de sobrecarregar o servidor e desligar os serviços associados ao Site de Sharepoint.
Se não tivéssemos o Safe Mode Parser todas as páginas teriam de ser compiladas em ASP.NET ou seja teriam que ficar alojadas em Memoria, agora imaginem milhares de páginas, a quantidade de memoria necessária seria enorme.Com a utilização do Virtual Server para WSS, está desenhado para realizar a gestão de um pequena quantidade de paginas compiladas em vez de compilar todas as páginas existentes no Sharepoint o que faz um boa gestão da Memoria, optimo :).



Quais as razões para passar uma página Ghosted para UnGhosted?

As paginas Ghosted passam para Unghosted quando são alteradas no Sharepoint, normalmente são alteradas através de software de apoio ao Desenvolvimento como o SharePoint Designer 2007, ou quando estamos a realizar a carregamento de uma página numa Document Library, o seu conteúdo ira ser registado na BD do Sharepoint, passando automaticamente para UnGhosted.



O que fazer quando as paginas estão Unghosted?


Gary Lapoint desenvolveu um conjunto de linhas de comando para repor as paginas de Sharepoint que foram editadas pelo Sharepoint Designer 2007 ou carregadas no sharepoint.






Disponibiliza um conjunto de Linha de comando para Listagem das paginas que estão Unghosted.

Exemplo:
stsadm –o gl-enumunghostedfiles -url "http://intranet/" -recursesubwebs


Para alterar o estado Unghosted para páginas Ghosted será necessário correr a Linha de comandos.

Exemplo:

stsadm –o gl-reghostfile -url "http://intranet/sitedirectory/lists/sites/summary.aspx" –scope file -force



Para esta linha de comando existe podemos usar as propriedades para diferente tipo de Scopes:

-Scope "Webapplication | Site | Web | List | Page"



Este Artigo e um pouco extenso mas importante para quando realizamos actualizações das páginas e acima de tudo diferenciar o que é ASP.NET e o que é Código de SharePoint.

Mais um artigo e um grande abraço para quem ler este artigo.



quarta-feira, Novembro 11, 2009

Os filhos perdidos da WebPart

Autor:André Lage
Publicação:__________
Download: Documento
(EN)TranslateLink

Os filhos perdidos da webpart


    Parece um estranho titulo para um artigo, parece mais um titulo de filme de baixo orçamento, mas toda a gente fala da WebPart e de como criar uma WebPart, até aqui tudo bem, mas queremos ir um pouco mais alem, ou seja começar a personalizar e utilizar as verdadeiras capacidade das Webpart, quem já teve que realizar uma WebPart robusta e fiavel, o simples "Hello World" não dá resposta :P.

Este artigo tem como função ajudar e a entrar mais a fundo no desenvolvimento das WebParts, pegar nas partes mais aborrecidas e difícil de perceber, chamar aquela parte que os 500 mil artigos de como criar um WebPart em Sharepoint não explica....

Eh eh.... :)

Definir novas Propriedades na Edição da Webpart



    No desenvolvimento das Webpart umas das primeira tarefas a realizar é a definição de propiedade para guardar um conjunto de informação que irá servir de apoio ao desenvolvimento da WebPart.
Esta informação vai estar sempre associada a Webpart sem que tenhamos perda de informação ao reiniciar o servidor ou reiniciar os serviços de IIS.  

As propriedades podem ser definidos em vários tipos de variáveis.
  • String
  • Boolean
  • Enum

Para começar a definir as propiedades e necessário chamar um conjuntos de objectos da Webpart para categorizar e definir a sua área de acção, essas áreas pode-mos definir um 

WebBrowsable: A propriedade está visivel ou não na Edição da WebPart
Category: Categoria onde se insere a propiedade.
FriendlyName: Nome da area da propiedade
Description: Pequena descrição da utilidade da propriedade

Exemplo de criação de propriedade para Texto e CheckBox. 

Propriedade Redirect URL:

        //Propriedade Texto
[WebBrowsable(true)] 
[Category("Redirect Url")] 
[PersistenceMode(PersistenceMode.InnerProperty)] 
[Personalizable(PersonalizationScope.Shared)] 
[FriendlyName("Redirect Url OK")] 
[Description("Redirect Url OK")] 
public string RedirectURLOK 

get { return _RedirectURLOK; } 
set { _RedirectURLOK = value; } 
}
        
        //Propriedade CheckBox
        [WebBrowsable(true)]
        [Category("Redirect Url")]
        [PersistenceMode(PersistenceMode.InnerProperty)]
        [Personalizable(PersonalizationScope.Shared)]
        [FriendlyName("Active Redirect URL OK")]
        [Description("Active Redirect URL OK")]
        public bool ActiveOK
        {
            get { return _ActiveOK; }
            set { _ActiveOK = value; }
        }

O resultado da nossa Propriedade:


Exemplo de criação de propriedade para DropDown. 

Propriedade Cores "Para escolher uma propriedade de uma  Lista de valores, devemos criar um enumerate":

//Propriedade Dropdown
public enum cores
{
amarelo = 0,
vermelho,
verde};

protected cores _cor;

[WebBrowsable(true)]
[Category("Cores")]
[PersistenceMode(PersistenceMode.InnerProperty)]
[Personalizable(PersonalizationScope.Shared)]
[FriendlyName("Escolher Cor")]
[Description("Escolher Cor")]
public cores _Cor
{
get { return _cor; }
set { _cor = value; }
}

O resultado da nossa Propriedade:


Desenho do Menu de Edição da WebPart  "EditorPart, ToolPart"


Com a evolução dos Sharepoint com as diferentes versões "Wss2.0/Wss3.0" e "SPS2003/MOSS2007" o Controlo WebPart tem sofrido algumas alterações para tornar mais rica a experiência para o utilizador.  

Quando foram utilizadas as WebPart em  "Wss2.0/SPS2003" estas tinham a class "ToolPart" que dava a capacidade de desenhar controlos na WebPart para ajudar a configuração desta, esta class vinha do Objecto "System.Web.UI.WebControls.WebParts.WebPart".  

Com as  WebPart existentes em "Wss3.0/MOSS2007" o objecto "System.Web.UI.WebControls.WebParts.WebPart" manteve-se, sendo derivadas dessa class outra do tipo "Microsoft.SharePoint.WebPartPages.WebPart" onde existem novas funcionalidade para ajuda ao desenvolvimento entre elas a class "EditorPart".

Essas Classes são bastantes úteis quando estamos a desenhar a nossa WebPart e controlos de apoio com regras de funcionalidade de muito especifica, aqui fica um exemplo de como podemos chamar esta classes. 

 public class CustomWebPart : Microsoft.SharePoint.WebPartPages.WebPart
    {
..........
//Metodo para Chamar as Classes de Desenho Gráfico "EditorPart"
public override EditorPartCollection CreateEditorParts()
        {
            List<EditorPart> editorParts = new List<EditorPart>(1);
            EditorPart item = new MenuListEditorPart();
            item.ID = this.ID + "_mailEditorPart";
            editorParts.Add(item);
            return new EditorPartCollection(base.CreateEditorParts(), editorParts);
        }

//Metodo para Chamar as Classes de Desenho Gráfico "ToolPart"
 public override ToolPart[] GetToolParts()
        {
            ToolPart[] toolparts = new ToolPart[3];
            WebPartToolPart wptp = new WebPartToolPart();
            CustomPropertyToolPart cptp = new CustomPropertyToolPart(); 
            WebToolPart ctp = new WebToolPart();

            toolparts[0] = wptp;
            toolparts[1] = cptp;
            toolparts[2] = ctp;

            return toolparts;
        }
        .............
}

Com Métodos criados na Class Principal então podemos começar a derivar.


EditorPart

  • Desenho Gráfico do Topo da webPart

    using System;
    using System.Collections;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;

    public class MenuListEditorPart : EditorPart

     protected override void CreateChildControls()
        {

                .....Adicionar e Desenhar os controlos para o Topo de Edição da WebPart

         }



Imagem Exemplo:



 

ToolPart

  •  Desenho Gráfico do fundo do modo de edição da WebPart.

using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using Microsoft.SharePoint.WebPartPages;
using Microsoft.SharePoint;
using System.Drawing;
using Microsoft.SharePoint.WebControls;

class WebToolPart : ToolPart

protected override void CreateChildControls()
        {

                .....Adicionar e Desenhar os controlos para o fundo de Edição da WebPart

         }


Imagem Exemplo:






Novas opções de Menu da WebPart

Umas das grandes capacidades da WebPart a sua flexibilidade e a facilidade em disponibilizar a informação em todas as formas, como no Menu da propia webPart.




Para ter um resultado final como na imagem de anexo, vai ser necessário utilizar o metodo "WebPartVerbCollection" para criar novas opções de Menu da WebPart.


Pequeno exemplo:



 public override WebPartVerbCollection Verbs

        {

            get

            {

                List<WebPartVerb> verbs = new List<WebPartVerb>();

                WebPartVerb verb1 = new WebPartVerb(

                    this.ID + "_docLibVerb", String.Format("window.location.href = '{0}'", "http://spupload.codeplex.com"));

                verb1.Description = ShortcutDescription;

                verb1.Text = verb1.Description;

                verb1.ImageUrl = "/_layouts/images/HTM16.GIF";

                    verbs.Add(verb1);

                WebPartVerbCollection allverbs =

                     new WebPartVerbCollection(base.Verbs, verbs);

                return allverbs;

            }

        }

Actualizar Propriedade da WebPart em Código


Sempre que alterar as propriedades em código .cs, deverá ser utilizado o comando "this.SetPersonalizationDirty();" para forçar a actualização da nossa propriedade na WebPart.


Exemplo:
.......
ActiveOK=true;
this.SetPersonalizationDirty();

..........

Espero que estes pequenos exemplo possam ajudar no desenvolvimento mais rico e "User Friendly" das nossas aplicações, nem sempre tudo é simples mas o resultado final será bastante agradável. :)

Podem fazer download do codigo como exemplo no seguinte Link.


Espero que tenham gostado de artigo, um grande abraço. J


segunda-feira, Novembro 02, 2009

Alterar "Welcome" Control


Autor:André Lage
Publicação:__________
Download:Documento
(EN)TranslateLink

Alterar "Welcome" Controlo


Quando estamos a realizar uma apresentação das funcionalidade do SharePoint, quer seja um cliente ou conferência a pergunta alguém realizar, como alterar as propriedade do Control "Welcome", para dar um aspecto mais personalizado e mais amigável a empresa ou instituição que estamos a implementar intranets de SharePoint. 

Sim é possível, mas obriga a um conhecimento e alteração da solução no servidor e definições de regras bem definidas.

Personalizar novas Funcionalidade



Por defeito o control Welcome encontra-se na pasta de instalação do nosso SharePoint por defeito encontra-se em "C:\.....12\template\ControlTemplates\welcome.ascx".
Se queremos personalizar ou criar um novo ascx, recomendo criar um pasta onde ficam os nossos desenvolvimentos, essa pasta convem ter um nome sugestivo para rapidamente identificar ser um desenvolvimento a medida,neste caso chamei "CustomWelcome" como podia ter dado o nome da empresa onde irei implementar, tendo copiado o ficheiro Welcome.ascx para essa pasta  para começar a realizar as alterações que pretendemos.

Porque criar uma nova pasta?  
Todas as pessoas fazem erros sendo necessário ter sempre o ficheiro base como apoio.
Quando criamos o nossa solução WSP, por norma eu organizo as minhas soluções em pastas de maneira a diferenciar o que desenvolvi de outras soluções desenvolvidas.
Se alterar-mos o ficheiro "Welcome.ascx" base, isto teria impacto em todos os outros sites de SharePoint, não é isto que pretende-mos.
A ultima razão para não alterar o ficheiro "Welcome.ascx" base, sempre que é instalado um service Pack, todos os ficheiros de SharePoint que são instalado originalmente do SharePoint são alterados para deixar como estavam por defeito, perdendo todas as configurações que foram realizados.




Depois de copiar o ficheiro, podemos editar o ficheiro onde podemos visualizar as diferentes opções que o Controlo "Welcome" fornece como, 

-Sequência do Menu
-Imagem da opção do Menu
-Descrição
-Texto
-Eventos de Javascript 
-Validação com Permissoes de SharePoint

Com estas opções podemos realizar as alterações para tornar a interacção dinâmica e com mais funcionalidades para o utilizador. 


Para adicionar o novo controlo acessível na páginas de SharePoint Welcome", será necessário abrir o nosso Sharepoint Desinger e a masterpage onde se encontra o controlo "Welcome", por defeito a masterpage de sharepoint está em "_catalog\masterpage\default.master" 
Depois de abrir a página será necessário alterar o caminho antigo da Welcome.ascx para o novo caminho.

Exemplo:


Se quiserer-mos invocar o resource do objecto Welcome que esta embedded em "Welcome [username]", podemos utilizar o objecto "SPResource.GetString("WelcomeUser",new object[] {name});", ou podemos alterar através de javascript, para ajudar ao nosso desenvolvimento podemos usar como apoio o Internet Explorer Developer Toolbar, esta aplicação é muito prática para identificar e validar html e id associados aos control asp.net que existem no site de SharePoint e para utilizar no javascript.
Exemplo:
<script type="text/javascript">
        function ChangeWelcome() {
            var x = document.getElementById('zz7_Menu');
           x.innerHTML="Empresa XPTO,";
</script>


<BODY scroll="yes" onload="javascript:if (typeof(_spBodyOnLoadWrapper) != 'undefined') { _spBodyOnLoadWrapper(); ChangeWelcome(); }">





Nota:
"Wictor Willen" desenvolveu um control para ajudar a renomear o texto que existe por defeito no objecto "Welcome" controls, de onde deriva-mos do control "Welcome" e mudamos o conteúdo a ser alterado.
Este exemplo é uma base de trabalho.  
namespace CustomWelcome {
     public class Welcome : Microsoft.SharePoint.WebControls.Welcome {
         protected Welcome() {
         }
          [SharePointPermission(SecurityAction.Demand, ObjectModel = true)]
          protected override void OnLoad(EventArgs e) {
              base.OnLoad(e);

             if (HttpContext.Current.User.Identity.IsAuthenticated) {
                 PostCacheSubstitutionText pt = base.ExplicitLogout.MenuControl.Controls[0] 
                                                as PostCacheSubstitutionText;
                 pt.TextType = PostCacheSubstitutionTextType.UserName;
          }
      }
}
} 
Artigo Base para apoio e alteração do Welcome control.

Espero que gostem de mais este artigo, irei lançar uma 2ª versão deste Artigo a fornecer algumas ajudas em  como se pode derivar estes controlos e outros para cumprir as regras de Acessibilidade em sites de SharePoint....
Um grande abraço.