Posts
117
Comments
179
Trackbacks
6
venerdì 19 giugno 2009
TIP: Document Compatibility e relativo meta tag


Come ben si sa IE8 ha introdotto la funzionalità document compatibility attraverso la quale è possibile far girare IE8 in “emulazione” IE7 o in Quirk mode.
Sul blog di Giorgio Sardo è possibile trovare un flow chart molto esplicativo.

Per far funzionare le nostre applicazioni web in una delle modalità disponibili è sufficiente utilizzare il meta tag:

<meta http-equiv="X-UA-Compatible" content="IE=…." />

Nel caso si utilizzino le Master Page il tutto diventa molto utile dato che è sufficiente aggiungere il tag nelle varie master.
Attenzione però a dove lo si aggiunge: il tag deve essere messo prima eventuali link a file CSS, altrimenti IE8 continuerà a funzionare come al solito.

posted @ venerdì 19 giugno 2009 14.32 | Feedback (0)
mercoledì 3 giugno 2009
Visual Studio 2010: Web.Config Transformation


Segnalo un interessante post, che illustra in modo approfondito una delle nuove caratteristiche di Visual Studio 2010, le Web.Config Transformation.

posted @ mercoledì 3 giugno 2009 9.45 | Feedback (0)
sabato 23 maggio 2009
jQuery Ribbon


Ormai si moltiplicano come funghi script e plug-in per jQuery.
Oggi segnalo un plug-in per dotare le proprie applicazioni web di Ribbon. Lo script ovviamente si chiama jQuery Ribbon.

posted @ sabato 23 maggio 2009 11.55 | Feedback (0)
mercoledì 20 maggio 2009
Visual Studio 2010 Beta 1 anche per i comuni mortali


Finalmente è disponibile per il download anche ai non MSDN Subscriber. In questo post sono riportati i vari link per i download.
Download in progress….

posted @ mercoledì 20 maggio 2009 21.11 | Feedback (0)
martedì 12 maggio 2009
Annunciati i requisiti di sistema per SharePoint Server 2010


Direttamente dal blog del Microsoft SharePoint Team, sono stati annunciati i requisiti di sistema relativi a SharePoint 2010.
Si conoscevano già ma è meglio ribadirli:

  1. SharePoint Server 2010 will be 64-bit only.
  2. SharePoint Server 2010 will require 64-bit Windows Server 2008 or 64-bit Windows Server 2008 R2.
  3. SharePoint Server 2010 will require 64-bit SQL Server 2008 or 64-bit SQL Server 2005.

Interessante anche quello che viene detto a proposito dei browser supportati:

To ensure the best possible experience across multiple browsers we’re focusing our SharePoint 2010 engineering efforts on targeting standards based browsers (XHTML 1.0 compliant) including Internet Explorer 7, Internet Explorer 8 and Firefox 3.x. running on Windows Operating Systems.  In addition we’re planning on an increased level of compatibility with Firefox 3.x and Safari 3.x on non-Windows Operating Systems.  Due to this focus Internet Explorer 6 will not be a supported browser for SharePoint Server 2010.

Quindi se state utilizzando SharePoint in azienda e avete ancora installato Internet Explorer 6, pensate già alle varie strategie di upgrade.
Personalmente il supporto più esteso a Firefox 3.x non può che farmi piacere!

posted @ martedì 12 maggio 2009 9.15 | Feedback (0)
venerdì 8 maggio 2009
Installare WSS 3.0 o MOSS 2007 su Windows 7 RC


Sull’onda dell’entusiasmo per il nuovo sistema operativo di casa Microsoft, mi sto accingendo ad installare WSS 3.0 direttamente sul sistema operativo guest senza ricorrere a nessuna macchina virtuale.
Per fare questo segnalo questo ottimo articolo che spiega i pochi passi da fare che differenziano l’installazione di WSS 3.0 su Windows 7 rispetto alla stessa installazione fatta su Vista.

P.S. Lo so questo genere di installazione non sarebbe supportata ufficialmente, ma per chi come me sviluppa molto su SharePoint può far comodo lavorare direttamente sulla propria macchina di sviluppo senza ricorrere a virtual machine

posted @ venerdì 8 maggio 2009 12.21 | Feedback (0)
giovedì 16 aprile 2009
SP2 per Office e SharePoint in dirittura d’arrivo


