Come perdere 2 giorni di lavoro, ovvero: nascondere il Ribbon per gli anonimous users

Il problema di per se non è nascondere il Ribbon, bensi il problema che è venuto fuori è quello che spiego di seguito. Requisito: Nascondere il controllo Ribbon di SharePoint 2010 nel caso la pagina sia vista da un Anonimous user. Soluzione: Inserisco il controllo Ribbon (che è presente nella master page custom che è stata creata per il progetto) nel controllo asp.net che si chiama LoginView usando il template LoggedInTemplate, penso che sia la soluzione migliore evitare di renderizzare il markup quando non ce nè bisogno. Problema: Per qualche strano motivo, se aggiungo una web part CEWP (Content Editor Web Part) alla pagina che usa la mia master page custom, formatto il testo usando i comandi nel tab "format text", salvo la pagina e la rimetto in editing, il tab "format text" non ricompare più. In pratica, non era più possibile formattare il contenuto della CEWP una volta che si metteva in editing la pagina. La prima cosa che mi viene in mente è cercare su google/bing se qualcuno ha avuto lo stesso problema, ma niente, nessuno sembra aver avuto questo problema che mi/ci sta facendo perdere oltre che tempo, anche ore di sonno! Dopo un paio di giorni di ricerche invane, mi imbatto in un post che mi illumina e ci fa uscire dal tunnel in cui io e il buon Francesco ci eravamo infilati.Il problema era appunto (abbastanza assurdo per il vero) che il controllo Ribbon non digerisce bene il controllo LoginView, infatti si può leggere: I finally figured out what was causing this issue.  I'm posting it here for anyone else who happens to run into it.  I was putting the SPRibbon control inside of a LoginView control so that it would only show up when the user was authenticated.  Apparently SharePoint does not like this, and the original issue I posted will show up.  I now hide it via CSS styles by default, and use a LoginView control to change the style of the container for logged in users. Ok, finalmente è chiaro il motivo di questo problema!Come si può quindi risolvere il requisito di nascondere il Ribbon in caso l'utente sia di tipo anonimo? Esistono diversi modi: Nascondere il controllo Ribbon inserendolo in un controllo SPSecurityTrimmedControl e impostando la proprietà PermissionsString con i permessi che l'utente deve avere per poter visualizzare appunto il Ribbon, nel mio caso (sito pubblico) dovrei mettere "AddAndCustomizePages" in modo che sono chi abbia quel permesso possa appunto visualizzare il Ribbon, gli altri niente. <SharePoint:SPSecurityTrimmedControl PermissionsString="AddAndCustomizePages" runat="server"> <div id="s4-ribbonrow" class="s4-pr s4-ribbonrowhidetitle"> .... </div> </SharePoint:SPSecurityTrimmedControl> Nascondere il controllo Ribbon usando JavaScript (magari usando jQuery) al load della pagina, inserendolo in un controllo LoginView usando "AnonymousTemplate" come template: <asp:LoginView ID="LoginView1" runat="server"> <AnonymousTemplate> <script type="text/javascript"> function HideRibbon() { $("#s4-ribbonrow").hide(); } _spBodyOnLoadFunctionNames.push("HideRibbon"); </script> </AnonymousTemplate> </asp:LoginView> Nascondere il controllo Ribbon usando i css (in modo tale che se per qualsiasi motivo JavaScript non sia abilitato, il controllo viene comunque nascosto dal Browser), inserendolo sempre in un controllo LoginView usando "AnonymousTemplate" come template: <asp:LoginView ID="LoginView1" runat="server"> <AnonymousTemplate> <style type="text/css"> #s4-ribbonrow { display:none !important; } </style> </AnonymousTemplate> </asp:LoginView> Qual'è la soluzione migliore? Come sempre dipende dal contesto.In questo caso, la soluzione migliore (che è anche quella sponsorizzata da Francesco :) ) è la prima in quanto si tratta di un sito di publishing ed è meglio evitare di portare sul browser del markup quando non ce nè bisogno.Le altre due soluzioni sono migliori solo quando si vuol evitare di dover impostare ogni singolo permesso che l'utente dovrà avere per soddisfare il requisto di visualizzazione del Ribbon (con la soluzione 1) bensi lo si vuole nascondere solo per gli utenti anonimi.Fra queste ultime due soluzioni preferisco l'ultima in quanto appunto viene eseguita anche se il browser ha problemi con JavaScript. Buon lavoro a tutti! ;)

About the author


Fabio Franzini is Senior Consultant, Software Engineer and Trainer, specializing mainly on SharePoint, ASP.NET, web solutions and in general about everything that revolves around the Microsoft web platform. [more]

Translate

Month List

Page List