venerdì 16 ottobre 2009

Custom Master Page

Mi sono sempre domandato quando mai avrei usato le custom master page di Sharepoint, ora l'ho scoperto.

Per un progetto ho creato una site definition graficamente molto gradevole ma del tutto inadatta ad ospitare le pagine delle liste (list form page), quindi ho dovuto trovare un sistema per poter applicare la mia master page alle sole pagine aspx presentate al visitatore, lasciando la default master page associata al resto delle pagine. Siccome le pagine associate alle liste usano la ~/_layouts/default.master, non posso associare la mia master page alla default.
A questo punto entra in gioco la custom master page, ovvero nella mia site definition, nel file ONET.XML, ho usato configuration id="1" name="Blank" custommasterurl="/_catalogs/masterpage/clinicalmaster/ClinicalBasic.master", mentre nel codice SPweb.CustomMasterUrl e nelle pagine aspx ~masterurl/custom.master.

In questo modo tutte le pagine originali di WSS continuano a lavorare come prima.

mercoledì 14 ottobre 2009

Rilasciata nuova versione della guida su ARF

Ho rilasciato su Codeplex una nuova versione della guida di ARF. Ancora più dettagliata, ho approfondito il controllo Menu, mostrando il suo utilizzo in un caso reale. Da non perdere la presentazione dei template XSLT utilizzati per generare i menu di navigazione, nei quali sfrutto la catteristica del controllo di iniettare parametri all'interno degli stili XSLT.

venerdì 9 ottobre 2009

ServerTemplate - Identificativi dei tipi di lista

Ringraziando Evan Grimmett che li ha pubblicati sul suo blog vi riporto i numeri che identificano i tipi di lista:
100 Generic list (00BFEA71-DE22-43B2-A848-C05709900100)
101 Document library (00BFEA71-E717-4E80-AA17-D0C71B360101)
102 Survey (00BFEA71-EB8A-40B1-80C7-506BE7590102)
103 Links list (00BFEA71-2062-426C-90BF-714C59600103)
104 Announcements list (00BFEA71-D1CE-42de-9C63-A44004CE0104)
105 Contacts list (00BFEA71-7E6D-4186-9BA8-C047AC750105)
106 Events list (00BFEA71-EC85-4903-972D-EBE475780106)
107 Tasks list (00BFEA71-A83E-497E-9BA0-7A5C597D0107)
108 Discussion board (00BFEA71-6A49-43FA-B535-D15C05500108)
109 Picture library (00BFEA71-52D4-45B3-B544-B1C71B620109)
110 Data sources
111 Site template gallery
112 User Information list
113 Web Part gallery
114 List template gallery
115 XML Form library
116 Master pages gallery
117 No-Code Workflows
118 Custom Workflow Process
119 Wiki Page library
120 Custom grid for a list (00BFEA71-3A1D-41D3-A0EE-651D11570120)
130 Data Connection library
140 Workflow History
150 Gantt Tasks list (00BFEA71-513D-4CA0-96C2-6A47775C0119)
200 Meeting Series list
201 Meeting Agenda list
202 Meeting Attendees list
204 Meeting Decisions list
207 Meeting Objectives list
210 Meeting text box
211 Meeting Things To Bring list
212 Meeting Workspace Pages list
300 Portal Sites list
301 Blog Posts list
302 Blog Comments list
303 Blog Categories list
850 Page Library
1100 Issue tracking (00BFEA71-5932-4F9C-AD71-1557E5751100)
1200 Administrator tasks list
2002 Personal document library
2003 Private document library

Ho aggiunto (in data 9 Ottobre 2010) anche gli ID delle relative feature che installano i template di lista, utili quando si vuole creare un'istanza di lista via feature.
Come dice lui stesso, lo faccio per avere un posto comodo per cercarli.

sabato 3 ottobre 2009

SharePoint Forum in Italiano

Vi voglio segnalare il Microsoft SharePoint Forum completamente dedicato agli sviluppatori italiani di SharePoint e agli appassionati di SharePoint in genere. Qui potete porre le vostre domande e attendere la risposta di uno degli MVP Italiani iscritti al forum: Igor Macori e Claudio Brotto, per citerne alcuni.

Una bella iniziativa, un embrione di community italiana, anche se io spero veda la luce al più presto questo progetto SharePointCommunity.it.

Nota del 11 Luglio 2010: l'indirizzo del forum è cambiato. Quello giusto è il seguente Microsoft SharePoint Forum