Ormai ci siamo quasi. Il prossimo 28 Aprile sarà rilasciato il Service Pack 2 sia per Office 2007 sia per Office Server 2007 (SharePoint e compagnia bella).
Le novità sono tantissime e le potete trovare elencate in dettaglio in questo post.

posted @ giovedì 16 aprile 2009 9.49 | Feedback (0)
mercoledì 15 aprile 2009
SharePoint Data Zoom Web Part


Breve post per segnalare la SharePoint Data Zoom Web Part che consente di eseguire query verso varie fonti dati senza aver bisogno di skill di programmazione.
La versione free consente di fare query su liste, ma esistono diverse estensioni (a pagamento), tra cui quella per eseguire query su SQL Server e quella per eseguire ricerche su Active Directory.

posted @ mercoledì 15 aprile 2009 9.04 | Feedback (0)
venerdì 10 aprile 2009
Sostituire il rich text field editor di SharePoint


Quando si usa una colonna di testo su SharePoint e si abilita l’editor Rich Text si ha lo spiacevole problema che il rendering funziona solo su IE. Questo è dovuto all’utilizzo di un ActiveX che ovviamente funziona solo sui browser di mamma Microsoft.

Nell’ultimo progetto che sto portando avanti invece gli utenti utilizzano indifferentemente Safari, Firefox e IE (lo so è un casino…). Come fare? Occorre sostituire l’editor originale, con uno dei tanti web editor che si trovano in giro.
Facendo una serie di ricerche e una serie di test quelli che mi sento di consigliare sono: RadEditor Lite, FCKEditor e TinyMCE. Del RadEditor esiste anche una versione a pagamento che mette a disposizione molte caratteristiche aggiuntive, che però possono essere trovate nella stragrande maggioranza dei casi negli altri due editor. Proprio per questo nel mio progetto sto valutando gli ultimi due.

L’integrazione degli editor su SharePoint può essere fatta in vario modo: in questo post viene descritto un metodo per integrare l’FCKEditor andando a modificare il file non_ie.js di SharePoint. Nessun problema, funziona tutto correttamente, ma comunque si va a modificare direttamente un file di SharePoint e non è mai una bella cosa. Inoltre il metodo suggerito permette di sostituire l’editor solo per i browser non-IE, mentre secondo me sarebbe molto più comoda una soluzione globale che uniformi l’editor utilizzato su tutti i browser.

In questo secondo post, viene mostrata una soluzione molto più elegante ed efficace. In questo caso viene integrato il TinyMCE, ma l’approccio può essere utilizzato anche per altri editor. Sostanzialmente viene creata una feature (codice sorgente in fondo), che va ad aggiungere un rendering template custom per i campi RichTextField.
Abilitando la feature (creata con scope di Web Application), l’effetto finale è quello di avere il nuovo editor disponibile su tutti i browser e su tutti i campi di tipo RichTextField.
Nell’esempio vengono create due toolbar con controlli abbastanza standard, ma se si guarda nella documentazione ufficiale del TinyMCE si potrà notare che ci sono molti altri elementi da aggiungere nelle varie toolbar, che sono personalizzabili in tutto e per tutto.

posted @ venerdì 10 aprile 2009 10.56 | Feedback (0)
giovedì 12 marzo 2009
WSS 3: feature per selezionare la master page


Incuriosito dal post di Omar, mi sono subito cimentato con il test della soluzione proposta.
Ottima devo dire, sebbene abbia un’unica pecca: non viene evidenziato il tab relativo al sito corrente (lo so non è proprio banale essendoci livelli multipli, però…). Comunque si può ovviare al problema modificando il codice o implementando una soluzione costum “ispirata” a quella proposta.

Comunque nel link segnalato da Omar, viene spiegato tutto passo per passo. Il punto finale dell’installazione è quello della modifica della master page. Dato che non mi  piace molto modificare la master page di default, me ne sono creato una copia, l’ho “uploadata” su WSS 3.0 certo di poterla selezionare…. Ma evidentemente mi sbagliavo con MOSS 2007!

Cercando sul solito Google mi sono imbattuto in questa feature che aggiunge la possibilità di selezionare una master page e di applicarla a tutti i siti della collection. Non c’e’ che dire, veramente utile!

posted @ giovedì 12 marzo 2009 22.03 | Feedback (0)
martedì 10 marzo 2009
SharePoint Tips: update delle proprietà di un SPItem via Object Model


