Monday, December 9, 2013

Office365 / SharePoint 2013 - Modificare l'ordine dei link del menu contestuale (ECB)

Se vi è capitato di utilizzare, da SharePoint Designer 2013, una Custom Action per aggiungere nel menu contestuale di un item un nuovo link (ad esempio verso una funzionalità custom o una form personalizzata), vi sarete accorti anche voi della difficoltà di inserire questo nuovo link in una posizione definita.

Al contrario dei bottoni sul Ribbon, non possiamo utilizzare schemi per la posizione e il sequence numerico sembra non avere nessun effetto.

Utilizzando la stessa funzione del mio post Office365 / SharePoint 2013 - Nascondere link del menu contestuale (ECB), ho inserito un comando aggiuntivo per invertire ad esempio il link per Eliminare un Articolo, posizionandolo al terzo posto dell'item




La funzione per la sostituzione è la seguente:

function ExchangePositionWith(firstselector, secondselector) {
    var other = $(secondselector);
    var first = $(firstselector).after(other.clone());
    other.after(first).remove();
}


In cui richiamo il primo elemento (firstselector) e lo metto al posto del secondo (secondselector).
Nel mio caso, Elimina Articolo, visualizzato per primo, mi interessa al terzo posto, quindi ho eseguito due volte la funzione:

ExchangePositionWith($("a[title='Elimina Articolo']").parent(), $("a[title='Modifica elemento']").parent());
  ExchangePositionWith($("a[title='Modifica elemento']").parent(), $("a[title='Visualizza elemento']").parent());

Et voilà:

Office365 / SharePoint 2013 - Nascondere link del menu contestuale (ECB)

Utilizzando jQuery ho inserito in un javascript un comando per sostituire le funzioni richiamate dal clic sul Menu dell'item (i "...").

$("div.ms-list-itemLink").click(function(){
  CoreInvoke('ShowECBMenuForTr', this, event);GestioneMenuItem(); return false;
 });

 $("a.ms-lstItmLinkAnchor").click(function(){
  CoreInvoke('ShowECBMenuForTr', this, event);GestioneMenuItem(); return false;
 });


Questi comandi aggiungono una funzione al metodo standard richiamato dal clic e che genera il menu contestuale dell'item.

La funzione "iniettata" esegue un secondo comando dopo qualche ms, attendendo la creazione del menu.

function GestioneMenuItem(){
 setTimeout("DoGestioneMenuItem()",300);
}


La funzione responsabile della modifica del menu è la seguente e cerca gli elementi da nascondere tramite il titolo del link:

function DoGestioneMenuItem(){
 $("a[title='Elimina elemento']").parent().hide();
}


Il risultato è che, dopo il clic ed un leggero intervallo, verrà nascosta la voce di menu.

Prima:
 
Dopo:

Tuesday, October 8, 2013

SharePoint 2010 - Convalida Colonna per caratteri speciali

Eccovi una bella formula per validare il testo inserito in una List Column.
La colonna non deve contenere caratteri speciali, ad esempio se questa viene usata per creare, tramite una procedura, un file o un Document Set.

Modificare la colonna di lista e, espandere la sezione Convalida Colonna.


Inserire il testo seguente nella formula:

=AND(IF(ISERROR(FIND(",";Titolo));TRUE);IF(ISERROR(FIND("&";Titolo));TRUE);IF(ISERROR(FIND("!";Titolo));TRUE);IF(ISERROR(FIND("@";Titolo));TRUE);IF(ISERROR(FIND("~";Titolo));TRUE);IF(ISERROR(FIND("#";Titolo));TRUE);IF(ISERROR(FIND("$";Titolo));TRUE);IF(ISERROR(FIND("%";Titolo));TRUE);IF(ISERROR(FIND("^";Titolo));TRUE);IF(ISERROR(FIND("*";Titolo));TRUE);IF(ISERROR(FIND("(";Titolo));TRUE);IF(ISERROR(FIND(")";Titolo));TRUE);IF(ISERROR(FIND("-";Titolo));TRUE);IF(ISERROR(FIND("=";Titolo));TRUE);IF(ISERROR(FIND("+";Titolo));TRUE);IF(ISERROR(FIND(":";Titolo));TRUE);IF(ISERROR(FIND(";";Titolo));TRUE);IF(ISERROR(FIND("<";Titolo));TRUE);IF(ISERROR(FIND(">";Titolo));TRUE);IF(ISERROR(FIND("?";Titolo));TRUE);IF(ISERROR(FIND("'";Titolo));TRUE);IF(ISERROR(FIND("{";Titolo));TRUE);IF(ISERROR(FIND("}";Titolo));TRUE);IF(ISERROR(FIND("[";Titolo));TRUE);IF(ISERROR(FIND("]";Titolo));TRUE);IF(ISERROR(FIND(".";Titolo));TRUE);IF(ISERROR(FIND("/";Titolo));TRUE);IF(ISERROR(FIND("\";Titolo));TRUE);IF(ISERROR(FIND("""";Titolo));TRUE))

Attenzione: se desse errore, provare a sostituire il ; con la , (tranne che nel ";"). Questo vale soprattutto se la lingua del sito è in inglese (,) o italiano (;).

Poi, nel campo Messaggio Utente inserire :

Il Titolo non può contenere i caratteri seguenti: &,@,!,#,%,^,*,(,),:,;,,,?,',{,},[,],.,/,\,",~,$

Salvare e il gioco è fatto:



Tuesday, July 23, 2013

SharePoint 2010 - Simple Cascading Lookup with SPServices

A new post on that excellent tool that is SPServices, the jQuery framework / EcmaScript for SharePoint!

A simple scenario: we have two lists of data, for example, Countries and Companies for Countries, and a list which has two columns Lookup, Country and Company.
We want to be able to use the first Lookup, Country, to filter second, Company, showing Companies for the selected Country.

We create the list Nations, with only the Title field.




Now let's create Companies with Title (Company Name) and Country (lookup list to the Nations).



Now, let's create a list CustomList1 that has the two columns Country and Company, respectively lookup of Nations and Companies.

We modify the NewForm.aspx and EditForm.aspx form by entering the following code, making sure to load the SiteAssets. Js file we need:

jquery.SPServices-0.7.2.min.js (download here)
jquery-1.8.2.min.js (tested with this version)

Here's the code to insert in both forms (new and edit):

<script type="text/javascript" src="../../SiteAssets/js/jquery-1.8.2.min.js"> </ script>
<script type="text/javascript" src="../../SiteAssets/js/jquery.SPServices-0.7.2.min.js"> </ script>
<script type="text/javascript">
$ (Document). Ready (function () {
  $ (). SPServices.SPCascadeDropdowns ({
    relationshipList: "Company", // ​​Display Name of List of the second Lookup
    relationshipListParentColumn: "Country", // ​​Static Name of column of the list for the first Lookup
    relationshipListChildColumn: "Title", // ​​Static Name of the column of the second Lookup (Company Name)
    // CAMLQuery: "<Eq> <FieldRef Name='Status'/> <Value Type='Text'> Active </ Value> </ Eq>", // ​​Any query to filter the results on the second Lookup
    parentColumn: "Country", // ​​Display Name of the column as written in the New or Edit form of CustomList1
    childColumn: "Company", // ​​Display Name of the column as written in the New or Edit form of CustomList1
    simpleChild: true // change the display of the second Lookup in simple dropdown
  });
});
</ Script>

So, opening a form, for example, new item:


The second dropdown is blank, and if we select the Country:

We filter the entries in the second dropdown:


Of course, we can add code to do cascading on a third lookup.

The only caution is that the script have the column names displayed in the form : if you change this label or, simply, using a multilingual site, you need to go to edit the script.

And it's possible to call all in one .js (perhaps in the master page...) in order to make the changes only once and not have to change both forms..

SharePoint 2010 - Semplice Cascading Lookup con SPServices

Ancora un post su quell'ottimo strumento che è SPServices, il framework jQuery/Ecmascript per SharePoint!

Uno scenario semplice: abbiamo due liste di anagrafiche, ad esempio, Nazioni e Aziende per Nazioni, e una lista che ha le due colonne Lookup, Nazione e Azienda.
Vogliamo poter utilizzare la prima Lookup, Nazione, per filtrare la seconda, Azienda, per le sole Aziende per il Paese selezionato.

Creiamo la lista Nazioni, con il solo campo Title.




Ora creiamo la lista Aziende con Title (Nome Azienda) e Nazione (lookup verso la lista Nazioni).



Ora, creiamo una lista CustomList1 che abbia le due colonne Nazione e Azienda, rispettivamente lookup di Nazioni e Aziende.

Modifichiamo i form NewForm.aspx e EditForm.aspx, inserendo il codice che segue, avendo cura di caricare in SiteAssets i file .js di cui abbiamo bisogno:

jquery.SPServices-0.7.2.min.js (download qui)
jquery-1.8.2.min.js (testato con questa versione)

Ecco il codice da inserire in entrambi i form (new e edit):

<script type="text/javascript" src="../../SiteAssets/js/jquery-1.8.2.min.js"></script>
<script type="text/javascript" src="../../SiteAssets/js/jquery.SPServices-0.7.2.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
  $().SPServices.SPCascadeDropdowns({
    relationshipList: "Società",  //Display Name della Lista della seconda Lookup
    relationshipListParentColumn: "Nazione", //Static Name della colonna della Lista per la prima Lookup
    relationshipListChildColumn: "Title", //Static Name della colonna della seconda Lookup (Nome Azienda)
    //CAMLQuery: "<Eq><FieldRef Name='Status'/><Value Type='Text'>Active</Value></Eq>",   //Eventuale query per filtrare i risultati sulla seconda Lookup
    parentColumn: "Nazione", //Display Name della colonna come scritta nel form New o Edit di CustomList1
    childColumn: "Azienda", //Display Name della colonna come scritta nel form New o Edit di CustomList1
    simpleChild: true //modifica la visualizzazione della seconda Lookup in semplice dropdown
  });
});
</script>

Quindi, aprendo un form, ad esempio, nuovo elemento:


La seconda tendina rimane vuota, mentre se selezioniamo la Nazione:

Abbiamo il filtro sulle voci della seconda tendina:


Ovviamente, possiamo aggiungere altro codice per andare a mettere in cascata una terza lookup.

L'unica accortezza è che gli script portano il nome visualizzato nel form delle colonne: se si cambia questa etichetta o, banalmente, si utilizza un sito multilingua, bisogna andare a modificare gli script.

E' possibile richiamare tutto in un .js (magari nella master page) in modo da fare le modifiche solo una volta e non dover modificare entrambi i form.


Wednesday, July 3, 2013

SharePoint 2010 - Cambiare immagini e layout del Search Box

Abbiamo avuto qualche difficoltà nel dover cambiare il layout, le immagini o il css del box di Ricerca in un Sito SharePoint.
Il problema principale è nella modifica delle immagini: ad esempio, del bottone di ricerca, la lente di ingrandimento.

In SharePoint, viene recuperata tramite il posizionamento di una immagine unica (fgpng.png), contenente tutte le icone, utilizzando le proprietà di Top, Left sull'immagine.
Modificare questo png con tutte le icone non è consigliabile, perché cambierebbe su tutti i Siti della farm.
Inoltre, la lente è proprio una immagine, definitia senza classe css, per cui non è possibile intervenire solo con il foglio di stile.

Abbiamo trovato questa soluzione, un piccolo trucco, che ha funzionato egregiamente!

Sovrascriviamo le classi che definiscono l'immagine del bottone di ricerca e definiamo la nuova immagine per il link del bottone:

.ms-sbgo a  {
   background-image:url("/_layouts/images/myboxsearch/lente.png");
   background-position:4px 5px;
   background-repeat: no-repeat;
   /* ecc ecc */
}

E ora, nascondiamo l'immagine, sempre con il css:

.ms-sbgo > a > img{  
    visibility: hidden;
    height: 24px;
    width: 32px;
    padding:0;
}

Il risultato è che vedremo solo la nostra icona sul bottone e non quella di sistema!


Lo stesso trucco si può utilizzare con successo anche per :
  • Icone del Calendario (prev, next)
  • Separatori delle Breadcrumbs

Tuesday, June 4, 2013

SharePoint Designer 2010 - Issue with globally reusable Workflow Initiation Form on Foundation

In September 2012, I've opened a thread in SharePoint Dev Center Forum about an issue on globally reusable Workflow in SharePoint Foundation 2010.

You can find thread here: http://social.msdn.microsoft.com/Forums/en-US/sharepointcustomizationprevious/thread/66cf91e8-9d38-4573-948c-071e66763ba3/

Today, I received an answer from Microsoft!


Yes: there's an issue and they give KB to solve! http://support.microsoft.com/kb/2846543/en-gb

:-)

Wednesday, May 22, 2013

SharePoint 2007/10 - Filtrare gli Item di una Lista per Workflow (Approval) Status

Per poter filtrare i documenti o gli item di una lista in base allo stato del workflow, possiamo creare una nuova vista e configurare il filtro utilizzando la colonna [Stato flusso di lavoro] .
Ma se proviamo ad inserire come filtro, ad es., "Approved" o "Rejected", non otteniamo risultati.

Lo Stato del Workflow, infatti, viene memorizzato come un valore numerico!
I valori sono i seguenti:

Not Started - 0
Failed on Start - 1
In Progress - 2
Error Occurred - 3
Canceled - 4 (manualmente)
Completed - 5
Failed on Start (retrying) - 6
Error Occurred (retrying) - 7
Canceled - 15 (da workflow)
Approved - 16
Rejected - 17

L'impostazione corretta del filtro sarà quindi come l'immagine seguente:


Fare attenzione ai valori per Canceled! 
Sono diventato matto, ma se la Cancellazione è stata eseguita automaticamente dal Workflow, usare il valore 15, se invece il Workflow è stato interrotto manualmente dall'amministratore (ad es perché in errore), allora occorre usare il valore 4!


SharePoint 2007/10 - How to Filter List Items by Workflow (Approval) Status

In order to filter documents or items in a list by status of the workflow, we can create a new view and set the filter using the column [Workflow Status].
But if we try to insert as a filter "Approved" or "Rejected", we do not get results.

The Workflow Status is stored as a numerical value!
The values ​​are as follows:

Not Started - 0
Failed on Start - 1
In Progress - 2
Error Occurred - 3
Canceled - 4 (manually)
Completed - 5
Failed on Start (retrying) - 6
Error Occurred (retrying) - 7
Canceled - 15 (from workflow)
Approved - 16
Rejected - 17

The correct setting of the filter will then be like the following image:


Pay attention to the values ​​for Canceled!
If the cancellation is done automatically by the Workflow, use the value 15, but if the Workflow is stopped manually by the administrator (eg because of error), then you need to use a value of 4!

Thursday, May 16, 2013

SharePoint 2010: An update conflict has occurred, and you must re-try this action

Ogni volta che provo a fare il Backup della Farm, ricevo questo errore:

"An unhandled exception occurred in the user interface.Exception Information: An update conflict has occurred, and you must re-try this action. The object SessionStateService Parent=SPFarm Name=SharePoint_Config is being updated by DOMAIN\username, in the w3wp process, on machine XXXXXX.  View the tracing log for more information about the conflict."

Per risolvere il problema, ripulire la cahce del file system su tutti i server della farm in cui gira Windows SharePoint Services Timer service.
Per farlo seguire questi passi:

1. Fermare il Timer service, in questo modo:
  • Click Start, vai su Administrative Tools, e cliccare su Services.
  • Tasto destro su Windows SharePoint Services Timer, e clic su Stop.
2. Eliminare o spostare il contenuto della cartella seguente:

%ALLUSERSPROFILE%\Application Data\Microsoft\SharePoint\Config\[GUID]

3. Riavviare il Timer service, in questo modo:
  • Click Start, vai su Administrative Tools, e cliccare su Services.
  • Tasto destro su Windows SharePoint Services Timer, e clic su Start.
Note: Il file system cache verrà ricreato dopo questa procedura.

Assicurati di eseguire la procedura su tutti i server della farm!

SharePoint 2010: An update conflict has occurred, and you must re-try this action (Eng)

I started to get this message everytime I try to Backup Farm.

"An unhandled exception occurred in the user interface.Exception Information: An update conflict has occurred, and you must re-try this action. The object SessionStateService Parent=SPFarm Name=SharePoint_Config is being updated by DOMAIN\username, in the w3wp process, on machine XXXXXX.  View the tracing log for more information about the conflict."

To resolve this issue, clear the file system cache on all servers in the server farm on which the Windows SharePoint Services Timer service is running.
To do this, follow these steps:

1. Stop the Timer service. To do this, follow these steps:
  • Click Start, point to Administrative Tools, and then click Services.
  • Right-click Windows SharePoint Services Timer, and then click Stop.

2. Delete or move the contents of the following folder:

%ALLUSERSPROFILE%\Application Data\Microsoft\SharePoint\Config\[GUID]

3. Start the Timer service. To do this, follow these steps:
  • Click Start, point to Administrative Tools, and then click Services.
  • Right-click Windows SharePoint Services Timer, and then click Start.
Note: The file system cache is re-created after you perform this procedure.

Make sure that you perform this procedure on all servers in the server farm on which the Timer service is running.

Wednesday, May 15, 2013

Schedulare la pubblicazione dei tuoi post su Google+ con DoShare e Chrome

Si chiama DoShare ed è una piccola estensione di Chrome per pubblicare post su Google+.

Cosa fa di interessante?
Gestire la pubblicazione dei post, con la formattazione è basica, come quella di G+.
Si inserire foto, ink e creare sondaggi.

Ma la caratteristica più importante è la possibilità di gestire la schedulazione per la pubblicazione dei post!

Altra ottima funzione è quella di poter decidere a nome di quale delle vostre pagine di Google+ pubblicare il Post!

E ancora: l'integrazione con Chrome inserisce il bottone per "condividere su DoShare" sotto i post di Google+.
Il click sul post apre la pagina di condivisione del post tramite DoShare, quindi con la sua eventuale schedulazione!

Ottima estensione, prontamente installata e provata :-)


Tuesday, May 7, 2013

SharePoint 2010 - List View Lookup Threshold

By modifying a view to show all the columns of Worfklow associated Status (many), I get this message:

"This view can not be displayed Because The number of lookup and workflow status columns it contains Exceeds the threshold (8) enforced by the administrator."

Do not worry, you can change this threshold, but it is not recommended for performance problems.

Read this post to learn more (in English):
The SharePoint 2010 "List View Lookup Threshold" and Why We Do not Change It


SharePoint 2010 - List View Lookup Threshold

Modificando una vista, in modo da visualizzare tutte le colonne di stato dei Worfklow associati (molti, in effetti), al salvataggio ricevo questo messaggio:

"This view cannot be displayed because the number of lookup and workflow status columns it contains exceeds the threshold (8) enforced by the administrator."

Niente paura, si può modificare questa soglia, ma non è consigliato farlo per problemi di performance.

Leggi questo post per saperne di più (in inglese):
The SharePoint 2010 “List View Lookup Threshold” and Why We Don’t Change It


Tuesday, April 16, 2013

SharePoint 2010 - Open Quick Launch link in a new window

The need is to open a link from the Quick Launch in a new window.

When Publishing Features are not activated, we can only edit URL, name of the link and its position.



But, we can use the javascript functions! Then I tried this:  


Saving and clicking on the new link, the URL opens successfully in a new window BUT current page becomes white with the word [Object] ...

So, I tried this trick .. and it works:



The URL will open in a new window and the current page is reloaded onto itself.

SharePoint 2010 - Aprire link in una nuova finestra da Quick Launch

L'esigenza è quella di aprire un link da Avvio Veloce (Quick Launch) in una nuova finestra.
Quando non sono attive le Publishing Features, il link non è modificabile se non nell'URL, nel nome del link e nella sua posizione.


Possiamo utilizzare le funzioni javascript. Allora ho provato con questo:


 Ma salvando e cliccando sul nuovo link, l'URL si apre correttamente in una nuova finestra MA la pagina corrente diventa bianca con la scritta [Object]...

Allora, ho provato questo trucco e .. funziona:


L'URL si apre in una nuova finestra e la pagina corrente si ricarica su se stessa.


Monday, February 11, 2013

SharePoint 2010 - Gestione delle traduzioni con .Resx, .Docx grazie ad un piccolo tool


Oggi scrivo un lungo post con la descrizione delle attività da eseguire per la gestione di traduzioni di Sharepoint 2010 tramite i file .resx esportati dai siti Sharepoint.
Viene, inoltre, descritta la procedura di creazione di file .docx per le traduzioni, da fornire a personale traduttore un po' meno tecnico.


Prerequisiti

Devono essere installati i Language Pack delle lingue da utilizzare sui siti Sharepoint 2010.
Il sito deve essere configurato per l’utilizzo di almeno due lingue.
Si consiglia la lettura della documentazione Microsoft a riguardo: 


Configurare un Sito SharePoint per il Multilingua

Descriviamo brevemente la procedura per l’impostazione del multilingua e per la traduzione di label. 
Per un maggior dettaglio, seguire la documentazione Microsoft:
http://technet.microsoft.com/en-us/library/ff805062.aspx

Per la corretta visualizzazione del multilingua, un sito di Sharepoint deve essere configurato come segue.

Dal sito in oggetto, cliccare su Site Actions > Site Settings. Nella sezione Site Administration, cliccare sul link Language Settings.



Se i Language Pack sono installati correttamente, vedremo nella sezione Alternate Language(s) le lingue possibili: selezioniamo le lingue desiderate.
Lasciare No nell’opzione Overwrite Translations: in questo modo, modificando una label nella lingua predefinita (nell’esempio, inglese), la modifica NON viene propagata alle lingue alternative.
Cliccare su OK.
A questo punto, cliccando sul nome utente, sarà visibile una nuova voce di Menu “Select Display Language” con la selezione della lingua.



Traduzione di termini con l'interfaccia Browser

Su Sharepoint 2010, è possibile definire le traduzioni operando direttamente sulle impostazioni degli oggetti (Content Type, List, Library, Site Column, Site Title, Site Description, ….).
Per tradurre, ad esempio, il titolo di una Library in Italiano, seguire i passi seguenti.
-          Cambiare Lingua di Visualizzazione in Italiano, dal Menu dal nome utente (in alto a destra).
-          Aprire la Library a cui si vuole cambiare il titolo.
-          Dal ribbon, nel tab Raccolta, cliccare sulle Impostazioni Raccolta.



-          Cliccare su Titolo, descrizione e struttura e modificare il Nome (e/o descrizione)



-          Salvare e verificare il cambio del Nome al cambio di Lingua

NOTA: la Navigazione a sinistra potrebbe non seguire la traduzione, se è stata modificata in precedenza. Per correggere la lingua del menu a sinistra, operare come descritto per la Raccolta, sulla Struttura di navigazione da Impostazione Sito.


Importazione/Esportazione delle traduzioni

La funzione multilingua su Sharepoint 2010 consente di esportare e importare il contenuto dell'applicazione per la traduzione massiva.  Invece di tradurre il contenuto dell'applicazione un elemento alla volta, è possibile esportare le stringhe per qualsiasi contenuto nella lingua primaria o in una delle lingue secondarie.
Per esportare il contenuto, è possibile utilizzare il collegamento Esporta traduzioni nella pagina Impostazioni sito.
Quando si esporta il contenuto dell'applicazione di una lingua secondaria, si può decidere di esportare tutto il contenuto o solo il contenuto che non è stato tradotto.



Quando il contenuto dell'applicazione viene esportato, questo viene salvato come file. Resx, che può essere aperto utilizzando un editor di testo o qualsiasi altro strumento di terze parti in grado di aprire i file di risorse.
Dopo che le stringhe di risorse sono state tradotte, è possibile utilizzare il collegamento Importa traduzioni nella pagina Impostazioni sito per importare il file. Resx.

NOTA: E’ possibile importare solo i file .Resx per le lingue alternative.



Traduzioni con Simple Resx Editor

Per la gestione dei file di traduzione, può essere utilizzato qualsiasi editor opportuno. Tuttavia, spesso è necessario esportare il file Resx in un formato facilmente modificabile dal personale, non tecnico, che si occupa delle traduzioni. È importante fornire, quindi, un documento ad esempio in Word o Excel per la gestione delle traduzioni.

Il tool di terze parti Simple Resx Editor consente la gestione di più file di traduzioni e la sua esportazione e importazione tramite file WORD (.docx). Non ha bisogno di installazione, è sufficiente scaricare il file Zip dal sito http://code.google.com/p/simpleresxeditor/downloads/detail?name=SimpleResxEditor-v0.7.1.0.zip&can=2&q=, estrarlo ed eseguire l’applicazione.

Ecco i passi da eseguire per la corretta traduzione massiva tramite file Resx e Docx.


Esportazione File di traduzione

Occorre, prima di tutto, eseguire l’esportazione dal sito Sharepoint dei file di traduzione .resx SIA per la lingua predefinita (nell’esempio, Inglese) che la lingua Alternativa (nell’esempio, italiano).
Clicchiamo su Site Actions, Site Settings e su Export Translations ed eseguiamo l’export della lingua predefinita.
Salviamo in una cartella locale il file che avrà un nome del tipo [NomeSito].en-US.resx.
Eseguiamo ora l’esportazione del file di traduzioni per la lingua italiana, lasciando a No il campo Export Text (così siamo sicuri di esportare tutte le label da tradurre).
Salviamo il file nella stessa cartella del primo file. Avrà un nome del tipo [NomeSito].it-IT.resx.


Modificare i file con Simple Resx Editor

Apriamo Simple Resx Editor.


Clicchiamo su Open e selezioniamo dalla folder ENTRAMBI i file .resx
Il tool affianca i dati dei due file di traduzione, con indicazione della lingua utilizzata.

Aggiungi didascalia
Vediamo nel dettaglio le operazioni più utili consentite dal programma.
Partendo da sinistra.


Open e Save: consentono di aprire uno o più file resx per le traduzioni e di salvarli
Show/Hide Keys: consente di visualizzare o nascondere le key dei dati dei file (utile per visualizzare il tipo di label che si modifica).
Le due icone che seguono eseguono eventuali filtri per facilitare la ricerca dei dati da tradurre
Highlights Differences/Equals: mostrano, evidenziandole, i valori diversi o uguali. Ad esempio, mostrando i dati uguali, è possibile identificare subito i dati da modificare (il cui testo non è tradotto)

Export/Import to Docx rappresentano l’esportazione e l’importazione delle traduzioni in e da file .docx. Vedremo nel dettaglio come funzionano, nel seguito.

Per modificare le label, una volta aperti entrambi i file di traduzione, occorre eseguire le modifiche alla sezione relativa alla lingua alternativa (italiano, nell’esempio), agendo sul box “Value:”.
Una volta modificato un valore, questo viene evidenziato, come in figura.


Eseguendo il salvataggio, viene salvato il file .resx.
Per rendere effettiva la modifica su Sharepoint, eseguire la procedura di importazione del file .resx e ricaricare (F5) il sito per vederne le modifiche.


Modificare le traduzioni tramite esportazione/importazione in DOCX

Come detto, il tool permette di esportare le traduzioni in un file di Word (docx).
Cliccare sull’icona Export to Docx: viene creato all’interno della cartella dei file resx, un file [NomeSito].docx.
Il file si presenta in questo modo:


Consente quindi di visualizzare le traduzioni affiancate, ma in un formato più “maneggevole” da personale non tecnico.
Questo file è modificabile, ma occorre, come detto, effettuare le traduzioni per la sola parte della lingua alternativa (IT).
NOTA: Il layout del file non deve essere modificato per nessun motivo!

Una volta che il file .docx è stato modificato (ad esempio, inviato ai traduttori, tradotto e ritornato), occorre salvarlo all’interno della stessa cartella dei file .resx.

NOTE:
Se si era chiuso il Simple Resx Editor, occorre riaprirlo, e riaprire entrambi i file di traduzione.
Fare attenzione a non cliccare su Esporta su Word (per non sovrascrivere le modifiche del docx).
Ffare attenzione che il file word abbia come nome [NomeSito] così come sui file resx ([NomeSito].it-IT.resx)

Quindi, cliccare sull’icona Import from Docx per importare le traduzioni.
Il programma importa le traduzioni evidenziando le modifiche rispetto agli originali valori dei file.


Cliccare su Save per salvare le modifiche sui file resx, in particolare, sul file [NomeSito].it-IT.resx.

Per rendere effettiva la modifica su Sharepoint, eseguire la procedura di importazione del file .resx e ricaricare il sito per vederne le modifiche.



Note Importanti

Le traduzioni "Core"
L’esportazione dei file di traduzioni non esporta tutto il contenuto del sito, ma solo le parti che l’utente può modificare o che l’utente ha già modificato nella lingua predefinita. Molte delle traduzioni sono già eseguite da Sharepoint (ad esempio le voci di menu di Site Settings, o alcune label di sistema).
È possibile agire su queste traduzioni, modificando file dell’installazione di Sharepoint 2010, contenuti in C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\Resources.
Questa cartella contiene i file Resx per le lingue.
MA: Non è consigliabile andare a modificare direttamente questi file.

Traduzioni della Navigazione
L’esportazione delle traduzioni, come detto, fornisce i label da tradurre per le nuove voci inserite dall’utente o per i valori modificati, da browser, sulla lingua predefinita.
In generale, importando il file di traduzioni, al refresh della pagina, le nuove label vengono visualizzate immediatamente.
Per il menu di navigazione (a sinistra), se personalizzato, per poter visualizzare le traduzioni occorre “ri-salvare” la navigazione, seguendo questi passi:
- Aprire Site Actions > Site Settings e nelle sezione Look and Feel, cliccare sul link Navigation
Verificare che, cambiando lingua, il box contentente le voci della struttura di spostamento cambino label
- Cliccare su OK, salvando la navigazione
- Verificare il menu a sinistra, cambiando la lingua di visualizzazione

Friday, February 8, 2013

SharePoint 2010 - Nascondere bottoni del Ribbon con jquery (javascript)

Il Ribbon, questo ormai nostro compagno di viaggio nel mondo Microsoft.
Se lo conosci, scopri ogni volta quanto sia effettivamente utile a contestualizzare le tue azioni su documenti, item, ...
Una novità, introdotta ormai da MS, anche in altri ambienti, dopo Office, SharePoint, anche il nuovo CRM e persino ora Windows8...

Ma ad alcuni nostri clienti ancora può non piacere. Ebbene sì.
Così "perché non mi rimuovete quel tastino lì?", "perché non mi mostrate solo quello, ma solo per questa library, non per quella, ecc?"...



Tramite Object Model, possiamo "tranquillamente", con almeno un tre etti di righe di XML, riuscire a nascondere, disabilitare, modificare le funzioni, i bottoni, l'aspetto, gli eventi per la maggior parte dei pulsanti.

Ma ogni tanto, non è necessario intervenire così a fondo, magari non si ha sempre a disposizione una risorsa di sviluppo da utilizzare (o l'ambiente di sviluppo).

Così, l'ormai mitico jquery, è qui per noi, al solito!

Ho inserito nella pagina il codice sottostante. Potete farlo nel modo che più vi piace: in una content editor web part, modificando la pagina della vista con SP Designer 2010, modificando la master page, ecc...

Creiamo la funzione js

function HideButton(id)
{
    $('[id*="'+id+'"]').hide();   
}

Riceve l'id del bottone. Normalmente il bottone è un SPAN, ma se volessimo ad esempio nascondere tutto un gruppo, che è un LI, possiamo utilizzare sempre questa funzione.


Creiamo una seconda funzione js con l'elenco dei bottoni da nascondere:

function HideRibbonButton()
{
    //nasconde il bottone New Document
    HidButton("Ribbon.Documents.New.NewDocument");

    //nasconde il gruppo Edit & CheckOut
    HideButton("Ribbon.Documents.EditCheckout");

    //facciamo ripartire la funzione
    setTimeout(HideRibbonButton, 10);     
}

Richiamiamo nel $(document).ready, la funzione HideRibbonButton, così che all'avvio della pagina, parte il tutto.

Meglio ancora: scriviamo le istruzioni per eseguire il tutto, dopo che è stato caricato tutto il js della nostra pagina di SharePoint:

ExecuteOrDelayUntilScriptLoaded(InitEditForm, 'sp.ui.dialog.js');

function InitEditForm(){
    HideRibbonButton();
}

La pagina si carica e .. i comando spariscono, con buona pace per il cliente.

E nostra.



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!