lunedì 28 settembre 2009

The Winner is...

È con onore che vi annuncio che il lavoro svolto per la realizzazione del sito ATM ha ricevuto un riconoscimento. Il sito ATM ha vinto il premio Interactive Key Award 2009 nella sezione Corporate, gareggiando contro UniCredit Italia, Ford sito corporate e Ristorazione McDonald's.

La candidatura recita: Cliente ATM, proggettazione e grafica Cultur-e, coord. e sviluppo tecnologico Direz. Sistemi Informativi ATM, soluzione tecnologica Brain Force Italia.











premiazione sito  ATM premio IKA
Pierluigi Sacchi (a destra) e Daniele Guarneri (a sinistra) dopo la premiazione, con l'attestato ricevuto per la realizzazione del sito ATM.
Daniele Guarneri, Pierluigi Sacchi e Elena Dalla Massara con l'attestato ricevuto per la realizzazione del sito ATM.premiazione sito  ATM premio IKA


Un ringraziamento speciale a tutti i ragazzi di Brain Force che hanno collaborato per la realizzazione di questo progetto. Un saluto particolare a Lino Miraglia che mi ha sopportato e supportato per tutto il tempo.

Articoli relativi:
Finalmente online
Ringraziamenti

sabato 19 settembre 2009

DataBase Sniffing

Vi segnalo un articolo del mio amico Michelangelo, in cui viene presentato uno script per "navigare" nel database di SharePoint. Per gli amanti del brivido...

Extract MOSS 2007 list info via SQL

venerdì 28 agosto 2009

Guida ad ARF in italiano

Ho finalmente rilasciato la prima release della guida su ARF, per ora solo in italiano. La guida non è ancora completa, perchè il lavoro di indagine e lungo e tedioso, anche perchè il prodotto non è molto documentato e quel poco di documentazione è frammentario e non esaustivo.

Spero che vi sia utile e aspetto commenti e suggerimenti.

Italian ARF Guide

martedì 28 luglio 2009

martedì 14 luglio 2009

Chi cerca trova !?

Condividendo il pensiero del mio collega Stefano Beretta, che si lamenta dei blog in cui l'autore si vanta delle brillanti idee avute mentre era al gabinetto (cito le sue testuali parole), perdendo di vista il senso di condivisione; mi appresto, spero, a dare qualche utile informazione su di un problema che mi si è presentato almeno quattro volte nel giro di un mese e che navigando in internet ho trovato spesso nei forum su SharePoint.

Chi cerca trova, dicevamo; ma non sempre il detto è vero.
Ultimamente mi è capitato di avere parecchi problemi con il servizio di Search di WSS, ovvero senza eclatanti segnalazioni d'errore mi sono trovato ad avere ricerche prive di risultati. In assenza di errore nell'event viewer e nei file di log è alquanto difficile risalire al problema, inoltre la molteplicità di differenti installazioni complica la cosa e fa sembrare un problema comune un altro problema. Fortunatamente in un caso: WSS 3.0 SP2 a 64 bit installato su Windows Server 2008, qualche segnalazione d'errore mi è stata, appunto, segnalata; in ordine ho ricevuto errori con EventID pari a 10032, 10035, 10038 e 2424.

Event Type: Error
Event Source: Office Server Search
Event Category: Search service
Event ID: 10038
Date: 9/12/2007
Time: 9:14:08 PM
User: N/A
Computer: USCHI4VINSPS1
Description:
Query machine 'USCHI4VINSPS1' has been taken out of rotation due to this error: 0xeb0001d1. It will be retried in 15 seconds. Component: 9eb17ee8-4f59-4bed-a70d-c172ab0857b8


------------------------------------------------------------------------------------------------

Event Type: Error
Event Source: Windows SharePoint Services 3 Search
Event Category: Gatherer
Event ID: 2424
Description: The update cannot be started because the content sources cannot be accessed. Fix the errors and try the update again.

Context: Application 'Search', Catalog 'index file on the search server Search'


"S' io avessi previsto tutto questo, dati causa e pretesto.." avrei cambiato mestiere, comunque sia credo di aver capito che la soluzione di tutti i mali è disabilitare il Loop Back Check. Il sintomo principale lo si può individuare se si prova ad accedere ad una site collection (che non sia la console di amministrazione) dal server in cui è installato SharePoint, il sito non sarà accessibile, metre lo si potrà navigare da qualsiasi altra macchina collegata in rete. Questo è quello che in genere capita con MOSS (401.1 Error When Accessing SharePoint From Server), la stessa anomalia invece in WSS sembrerebbe inficiare anche il servizio di ricerca (anzi al 17/07/2009 ne sono certo). Il tutto sembra essere dovuto ad una patch di windows. Per disabilitare il Loop Back Check ho seguito quanto indicato in questo articolo: "Users experience authentication issues when they access a Web page...". In sintesi:

Impostare
DisableLoopbackCheck
Re-enable the behavior that exists in Windows Server 2003 by setting the DisableLoopbackCheck registry entry in the HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa registry subkey to 1. To set the DisableLoopbackCheck registry entry to 1, follow these steps on the client computer:

1. Click Start, click Run, type regedit, and then click OK.
2. Locate and then click the following registry subkey: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
3. Right-click Lsa, point to New, and then click DWORD Value.
4. Type DisableLoopbackCheck, and then press ENTER.
5. Right-click DisableLoopbackCheck, and then click Modify.
6. In the Value data box, type 1, and then click OK.
7. Exit Registry Editor.
8. Restart the computer.
Note You must restart the server for this change to take effect. By default, loopback check functionality is turned on in Windows Server 2003 SP1, and the DisableLoopbackCheck registry entry is set to 0 (zero).

Alla fine i miei problemi si sono risolti, mi auguro di essere stato d'aiuto anche per i vostri.

Filtrare una lista con regole sulla data

Vi segnalo un interessante post che descrive come filtrare una lista usando regole sul campo data, per esempio "mostra gli item solo se sono stati creati meno di 7 giorni fa".

Advanced SharePoint View and Filter techniques

giovedì 9 luglio 2009

Ancora su Feed RSS

Ultimamente mi è capitato di dover validare il feed RSS v2.0 creato con le procedura presentata negli articoli Feed RSS con SharePoint - 2/2 e Feed RSS con SharePoint - 1/2. Il risultato è stato che il feed non era valido secondo il W3C (Feed Validator), con però solo due segnalazioni. Per sistemare i due errori è bastato inserire a livello di SharePoint nelle proprietrà della Site Collection inerenti ai feed RSS un valore di ManagingEditor e di WebMaster non solo un indirizzo mail ma anche una descrizione, che dovrebbe essere il nome completo del proprietario della cassetta di posta. In sostanza invece di

pippo.rossi@mail.it

ho messo

pippo.rossi@mail.it (Pippo Rossi)

Infine l'ultimo errore era dovuto ad un namespace inesistente nell'XML generato che si risolve sostituendo l'istruzione

xtw.WriteStartElement(”guid”, page.Title);

con

xtw.WriteStartElement(”guid”, String.Empty);

Dopo queste due semplici modifiche ho rivalidato con successo il feed generato dal mio codice.

giovedì 2 luglio 2009

ARF Guide (1)

Come accennato in precedenza comincio a parlarvi dei risultati delle mie prove con ARF e di quanto reperito in rete, soprattutto dall'autore, in merito a ARF (Alternative Rendering Framework). Ogni commento e ulteriori informazioni sono più che gradite.

ARFConsole
Mostra una console di editing (stile Publishing Site). Ci sono due Control Template per la console; uno per i Publishing Site e uno per i Team Site (WSS e MOSS):

  • ArfConsole.ascx

  • ArfWssConsole.ascx
I due controlli sono diversi, ArfConsole corrisponde a quanto mostrato nella figura sottostante, mentre ArfWssConsole mostra il Welcome Message e il pulsante Site Action. A dire il vero quest'ultimo controllo non lo trovo utilissimo, comunque può essere uno spunto per una personalizzazione.

Proprietà pubbliche


IsFloatingBooleano per indicare se la console è bloccata o flottante

Esempio
Inserire nella propria pagina/layout di pagina la dichiarazione del control template da usare e il controllo console;

<@ Register TagPrefix="ARFConsole" TagName="Console" src="~/_controltemplates/ARF/ARFConsole.ascx" %>

<ARFConsole:Console runat="server" IsFloating="True">


giovedì 25 giugno 2009

Feed RSS con SharePoint - Errata Corrige

In un precedente articolo (Feed RSS con SharePoint - 2/2) ho scritto il seguente codice per impostare una data all'interno del feed RSS:

xtw.WriteElementString(”pubDate”, pages.Created.ToString(”R”));

Questo però genera un problema con i reader (per esempio Outlook). Il metodo ToString della classe DataTime riporta in stringa la data letta da Sharepoint nel formato GMT, ma non aggiorna la data rispetto al meridiano di Greenwich! I reader invece interpretano la data come riferita al meridiano e la correggono in base al fuso orario del paese in cui si trovano, quindi per l'italia in regime di ora legale sommano 2 ore. Capita così di avere item che riportano un orario di insermento superiore all'orario attuale. Per sistemare il problema, bisogna usare l'istruzione seguente:

xtw.WriteElementString(”pubDate”, pages.Created.ToUniversalTime.ToString(”R”));

L'istruzione ToUniversalTime invece riconverte la data rispetto al meridiano di Greenwich.

martedì 23 giugno 2009

Alternative Rendering Framework (ARF)

Già in precedenza ho accennato al framework ARF, in quanto mi è venuto comodo per rendere accessibili alcuni componenti del WCM di MOSS. In questo periodo ho ripreso in mano il framework, anche perchè ci sono state della aggiunte, e vorrei provare a spiegarne l'utilizzo. Il problema è che il framework è poco documentato e non sempre intuitivo; volevo quindi lanciare una proposta, ovvero chiunque ha usato il framework o ha materiale in merito mi può contattare o postare un commento per aiutarmi a scrive una serie di articoli in italiano che descrivano al meglio alcuni aspetti di questo strumento.

A breve ho intenzione di parlarvi dei controlli SiteQuery e ListQuery di ARF che ho usato con WSS e che mimano un pochino la funzionalità delle Content by Query Web Part, XML e XSL compresi.

Rinnovo l'invito a farsi avanti a tutti coloro che avessero informazioni su ARF.

Intanto vi segnalo un embrione di sito documentativo sull'argomento: http://arf.thekid.me/Pages/default.aspx

lunedì 8 giugno 2009

Finalmente online

Sono molto contento di annunciare che ha visto finalmente la luce il progetto che mi ha impegnato per tanti mesi, tutto fatto con SharePoint e che mi ha fornito molti spunti per gli articoli che ho pubblicato.

Andando su www.atm-mi.it potrete vedere il risultato di tanto lavoro.

———————————————————————–
Parlano di noi:
Da oggi i trasporti di Milano viaggiano su SharePoint



venerdì 29 maggio 2009

CAML Query e Stato di un Item

Come sicuramente tutti sanno per testare lo stato di moderazione (_ModerationStatus) di un item in SharePoint con una query CAML si fa in questo modo:

<Query>
<Where>
<Eq>
<FieldRef Name=”_ModerationStatus” />
<Value Type=”ModStat”>Approved</Value>
</Eq>
</Where>
<Query>

Si nota subito che non  viene usato un codice (che sarebbe multilingua) ma un valore letterale, quindi se si installa SharePoint in Italiano questa query CAML non funzionerà. I valori possibili forniti da SDK sono:

Member name

Description

Approved The last major version of the item is
displayed in the public views of the list or document
library.
Denied The last major version of the item is not
displayed in the public views of the list or document
library.
Draft The item minor version is being edited and is
not ready for approval.
Pending The decision about displaying the item in
public views of the list or document library is pending.
Scheduled The decision about displaying the item in
public views of list or document library is pending and will be
processed by a timer service.

La traduzione in italiano degli stati dovrebbe essere:

Approvato
Negato
Bozza
In Sospeso
Pianificato

Alla prossima!



mercoledì 27 maggio 2009

WCM Variation & PageLayout

Per un progetto che sto seguendo, mi è capitato di dover affrontare questo problema:

“Avendo attivato le variation in un sito di publishing in cui sono stati crati dei custom web provisioning, ovvero delle classi che si occupano di fare alcune operazioni in fase di creazione di un sito, registrati in una custom site definition, mi è capitato che le home page dei siti ri-creati dal sistema di variation perdessero tutti i page layout associati, matenendo solo quello definito di default. Andando a controllare nella lista Pages le proprietà della default page si vedeva chiaramente che in presenza di contenuti questi venivano renderizzati in modo non corretto perchè mancava il giusto page layout.”

Fortunatamente esiste sempre un pio uomo sulla terra che affronta per primo questi problemi e in questo caso è stato Garry Lapointe che ci mette a disposizione una fantastica collezioni di custom extention per stsadm, tra cui esiste il comando: gl-fixpublishingpagespagelayouturl che permette di riassociare un page layout ad una pagina, ma non solo…

Con questo fantastico comando ho potuto risolvere il mio problema.