Man mano che si lavora con SharePoint si scroprono tanti dettagli, tanti workaround, tanti “tarocchi”.
Nel post di oggi, voglio segnalare un comportamento “strano” che si verifica utilizzando l’Object Model di SharePoint. In particolare, volendo andare a modificare le proprietà di un elemento di una lista, si potrebbe utilizzare un frammento di codice tipo questo:

   1: using (SPSite site = new SPSite(SITE_URL))
   2: {
   3:   using (SPWeb web = site.OpenWeb())
   4:   {
   5:     SPList list = web.Lists[LIST_NAME];
   6:     if (list != null)
   7:     {
   8:       SPListItemCollection items = list.Items;
   9:       items[0]["Field1"] = "Val1";
  10:       items[0]["Field2"] = "Val2";
  11:       items[0]["Field3"] = "Val3";
  12:       // Aggiornamento dei valori
  13:       items[0].Update();
  14:     }
  15:   }
  16: }

Cosa c’e’ di sbagliato? Apparentemente niente, Visual Studio compila correttamente, ma quando si va a testare le modifiche non vengono salvate sull’elemento selezionato.
La particolarità dell’esempio è che si sta utilizzando una SPListItemCollection accedendo direttamente agli item della collection. Certo l’esempio è stupido, ma consideriamo ad esempio casi in cui la collection di Items è frutto di una SPQuery e che occorre iterare tra tutti gli elementi trovati andando a modificare una o più proprietà. Penso sia un caso abbastanza comune, o almeno a me è capitato più volte.

Debuggando il codice precedente, si nota che ogni volta che si accede all’elemento della collection, viene restituito l’oggetto originario, senza le modifiche fatte in precedenza. Per risolvere il problema, occorre modificare il codice nel modo seguente:

   1: using (SPSite site = new SPSite(SITE_URL))
   2: {
   3:   using (SPWeb web = site.OpenWeb())
   4:   {
   5:     SPList list = web.Lists[LIST_NAME];
   6:     if (list != null)
   7:     {
   8:       SPListItemCollection items = list.Items;
   9:       SPListItem li = items[0];
  10:       li["Field1"] = "Val1";
  11:       li["Field2"] = "Val2";
  12:       li["Field3"] = "Val3";
  13:       // Aggiornamento dei valori
  14:       li.Update();
  15:     }
  16:   }
  17: }

Sostanzialmente l’elemento della collection, va assegnato ad un oggetto SPListItem che sarà poi utilizzato per le modifiche e per la chiamata all’Update.

posted @ martedì 10 marzo 2009 12.42 | Feedback (3)
giovedì 5 marzo 2009
Una SPQuery che non funziona e restituisce tutti gli elementi


Oggi mi sono imbattuto in uno strano problema: stavo sviluppando una funzione che restituisse una serie di elementi da una lista di SharePoint filtrati opportunamente.
Per fare questo ho deciso di utilizzare una bella SPQuery e quindi mi sono messo a testare la mia query CAML con il tool per eccellenza, l’ U2U CAML Query Builder.

In men che non si dica funzione e query erano pronte ad essere testate. A questo punto sono iniziati i problemi: lanciando la query sull’U2U CAML Query Builder tutto funzionava correttamente. Lanciando la query dal mio applicativo, la query non filtrava i risultati. Sostanzialmente mi restituiva tutti gli elementi della lista.
Ammetto che è da un po’ che non realizzavo una query CAML, ma provando e riprovando, il risultato era sempre lo stesso. Una veloce Googlata mi ha portato alla soluzione del problema: quando si copia la query dall’U2U CAML Query Builder bisogna omettere il tab <query> iniziale. Eliminato quello tutto è tornato a funzionare come prima.

E dire che se la memoria non mi inganna, mi era già successo in passato…. Ma l’età avanza, si vede che sto perdendo colpi!

posted @ giovedì 5 marzo 2009 20.32 | Feedback (0)
mercoledì 25 febbraio 2009
SharePoint: aggiungere e rimuovere modifiche al web.config tramite feature


L’argomento è trattato in tanti post, ma personalmente ho trovato molte difficoltà a reperire le giuste informazioni e a sviluppare una soluzione pienamente funzionante. Quindi cerco di fare chiarezza per futura memoria mia e per chi ne avrà bisogno.

