24/11/2010
Le format est souvent de 16 X 16 ou 32 X 32 encodé avec 32bits de couleurs. Pour les navigateurs évolués tel que Modiza FF, Chrome, Opera et IE 5, l'intégration est simple, il suffit de rendre le fichier (favicon.ico) disponible dans la racine. Par contre pour les anciens navigateurs, il faut ajouter 2 balises dans le HEAD HTML. <link rel="icon" type="image/png" href="favicon.png" /> <link rel="shortcut icon" type="image/png" href="favicon.png" /> Cette approche nous offre aussi la possibilité d'utiliser un autre format qu’ico pour l'image. ** dans SharePoint la racine web appartient au chemin gérer "/" disponible par défaut. Mais il faut faire attention lors de l'intégration car toutes les collections de sites et les sous-sites hériterons de cet icône.
08/09/2010
Il suffit d'ajouter le bout de code JavaScript suivant au niveau de la page dans un éditeur de contenu pour obtenir un page comme celle-ci et sur chaque webpart, il devient possible d'imprimer un webpart en particulier en éliminant la facture graphique du site un général.
Et lors du click:

<script type="text/javascript" src=" http://www.google.com/jsapi"></script> <script type="text/javascript"> // Load jQuery google.load("jquery", "1.2.6"); </script> <script type="text/javascript"> $(function(){ //find all web parts by their TD var tags = $("td[id^='MSOZoneCell_WebPart']"); //loop through web parts tags.each(function(){ //get id for print function var tagid = $(this).attr("id"); //append an image with onClick event $(this).find("h3 nobr").append( "<span style='padding-left:20px;'>"+ " <a href='#' onClick='printWebPart("+'"'+tagid+'"'+"); return false;'>"+ " <img src='/_layouts/images/nws16.gif' border='0' alt='printer friendly' />"+ " </a>"+ "</span>"); $(this).find("td.ms-toolbar[width='99%']").append( "<span style='padding-left:20px;'>"+ " <a href='#' onClick='printWebPart("+'"'+tagid+'"'+"); return false;'>"+ " <img src='/_layouts/images/printerfriendly.gif' border='0' alt='printer friendly' />"+ " </a>"+ "</span>"); }); });
function printWebPart(tagid){ if (tagid) { //build html for print page var html = "<HTML>\n<HEAD>\n"+ $("head").html()+ "\n</HEAD>\n<BODY>\n"+ $("#"+tagid).html()+ "\n</BODY>\n</HTML>"; //open new window var printWP = window.open("","printWebPart"); printWP.document.open(); //insert content printWP.document.write(html); printWP.document.close(); //open print dialog printWP.print(); } } </script>
01/09/2010
Pour faire apparaitre le menu de gauche, il est incontournable que nous utilisions SharePoint Designer.
Alors on navigue sur la page ou nous voulons faire apparaitre le menu et nous cliquons sur Fichier d'internet Explorer et ensuite sur Modifier avec Microsoft SharePoint Degner.
Il faut localiser le ContentPlaceHolderId PlaceHolderLeftNavBar et ensuite le faire hériter de la page maître.
Parfois c'est suffisant, mais dans le cas ou le contenu de la page à droite est important, le menu aura tendance à s'applatir. Pour régler cette situation, il faut localiser le ContentPlaceHolderId PlaceholderNavSpacer et ensuite le faire hériter de la page maître.
31/08/2010
Situation :
Nous avons voulu chanllerger l'interface vanille de SharePoint d'une vue de type calendrier dans une liste.
Nous avions déjà reçu la demande de filtrer un calendrier en fonction d'un champ de recherche. L'approche à l'époque fût de suggérer au client de créer une vue par item ce trouvant dans la liste auquel le champ de recherche est associé.
Ce principe fonctionne lorsque nous effectuons le site, mais lorsque nous voulons parler d'évolution, il faut fournir un nombre incalculable de formation pour que le client soit en mesure d'assimiler le concept de liste, de vue et de calendrier.
Alors nous avons tenter de faire autrement.
Besoin :
- Avoir une liste déroulante nous offrant de sélectionner un des items ce trouvant dans la liste auquel le champ recherche est associer
- Lorsque le choix sélectionner de la liste déroulante change, les items du calendrier doivent disparaitre ou apparaitre
Implentation :
Résultat
Nous devons en premier lieu être en mesure d'insérer du code JavaScript dans la page. Deux approches sont possibles, soit on entre le code directement dans la page avec SharePoint designer, ou encore on utilise ke webpart d'édition de contenu pour mettre du code.
*** Mais attention, dans le cas du webpart, nous devons utiliser l'éditeur de source pour être en mesure d'écrire des balises de script. Et ATTENTION si suite à l'ajout des balises, vous utiliser le Éditeur de texte enrichi, l'interface va nettoyer le webpart de vos balises SCRIPT. Alors attention aux manipulations. Alors bien, pour une implentation à toute épreuve, il faut opter pour le SharePoint designer.
Nous en sommes donc rendu à insérer le code suivants en y modifiant les variables d'entête et les source des bibliothèques JavaScript.;
<script language="javascript" type="text/javascript" src=" jquery-1.4.2.min.js"></script> <script language="javascript" type="text/javascript" src=" jquery.SPServices-0.5.6.min.js"></script> <script type="text/javascript"> var LookupList = "Events Type"; var LookupField = "Event_x0020_Type"; var CalendarList = "Calendar"; var stringtoremove = "/teams/8818-5/preuvesdeconcept/lists/calendar/dispform.aspx?id=";
var idShouldBeShowUp;
$(document).ready(function() { idShouldBeShowUp = new Array(); $().SPServices({ operation: "GetListItems", async: false, listName: LookupList, CAMLViewFields: "<ViewFields><FieldRef Name='Title' /></ViewFields>", completefunc: function (xData, Status) { $(xData.responseXML).find("z\\:row").each(function() { $("#CalendarDDL").append("<option value="+$(this).attr("ows_ID") +">"+$(this).attr("ows_Title")+"</option>"); }); var out = $().SPServices.SPDebugXMLHttpResult({ node: xData.responseXML }); //$("#out").append(out); } }); applyFilter(); });
$(document).ready(function() { $("#CalendarDDL").change(function() {
applyFilter();
});
});
function applyFilter(){ var camlQuery = "<Query><Where><Eq><FieldRef Name='"+LookupField +"' LookupId='TRUE'/><Value Type='Integer'>" + $("#CalendarDDL").val() + "</Value></Eq></Where></Query>"; $().SPServices({ operation: "GetListItems", async: false, listName: CalendarList , CAMLQuery: camlQuery, CAMLViewFields: "<ViewFields><FieldRef Name='Title' /><FieldRef Name='"+LookupField +"' /></ViewFields>", completefunc: function (xData, Status) { $(xData.responseXML).find("z\\:row").each(function() { idShouldBeShowUp.push($(this).attr("ows_ID")); }); var out = $().SPServices.SPDebugXMLHttpResult({ node: xData.responseXML }); //$("#out").html(out); } }); //Jquery to sneek the page $("td[class='ms-cal-monthitem'] > a").each(function(){ var isPresent = false; var url = $(this).attr("href"); url = url.toLowerCase().replace(stringtoremove,"");
for(var i = 0 ; i<idShouldBeShowUp.length;i++){ if (url == idShouldBeShowUp[i]) isPresent = true ; } if (isPresent == false) $(this).parent().parent().parent().attr("style","display:none;"); else $(this).parent().parent().parent().removeAttr("style"); });
$("a[class='ms-cal-dayitem']").each(function(){ var isPresent = false; var url = $(this).attr("href"); url = url.toLowerCase().replace(stringtoremove,"");
for(var i = 0 ; i<idShouldBeShowUp.length;i++){ if (url == idShouldBeShowUp[i]) isPresent = true ; } if (isPresent == false) $(this).parent().parent().parent().attr("style","display:none;"); else $(this).parent().parent().parent().removeAttr("style"); });
idShouldBeShowUp = new Array(); } </script> <table width=100%><tr><td width=100% align=right><div class="ms-consolestatus">Filter: </div></td><td><select ID="CalendarDDL"></select></td></tr></table> <div id="out"></div> 25/08/2010
Situation
Lors d'un développement d'un site, un client nous a demandé d'avoir la possibilité de sélectionner une valeur Autre dans une liste de choix déroulante et que par la suite, un champ supplémentaire apparaît lui offrant la possibilité d'entre une définition personnalisée dans le contexte d'un calendrier.
Besoin
- Avoir un champs de type choix ou de type recherche sur une liste X avec des valeurs comprenant la valeur Autre.
- Un champ qui est caché lors de la création d'un item et qui apparait lorsque le choix "autre" est sélectionné et disparait lorsque ca valeur est différente.
- Le même champ doit être présent ou non dans le formulaire d'édition en relation avec la valeur que détiens la colonne de type choix ou de type recherche et doit aussi avoir le même comportement qu'en mode création.
- Ajouter les références vers les scripts JQuery.
Implantation
Pour être en mesure de répondre aux besoins de la situation, nous avons abordé une approche modifiant le formulaire de création et de modification du calendrier pour insérer un code répondant aux besoins.
Il faut donc rendre disponible les sources JQuery. On peut le faire directement dans la page ou encore les insérer au niveau de la page maître. Dans le second cas, cela rend les sources disponibles pour toutes les pages utilisant la page maître et c'est cette approche qui est normalement prise.
Donc alors il faut tout d'abord avoir un champ de type choix ou de type recherche dans la liste du calendrier. Il est à noter que la valeur "autre" doit être présente dans le jeu de donnée.
Par la suite, nous allons dans le calendrier insérer un champ de type texte en ligne simple pour recevoir le descriptif voulu. Nous appellerons ce champ "Autre xxx".

Suite à cette configuration, nous avons la possibilité d'emmagasiner l'information dans cette espace. Par contre, il ne réagit pas comme nous le souhaitons, en effet, nous ne voulons pas que ce champs pollue l'interface utilisateur lorsqu'il n'est pas requis.
C'est à ce moment là que nous insérons du code JavaScript dans les pages de formulaires pour la création et l'édition de l'item de calendrier.
Création
<script language="javascript" type="text/javascript"> var tagkey = "#ctl00_m_g_70adf3ac_2f4d_465c_a355_7860155b3bd0_ctl00_ctl04_ctl03_ctl00_ctl00_ctl04_ctl00_Lookup"; var tagkeyTexte = "#ctl00_m_g_70adf3ac_2f4d_465c_a355_7860155b3bd0_ctl00_ctl04_ctl04_ctl00_ctl00_ctl04_ctl00_ctl00_TextField";
$(tagkeyTexte).parent().parent().parent().attr("style","display:none;")
$(tagkey).change(function() { if ($(tagkey).val() == 5){ $(tagkeyTexte).parent().parent().parent().attr("style","display:block;"); } else{ $(tagkeyTexte).parent().parent().parent().attr("style","display:none;"); $(tagkeyTexte).val(""); } }); </script>
Explication:
- Nous avons en variable les id des contrôles HTML pour le champ de recherche et pour le champ texte.
- Le code cache le champ "Autre xxx" dès le début.
- Ajout un événement au changement sur le control du champ de recherche pour ajouter un style au tag HTML du champ texte dans le but de le montrer ou le cacher en fonction de la valeur du champ de recherche.
Édition
<script language="javascript" type="text/javascript"> var tagkey = "#ctl00_m_g_2dfa476a_0d41_4567_b244_55a759223532_ctl00_ctl04_ctl03_ctl00_ctl00_ctl04_ctl00_Lookup"; var tagkeyTexte = "#ctl00_m_g_2dfa476a_0d41_4567_b244_55a759223532_ctl00_ctl04_ctl04_ctl00_ctl00_ctl04_ctl00_ctl00_TextField";
$(document).ready(function() {
if ($(tagkey).val()!=5){ $(tagkeyTexte).parent().parent().parent().attr("style","display:none;"); }
$(tagkey).change(function() { if ($(tagkey).val() == 5){ $(tagkeyTexte).parent().parent().parent().attr("style","display:block;"); } else{ $(tagkeyTexte).parent().parent().parent().attr("style","display:none;"); } }); //});
});
</script>
Explication:
- Nous avons en variable les id des contrôles HTML pour le champ de recherche et pour le champ texte.
- Le code cache le champ "Autre xxx" dès le début SI la valeur du champ de recherche est "Autre".
- Ajout un événement au changement sur le control du champ de recherche pour ajouter un style au tag HTML du champ texte dans le but de le montrer ou le cacher en fonction de la valeur du champ de recherche.
Résultant


24/08/2010
Il y a un problème avec la navigation par rapport à l'onglet courant du "top link bar". Sous certaines conditions, la sélection de l'onglet ne se fait pas correctement et aucun onglet n'apparaît comme "sélectionné" même si nous nous trouvons dans un site apparaissant dans le "top link bar". Ce problème survient lorsqu'il y a des sites appartenants à différents niveaux (sites et sous-sites) qui apparaissent sur le même "top link bar".
On peut régler facilement ce problème de la façon suivante:
- Aller dans le site parent (ou le site duquel le "top link bar" des sous-sites héritent)
- Dans les site settings, clicker sur "top link bar" sous l'onglet "Navigation" afin d'accéder aux options
- Editer chaque lien afin que l'url respecte les règles suivantes:
- l'url doit se terminer par une page web (ex. default.aspx).
- l'url ne doit contenir aucun espace (même si on les remplacent par %20)
Si tous les liens respectent ces règles, les onglets courant devraient s'afficher correctement.
Situation
Lors d'un développement d'un site, une équipe de développement nous a proposé une approche pour le partage de connaissance basé sur des mini-clips qui représente une courte manipulation qu'un utilisateur serait appeler à poser dans un certain contexte.
Évidement la connaissance ne ce résume pas seulement au vidéo, mais elle est aussi accompagné par un titre et une description qui aide l'utilisateur à retrouver les informations à travers la recherche et somatisez le but de la vidéo.
Besoin
- Donc l'équipe en question à besoin de pouvoir créer une instance par vidéo, la vidéo n'étant pas obligatoire.
- Elle doit aussi pouvoir saisir de l'information titre et description sur l'instance créer.
- Les instances doivent être modifiables et effaçable.
Implantation
Pour être en mesure de répondre aux besoins de la situation, nous avons abordé une approche permettant l'utilisation minimaliste de l'implantation d'une liste SharePoint personnalisé.
Tout d'abord, nous avons suggérer l'utilisation de flash comme format de vidéo. Il offre un meilleur taux de compression et une méthode d'intégration plus propre. En effet, l'approche flash nous permet d'afficher une image par défaut. C'est une fonctionnalité qui n'apporte rien au niveau de la fonctionnalité, mais en revanche qui est beaucoup plus attrayant pour l'expérience utilisateur. Cette image est en dur dans le code.
Nous avons ajouté le champ de description pour avoir toutes les métadonnées.

Pour l'ajout de la vidéo, nous avons basé notre procédé sur la fonctionnalité d'attachement sur un item de liste.
Nous avons ajouté un code JavaScript directement dans la page DispForm pour recherche s’il y a une liste d'attachements dans la page courante, si non, un message s'affiche: ATTENTION NO ATTACHMENT FOUND
Dans le cas ou le code trouve une liste d'attachements, le code prendra le premier lien disponible. En effet il est important de savoir que la liste des attachements n'est pas en ordre de création, mais bien en ordre alphabétique.
Résultant

Code
<center> <div id="sortievideo" class="ms-formvalidation"></div> <embed type="application/x-shockwave-flash" id="player2" name="player2" src="/teams/8818-5/Home%20Ev.%20Support%20SAMMI/Automation/player.swf" width="400" height="315" allowscriptaccess="always" allowfullscreen="true" ></embed> </center> <script language="javascript" type="text/javascript"> var videofile =""; try{ videofile = $("#idAttachmentsTable > TBODY > TR > TD > SPAN > A").attr("href"); } catch(err){ alert(err); }
$(document).ready(function() {
if (videofile == undefined){ $("#sortievideo").append("ATTENTION NO ATTACHMENT FOUND"); } else { $("#player2").attr("flashvars","file="+videofile+"&image=/teams/8818-5/Home%20Ev.%20Support%20SAMMI/Automation/splash.png"); } }); </script>
13/08/2010
<script language="javascript" type="text/javascript" src=" http://----/Preuvesdeconcept/Script/jquery-1.4.2.min.js"></script> <script language="javascript" type="text/javascript" src=" http://----/Script/jquery.SPServices-0.5.4.min.js"></script> <script language="javascript" type="text/javascript" src=" http://----/Preuvesdeconcept/Script/GetFieldValue.js"></script> <script language="javascript" type="text/javascript"> //Le nom de deux deux button que l'on doit change d'action au clic pour valider le lookup, le nom du control loopup et son nom var strButtonsaveName = "#ctl00_m_g_28ce990c_e6d8_467a_80c5_4d50709e8e57_ctl00_toolBarTbl_RightRptControls_ctl00_ctl00_diidIOSaveItem"; var strButtonsaveName2 = "#ctl00_m_g_28ce990c_e6d8_467a_80c5_4d50709e8e57_ctl00_toolBarTbltop_RightRptControls_ctl01_ctl00_diidIOSaveItem"; var strLookupFieldName ="#ctl00_m_g_28ce990c_e6d8_467a_80c5_4d50709e8e57_ctl00_ctl04_ctl01_ctl00_ctl00_ctl04_ctl00_Lookup" ; var strFieldName = "REF"; $(document).ready(function(){ // on retire les dénénements par default en ajoutant une function jvascript $(strButtonsaveName).removeAttr("onclick"); $(strButtonsaveName).click(function(){IsRight();}); $(strButtonsaveName2).removeAttr("onclick"); $(strButtonsaveName2).click(function(){IsRight();}); // Dans le but de sélectionner notre item que l'on rajouter, il faut déselectionner celui présent. var strOriginalValue = $(strLookupFieldName).html(); strOriginalValue = strOriginalValue.replace("selected>",">"); //On reconstruit le control HTML $(strLookupFieldName).html("<option value='0' selected>Enter Text</option>" + strOriginalValue); }); function IsRight() { // alert('test'); //Si le champs lookup retourne différent d'un vide, il y a une selection if (getFieldValue("REF") != ""){ $("#errorCheck1").html(""); //On poursuit avec le code naturel de SharePoint if (!PreSaveItem()) return false; WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$m$g_28ce990c_e6d8_467a_80c5_4d50709e8e57$ctl00$toolBarTbltop$RightRptControls$ctl01$ctl00$diidIOSaveItem", "", true, "", "", false, true)); } else { //Dans le cas d'aucune sélection, il faut afficher un message d'erreur. if ($("#errorCheck1").html()== null){ $(strLookupFieldName).parent().parent().append("<SPAN id='errorCheck1' class='ms-formvalidation'>You must specify a value for this required field.<BR /></SPAN>"); } } } </script> 12/08/2010
Le champs titre dans une bibliothèque SharePoint a la propriété de ce syncroniser avec la métadonnée titre du fichier lorsque ce dernier est sous la famille Office. Bien entendu, ca marche pas avec pdf bien sûr.
C'est confirmer avec Office 2007 et je tenterai de valider l'information avec Office 2003.
`
À suivre....
En mandat, j'ai du traquer un problème d'affichage anglais et fancais, disons du franglais dans une même liste.
Le problème était lier à mon fichier de schema de ma définition de liste que j'associais à un site à travaers un simple feature, vanille par déclaration de fichier xml. En fait dans ce fichier, que j'avais basé sur un fichier existant anglais et j'avais omis une section ou deux.
Nous devions donc corriger la situation, très simple, on modifie la solution d'origine pour être en mesure de corriger tout futur problème, on retract, on delete, on add, on deploy et enfin on syncronise les serveurs frontaux. Mais voilà que les listes ont été popullées et le client tient mordicus à ne rien perdre.
Mais en effectuant les manipulations décrite plus haut, je me suis rendu compte que la tite boîte noir SharePoint fessait de la magie en cet instant. En effet il corrige la liste tout seul au premier appel de cette liste. Comment, pourquoi .... j'aimerais bien savoir, ma décompiler sharepoint ..... bah j'ai des enfants pour m'occuper la nuit ces temps-ci lol.
|
|
|
|
|