Monday, January 28, 2013

SharePoint 2010 - Inserire come Title il Name del documento caricato con javascript!

Quante volte mi sono trovato in difficoltà a .. giustificare il perché SharePoint non mette come Title del Documento caricato il Name dello stesso..!?
Lo fa, certo, se si tratta di un documento Office correttamente compilato (ad es. un file Word con la proprietà Title, o un PDF..)
Ma non lo fa sempre, o non sempre i documenti sono correttamente compilati.

Una strada è l'Event Receiver, ma occorre compilare del codice, non sempre possibile, su tutti gli ambienti dei nostri clienti.

Così, la strada del javascript (o con più facilità, con jquery).

Nota: questa strada è possibile SE tutti i nuovi documenti sono caricati tramite la form di upload o modificando le proprietà da browser!
Per upload massivi o creazione di nuovi documenti da template, questo discorso non è valido ed è necessario intervenire con l'Event Receiver!

Modifichiamo la master page, con il richiamo alle librerie jquery e con l'inseriemto del codice sottostante:


function SetFieldTitleFromNameAutomatic()
{
var inpName = $("input[title='Name']");
var inpTitle = $("input[title='Title']");
if(inpName.val() != '' && inpTitle.val() == ''){
inpTitle.val(inpName.val());
}
}

Questo, essendo chiamato dalla master page, agisce su tutte le pagine, comprese (ed è quello che ci interessa) le new/edit form.
In particolare, la EditForm raggiunta dopo l'upload di un nuovo documento!

Caricando un nuovo documento, al termine dell'upload, viene aperto il form che richiama la funzione SetFieldTitleFromNameAutomatic().

Magia: il campo Title (se vuoto) viene valorizzato con il campo Name!


SharePoint 2010 - Impostare ListId di un FormField da codebehind

Con Visual Studio, si è rivelato molto comodo poter utilizzare i FormField per form di inserimento o modifica degli item di una lista.
Purtroppo, sembrava inutile ogni nostro tentativo di impostare via codice il parametro ListId, così per un paio di volte abbiamo dovuto fare l'inserimento del GUID della lista manualmente....
Con tutti i problemi del caso, per i deploy in altre macchine, ad esempio.

Poi, finalmente, il post giusto ci dà l'imbeccata per il metodo che segue e che è stato risolutivo!

Utilizzare il FormField come segue, inserendo una funzione OnInit e non impostando ListId.

<SharePoint:FormField ID="FormField1" OnInit="setFormFieldListId_OnInit" ControlMode="Edit" FieldName="ColumnName" runat="server" />

A codice, definire la funzione indicata qui sotto, in cui viene impostato il ListId alla creazione del controllo:

protected void setFormFieldListId_OnInit(object sender, EventArgs e)
{
       FormField ff = (FormField)sender;
       ff.ListId = list.ID;
}

Ovviamente, list = oggetto SPList opportunamente richiamato dal contesto web (ad es. web.GetList(urlList) ).

Buon utilizzo!

Thursday, January 24, 2013

Due interessanti articoli per SharePoint Developer!


Segnalo un paio di interessantissimi articoli sullo Sviluppatore SharePoint!

What is a Sharepoint Developer
Cosa è lo Sviluppatore SharePoint? Una interessante analisi sui livelli dello sviluppatore e i requisiti per diventarlo!