L’esigenza è molto semplice: modificare il web.config di SharePoint con l’aggiunta di parametri, sezioni o modificando il valore di semplici attributi. Il caso che forse più comune è quello di aggiungere parametri alla sezione <appSettings> che solitamente non è nemmeno presente nel web.config di SharePoint.

L’esempio presentato in questo post tratta proprio l’aggiunta di un parametro alla sezione <appSettings>.  Supponendo di aver già impostato la nostra feature con i vari eventi e supponendo di voler aggiunere il parametro quando la feature viene attivata e rimuoverlo quando la feature viene disattivata, dovremo prendere in considerazione i due eventi FeatureActivated e FeatureDeactivating.

In fase di attivazione il codice da eseguire sarà questo:

   1: public SPWebConfigModification createModification(String paramName, String value, String ownerID)
   2: {
   3:   SPWebConfigModification modification = new SPWebConfigModification("add[@key='" + paramName + "']", "configuration/appSettings");
   4:   modification.Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode;
   5:   modification.Value = "<add key=\"" + paramName + "\" value=\"" + value + "\" />";
   6:   modification.Sequence = 0;
   7:   modification.Owner = ownerID;
   8:   return modification;
   9: }
  10:         
  11: public override void FeatureActivated(SPFeatureReceiverProperties properties)
  12: {
  13:     SPWebApplication webApp = SPContext.Current.Site.WebApplication;
  14:     // Ripulisco le modifiche precedenti se presenti
  15:     webApp.WebConfigModifications.Clear();
  16:     // Per sezioni che includono altri figli devo usare EnsureSection.
  17:     // questo fa si che la sezione venga creata se non esistente
  18:     SPWebConfigModification modification = new SPWebConfigModification("appSettings", "configuration");
  19:     modification.Type = SPWebConfigModification.SPWebConfigModificationType.EnsureSection;
  20:     modification.Value = "appSettings";
  21:     modification.Sequence = 0;          
  22:     // In questo caso il Guid è settato ad un valore casuale in modo che la sezione non 
  23:     // sarà rimossa in fase di disinstallazione potendo essere usata da altre applicazioni
  24:     modification.Owner = Guid.NewGuid().ToString();
  25:     // Aggiungo le modifiche
  26:     webApp.WebConfigModifications.Add(modification);
  27:  
  28:     // Aggiungo un parametro 
  29:     webApp.WebConfigModifications.Add(createModification("Param1","Value1", properties.Feature.DefinitionId.ToString()));
  30:  
  31:     // Salvo le modifiche sul web.config
  32:     webApp.Update(); 
  33:     webApp.Farm.Services.GetValue<SPWebService>().ApplyWebConfigModifications();           
  34: }

Da notare che come prima cosa viene creare la sezione <appSettings> se non esistente. Dato che si tratta di una sezione e dato che non vogliamo sovrascriverla se già presente utilizzeremo il tipo EnsureSection e come owner utilizzeremo um Guid generato casualmente.
Molta attenzione va fatta invece nell’aggiunta dei parametri alla sezione <appSettings>. Infatti il nome della SPWebConfigModification deve essere l’XPath che identifica univocamente il nodo all’interno della sezione padre.
Se il nome non viene impostato correttamente otterremo due side-effect:

  1. il parametro non sarà rimosso in fase di disattivazione della feature;
  2. se il parametro è già presente, verrà creato un doppione.

La rimozione delle modifiche eseguite è un’operazione molto più semplice. La funzione che sto utilizzando è quella descritta in questo post:

   1: public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
   2: {
   3:   SPWebApplication webApp = SPContext.Current.Site.WebApplication;
   4:   Collection<SPWebConfigModification> oCollection = webApp.WebConfigModifications;
   5:   int iStartCount = oCollection.Count;
   6:   // Elimino solo le modifiche inserite dalla feature corrente (verifico attraverso l'ID)
   7:   for (int c = iStartCount - 1; c >= 0; c--)
   8:   {
   9:     SPWebConfigModification oModification = oCollection[c];
  10:     if (oModification.Owner == properties.Feature.DefinitionId.ToString())
  11:       oCollection.Remove(oModification);
  12:   }
  13:   // Se è stato effettivamente eliminato qualcosa, faccio l'update
  14:   if (iStartCount > oCollection.Count)
  15:   {
  16:     webApp.Update();
  17:     SPFarm.Local.Services.GetValue<SPWebService>().ApplyWebConfigModifications();
  18:   }
  19: }