giovedì 14 maggio 2009

Scrivere in un SPFolder

Recentemente ho consigliato ad un cliente di utilizzare la possibilità di SharePoint di creare e scrivere in folder invece che in liste, visto che aveva la necessità di memorizzare solo dei dati (immagini) volanti e non permanenti, che dopo poco tempo dovevano essere rimossi. Il folder in questione è stato creato nella site collection per mezzo di una semplice feature che caricava un file di testo nel foder stesso consentendone la creazione. In socondo luogo abbiamo scritto il codice per accedere al foleder ed aggiornarne il contenuto.

Il codice in questione è il seguente:

SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite elevatedSite = new SPSite(SPContext.Current.Site.ID))
{
using (SPWeb elevatedWeb = elevatedSite.OpenWeb(SPContext.Current.Web.ID))
{
//creo un’istanza di SPfolder che mi aggancia alla cartella creata all’attivazione della FEATURE
SPFolder <NomeOggettoSPFolder> = elevatedSite.RootWeb.Folders["<NomeDellaFolder>"];
elevatedWeb.AllowUnsafeUpdates = true;
//aggiungo il file alla cartella temporaneamente
<NomeOggettoSPFolder>.Files.Add(FileUpload1.FileName, FileUpload1.FileBytes, true);
<NomeOggettoSPFolder>.Update();
elevatedWeb.AllowUnsafeUpdates = false;
}
}

});

E’ importante notare che per aggirare i problemi di sicurezza si è scelti di elevare i diritti di esecuzione e per farlo correttamente si è dovuto creare una Site Collection clone dell’originale e un Web Site clone dell’originale in modo che il contesto risultasse con gli opportuni privilegi. Il resto del codice si commenta da sè, l’unica cosa che posso far notare è l’utilizzo di un controllo .Net per l’upload del file, che nel nostro caso si chiama FileUpload1.

Alla prossima.



venerdì 24 aprile 2009

Accedere alle WebPart di una pagina

Se si ha la necessità di accedere alla form di gestione delle webpart inserite in una pagina è sufficiente porre in query string il seguente parametro “contents=1″.

quindi ad esempio: http://nome_server/Pages/default.aspx?contents=1



martedì 24 marzo 2009

Identificatore univoco per i ListItem

Dovendo recuperare un item di una lista dopo averne fatto un content deploy un mio collega e io ci siamo domandati se ci fosse una proprietà degli item che rimaneva immutata tra sorgente e destinazione: l’abbiamo trovata usando SharePoint Manager. La proprietà in questione è UniqueId; MSDN recita “Gets the GUID that uniquely identifies the item for the internal database” e nulla più. UniqueId è una proprietà di SPListItem. Nel nostro caso i prima battuta usavamo SPContext.Current.Item["GUID"] pensando di aver identificato un valore univoco, invece ci siamo accorti che questo valore con il content deploy variava. Invece utilizzando SPContext.Current.ListItem.UniqueId abbiamo risolto il problema.

Altra cosa interessante è la possibilità di usare questo valore per recuparare un publishing page da una lista Pages tramite Content Query Web Part, infatti con una semplice query CAML del tipo:

<span lang="EN-US"><Where></span><span lang="EN-US">
<Eq>
<FieldRef Name='UniqueId' />
<Value Type='Text'></span><span lang="EN-US">{9C5324A9-BD5D-411C-9F78-7F494BF87985}</span><span lang="EN-US"></Value>
</span> </Eq>
</Where>

è possibile raggiungere il risultato. Sempre usando una Content Query Web Part, estesa da noi in modo da fare override delle proprietà come OvverideQuery, ho scoperto, che istruendo la web part ad estrarre anche la proprietà UniqueId e usando il sitema di debug di Heather Salomon, la proprietà si presenta come segue:

<span lang="EN-US">V:<strong>1;#{9C5324A9-BD5D-411C-9F78-</strong><strong>7F494BF87985}</strong></span>

con lo stesso formalismo di un campo di lookup, dove il numero che precede ;# corrisponde all’ID dell’item nella lista, mentre il codice tra parentesi graffe è l’UniqueId.

Infine segnalo un sistema per esporre lo UniqueId di una pagina di un publishing site in un page layout (comodo anche per altre proprietà del ListItem)

<span lang="EN-US"><SharePointWebControls:ListItemProperty<br />runat="server" id="ListItemProperty1" Property="UniqueId"<br />InDesign="True" /></span>

Alla prossima!