10 things developers should know about SharePoint
10 cose che uno Sviluppatore SharePoint dovrebbe sapere.
Utilissima guida base sulle nozioni utili per approciare il mondo di SharePoint (definito, giustamente, nell'articolo come "enormous"!)

Buona Lettura!

SharePoint 2007/2010 - Implementare un Select All Checkbox su tutta la Site Collection

Grazie al lavoro di un collega, effettuato su una form di una lista, al Cliente è venuta l'idea di implementare lo stesso controllo per selezionare/deselezionare tutti i check di una colonna di tipo Choice, su tutti i form che utilizzano la Site Column, su SharePoint 2007..

Se il lavoro fosse stato quello di implementare il controllo solo su una lista, lo avrei fatto comodamente sulle pagine di Edit e New Item per quella lista, tramite SharePoint Designer.
Ma purtroppo, la colonna in oggetto è presente su diverse liste o library della site collection (sub site compresi!).

L'idea è stata quella di utilizzare la master page (comune a tutti i siti e sottositi), un po' di jquery e una modifica sulla Site Column in questione.

Abbiamo una colonna di sito, di tipo Choice, con nome MyCheck, visualizzata con i checkbox.
Inseriamo in testa ai valori di scelta della colonna il valore "Select All MyCheck" (uso il nome della colonna così da poter replicare il concetto anche su altre site column analoghe!).

Ora modifichiamo, con il Designer la master.page di default, inserendo semplicemente il link agli script jquery e al nostro script "magico".
Salviamo, pubblichiamo, approviamo e rendiamo la modifica valida per tutti i siti.

Ora creiamo il file javascript e posizioniamolo nella root della site collection (ad es in SiteAttets).

Inseriamo il codice che segue. Richiamando quindi la funzione

checkSelectAll("Select All MyCheck");

Viene implementato il controllo, lato client, e alla selezione del primo check ("Select All MyCheck") vengono selezionati tutti i check seguenti e deselezionandolo, vengono deselezionati!

Questo script viene richiamato ad ogni caricamento di ogni pagina, di ogni form, di ogni sito che usa la stessa master.page: se incontra il check in questione, allora implementa il controllo, altrimenti, prosegue senza problemi.

Non ho testato se può funzionare con il 2010..

Lo script è stato creato in poco tempo, quindi è senz'altro da ottimizzare: ogni suggerimento è ben accetto!


<script>


function getField_JQ(fieldType,fieldTitle)
{
return $(fieldType+"[title='"+fieldTitle+"']");
}

function checkSelectAll(objCheckAll_Title)
{
//select span with title = "Select All MyCheck"
var objCheckAll = getField_JQ("span",objCheckAll_Title);
        //select input checkbox in span
var inpCheckAll = objCheckAll.children(':input');
        //find parent tbody for span (table>tbody>tr>td>span)
var parentTableBody = objCheckAll.parent().parent().parent();
        //for check all, set event for change value
inpCheckAll.change(function(){
if(this.checked){ 
parentTableBody.children('tr').children('td').children('span').children('input').each(function(){
this.checked = true;
});
}
else{
parentTableBody.children('tr').children('td').children('span').children('input').each(function(){
this.checked = false;
});
}
});
}

//then call function to set control!
checkSelectAll("Select All MyCheck");

//if you have other site columns with this behaviour, call function
//checkSelectAll("Select All NameColumn");

</script>

SharePoint 2010 - Group By Content Type

Sembra che non esista la possibilità di creare una vista con un raggruppamento degli item per Content Type.
E, in effetti, se provate a visualizzare le colonne con cui è possibile effettuare il raggruppamento, non è visualizzata la colonna Content Type.


Niente paura (quasi), perché il raggruppamento è possibile!
Necessita però di SharePoint Designer...

Apriamo il sito e la pagina con la vista da raggruppare e selezioniamo la web part, visualizzandone il codice.


Identifichiamo il tag <Query> e in quella posizione aggiungiamo il seguente codice


Riporto il codice qui, per la copia

<GroupBy Collapse="TRUE" GroupLimit="100">
    <FieldRef Name="ContentType"/>
</GroupBy>

Salviamo la pagina e ricarichiamo il browser e ... voilà!


Miglior visibilità si ottiene modificando il link "Content Type" e inserirlo sul nome del Content Type.

Questo è "in progress".. Sembra molto semplice farlo e da Designer vedo correttamente la web part


ma da browser.. restituisce errore o fa sparire la vista..


Se avete idee.. io nel frattempo ci provo ancora!



Wednesday, January 16, 2013

SharePoint - Write XSLT getting icon image for attachment link

I created an event receiver in MOSS that oncreate and onupdate item, save link of Attachment in a HyperLink Field, named Link1.

So I have a list of items, with direct link to document in attachment.

In web part, I want to show Icon of type of document, in the first column.
But there is no function to get "last index of" dot, in extension of file.

So I created the script below, getting last 5 chars in link (probably, the dot and the extension, as ".pptx"):

<img src='{concat('/_layouts/images/ic',substring-after( substring(substring-before(@Link1,','),string-length(substring-before(@Link1,','))-4,6),'.'),'.gif')}' />

So, if attachment is a 'pdf' file, it search for image at url "/layouts/images/icpdf.gif".

Of course, you have all icon image in /layouts/images, or you can create your custom folder for icons!