Sostanzialmente si cicla tra tutte le modifiche presenti e si rimuovono solo quelle che hanno l’owner identico all’ID della Feature corrente.
Alla prossima!

posted @ mercoledì 25 febbraio 2009 14.47 | Feedback (4)
Crash inaspettato dell’add-in WSPBuilder in Visual Studio 2008


Ormai per me che sviluppo molto su SharePoint, l’add-in di WSPBuilder per Visual Studio 2008 è diventato un must. Lo sto usando con profitto in tanti progetti e la sua gestione del deploy a mio giudizio non ha eguali.

Comunque ieri installando l’add-in su di una nuova macchina virtuale con Visual Studio 2008 + SP1 ho riscontrato un crash inaspettato che non avevo mai incontrato su altre macchine. Sostanzialmente Visual Studio 2008 in fase di startup andava in crash sistematicamente. Disinstallando l’add-in tutto tornava a funzionare. Reinstallando, stesso errore.
Sull’event-viewer l’unico indizio riportato è il seguente:

Faulting application devenv.exe, version 9.0.21022.8, stamp 47317b3d, faulting module msenv.dll, version 9.0.21022.8, stamp 47317c00, debug? 0, fault address 0x000b4210.

Cercando su Google ho trovato sul forum del progetto su Codeplex un post in cui viene segnalato lo stesso errore, anche se viene riscontrato su Windows Server 2008 (nel mio caso il sistema operativo è Windows Server 2003). Purtroppo nel post non veniva data nessuna risoluzione.

Nel mio caso la situazione si è risolta semplicemente reinstallando Visual Studio 2008 + SP1. Non so se possa essere una risoluzione generalizzata al problema, andrebbe verificato in più casi.
Se qualcuno avesse trovato una soluzione più veloce e immediata è pregato di farsi vivo (magari sul forum del progetto per rendere la cosa pubblica).

posted @ mercoledì 25 febbraio 2009 8.53 | Feedback (0)
mercoledì 18 febbraio 2009
SharePoint, event receiver e WebService


Oggi mi è capitato un problema “particolare” nella realizzazione e successivo utilizzo di un event receiver legato ad una document library.
Lo scenario è questo: Windows SharePoint Service e un event receiver legato ad una document library. Niente di più facile. Armato del mio fedele Visual Studio e del mio WSPBuilder, in men che non si dica ho buttato su un piccolo progettino di test.

Tutto funziona correttamente. Andando in debug e testando l’inserimento di un documento da SharePoint, Office, risorse di rete, ho verificato che gli eventi vengono sempre agganciati correttamente. Questo fino a che non ho testato un web service sviluppato da terze parti. Il web service in questione non fa nulla in particolare. E’ installato sulla stessa macchina di SharePoint, e lavora direttamente sul modello degli oggetti di SharePoint andando a recuperare un oggetto SPFolder e aggiungendo un nuovo documento.

In questo caso nessun evento viene lanciato, mentre il file viene correttamente inserito all’interno della document library. Consultando il sempre fedele Google, ho scovato questo post in cui mi ha fatto pensare questa frase:

It seems like the Event Handler of SharePoint only trigged in a Context environment ( in the w3wp.exe process, that means the WebPart, the WebApplication, the Web Services, or the Event Handler it self).
It cannot trigged in a console application, because it's not running under the "web". I think it's by design......

Nel mio caso non si tratta di un’applicazione console, ma comunque il discorso che viene fatto è più generale. Andando a controllare, ho notato che effettivamente il web service girava sotto un application pool custom, diverso da quello di SharePoint. Quindi non girava nel contesto di SharePoint. Provando a modificare l’application pool e settando quello usato da SharePoint tutto torna magicamente a funzionare.

Non ho verificato cosa succede in caso di applicazioni diverse, quali console application o servizi Windows.
Che dire, buono a sapersi!

posted @ mercoledì 18 febbraio 2009 22.09 | Feedback (0)
News
Se volete sapere con chi avete a che fare eccomi qui in uno "scatto" lavorativo.
La mia foto

Logo MCAD
Logo MCTS

Visite dal 16/03/2007:

Il mio stato su Messanger: