Páginas

segunda-feira, 25 de junho de 2012

Acessar um arquivo SPFile diretamente de uma URL.

Para instanciar um objeto SPFile correspondente a um arquivo que está armazenado no seu SharePoint local, através da URL, você pode usar o método GetFile, que tem como parâmetro a URL do arquivo.

SPFile arquivo = web.GetFile(urlDoArquivo);

Pra recuperar o ListItem, basta acessar a propriedade .Item do SPFile. (arquivo.Item) Lembre de tratar exceções sempre.

Manipulando anexos de um item de lista usando SPAttachmentCollection.

Conforme você acompanhou em um tutorial anterior, a classe SPAttachmentCollection é usada para incluir/apagar anexos de um item de uma lista no SharePoint. Como uma coleção, você pode até imaginar: então há vários objetos SPAttachment ou SPFile, e posso referenciar um a um diretamente, certo? Errado.

Coisas do SharePoint... Se você acessar um item de uma lista e então sua propriedade attachments, você terá um array de strings (!) com os nomes dos anexos. Você pode adicionar um arquivo através de um método desta classe, mas não poderá fazer muita coisa além disso...
Para referenciar um anexo do SharePoint, instancie um objeto SPFile. Há duas formas para referenciá-lo:

foreach (string nomeArquivo in item.Attachments)
{ 
 
SPFile arquivo = web.GetFile(item.Attachments.UrlPrefix + nomeArquivo);
//Operações com o arquivo aqui. 
 
}

SPFolder pasta = web.Folders["Lists"].SubFolders["TÍTULO DA LISTA"].SubFolders["Attachments"].SubFolders[item.ID.ToString()];
foreach (SPFile arquivo in pasta.Files)
{
 
//Operações com o arquivo aqui. 
}

Com a referência usando o SPFile, fica muito mais fácil. ;)

Recuperando dados de um usuário do SharePoint programaticamente, usando PeopleEditor e web.SiteUserInfoList.

Em algum momento, você já precisou acessar informações de um usuário do SharePoint? Informações como cidade, estado, endereço, escritório... Detalhes que podem ser introduzidos manualmente, bem como importados do Active Directory. Neste tutorial, mostrarei como é possível recuperar estas informações, através de um controle PeopleEditor e de uma lista oculta do SharePoint.

Vamos começar, então...

Suponho que você já registrou os assemblies do SharePoint (caso contrário, favor ver o tutorial do dia 30/11/2010, onde mostro como usar controles do SharePoint em uma application page). Desta forma, adicione um controle PeopleEditor em sua page:
<SharePoint:PeopleEditor ID="peopleEditor" AllowEmpty="false" ValidatorEnabled="true" MultiSelect="false" runat="server" SelectionSet="User" Width="300px" />
A propriedade AllowEmpty indica se este campo poderá ficar vazio. ValidatorEnabled permite a exibição de uma mensagem de erro, pedindo que o campo seja preenchido. MultiSelect torna possível selecionar mais de um usuário.

Buscando um usuário na lista oculta do SharePoint

Navegue até /_catalogs/users/detail.aspx e veja os registros de usuários no portal, com atributos como Imagem, Nome, Cargo, entre outros. Para acessar programaticamente estas informações através do usuário escolhido no PeopleEditor, podemos usar uma consulta CAML ou percorrer cada um dos registros da lista, "manualmente". Não deveria, mas escolhi a segunda opção. Veja o código abaixo:

string nome;
string departamento;
string cidade;
SPListItemCollection usuarios = web.SiteUserInfoList.Items;
foreach (SPListItem user in usuarios)
{
//se encontrou o usuário no SharePoint, recupera o nome, departamento e cidade dele.
if (user["Name"].ToString() == peopleEditor.CommaSeparatedAccounts)
{
nome = user["Name"].ToString();
departamento = user["Department"].ToString();
cidade = user["City"].ToString();
}
}

Lembrando que não tratei exceções no código acima. Caso uma das propriedades (nome, departamento ou cidade) esteja vazia no SharePoint, uma exceção será lançada, portanto, pense nesta situação.

Mais atributos dentro de um registro em web.SiteUserInfoList podem ser referenciados: Office (escritório), JobTitle (função na empresa), Address (endereço), Picture (imagem usada no perfil), entre outros. Lembre sempre de tratar possíveis exceções lançadas em uma consulta deste tipo.
Estas informações do usuário podem ser editadas no próprio SharePoint. Basta clicar no seu nome de usuário (no topo da página), e depois em "Minhas definições".

Críticas são muito bem-vindas. Aguardo sua opinião sobre o artigo no diego@sharepointhelp.com.br.

Usando o PeoplePicker (e demais controles do SharePoint) em uma application page (.aspx).

Para usar controles do SharePoint em uma application page customizada (.aspx), você precisará registrar os assemblies necessários do SharePoint. Adicione ao início da página, após a cláusula Page e antes dos Contents, as seguintes linhas:

<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
< %@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>


A partir disso, você pode colocar os controles do SharePoint normalmente. Um exemplo usando o PeoplePicker:

<SharePoint:PeopleEditor ID="pplEditor" AllowEmpty="false" ValidatorEnabled="true" MultiSelect="false" runat="server" SelectionSet="User" Width="300px" />

Como fazer o upload de um documento para o SharePoint programaticamente.

Em uma lista do SharePoint, você pode ter um ou mais anexos. A lista de anexos de um item é uma coleção do tipo SPAttachmentCollection. Neste exemplo, usaremos um controle FileUpload para carregar o documento.

//faz o upload do arquivo desejado
if (fUpload.PostedFile != null && fUpload.HasFile){
Stream fStream = fUpload.PostedFile.InputStream;
byte[] conteudo = new byte[fStream.Length];
fStream.Read(conteudo, 0, (int)fStream.Length);
fStream.Close();
fStream.Dispose();
SPAttachmentCollection attachments = item.Attachments;
string nomeArquivo = Path.GetFileName(fUpload.PostedFile.FileName);
attachments.Add(nomeArquivo, conteudo);
} 

Error when debugging: "Could not load web.config file. The given key was not present in the dictionary."

Could not load the Web.config configuration file. Check the file for any malformed XML elements, and try again. The following error occurred: The given key was not present in the dictionary.”

If your configuration file is well-formed, possibly this error is happening due to your public URL set on Central Administration, on Alternate Access Mappings. The Site Url property of your project in Visual Studio needs to match the public URL on AAM. Check it on Central Administration > Configure alternate access mappings > Edit public URLs.

Erro ao depurar código: "Could not load web.config file. The given key was not present in the dictionary."

Could not load the Web.config configuration file. Check the file for any malformed XML elements, and try again. The following error occurred: The given key was not present in the dictionary.”

Se o seu arquivo de configuração está bem-formado, possivelmente a causa deste erro é a URL usada pelo seu site nos Mapeamentos Alternativos de Acesso (Alternate Access Mappings). A propriedade Site Url do seu projeto no Visual Studio precisa ter o mesmo valor da URL pública do site. Confira em Central Administration > Configure alternate access mappings > Edit public URLs.