tag:blogger.com,1999:blog-110523182024-02-28T05:54:20.195+01:00Tom's Tech-BlogMon blog technique : avis perso et réservoir de liens... Sur SharePoint, .NET, SQL Server et tout le reste :)Thomas MERLYhttp://www.blogger.com/profile/03321069433241571560noreply@blogger.comBlogger33125tag:blogger.com,1999:blog-11052318.post-17954707357021005602019-08-05T16:35:00.000+02:002019-08-05T16:43:22.982+02:00Python dans Power BI, pourquoi faire ?<div style="margin-right: 1em; margin-bottom: 1em;">
<div class="separator" style="text-align: center; clear: both;">
<a style="clear: left; margin-right: 1em; margin-bottom: 1em; float: left;" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3idQVb9_iGXzlMkifzzfjF04Ov_bIhchDhcAkkrwoDjZQCofUc8UKdlFWsrdyOkdceJTN0pUf_5hxTyXCvtfdlIipzps9P8FTTJex0z7I1zgtXC0CPgoZ9NFnAmYWB92S703r/s1600/Capture_20190805_121505_001.png" imageanchor="1"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3idQVb9_iGXzlMkifzzfjF04Ov_bIhchDhcAkkrwoDjZQCofUc8UKdlFWsrdyOkdceJTN0pUf_5hxTyXCvtfdlIipzps9P8FTTJex0z7I1zgtXC0CPgoZ9NFnAmYWB92S703r/s1600/Capture_20190805_121505_001.png" border="0" data-original-width="176" data-original-height="174"></a></div>
L'ajout du visuel Python dans Power BI date de quelques mois déjà... Je vous propose un cas concret justifiant d'y passer quelques heures.</div>
<br>
On peut effectivement se poser la question de la pertinence de ces visuels tant les possibilités en termes de traitement (Power Query) et restitution ont drastiquement évolué sur les dernières versions de Power BI. Alors je vous propose un cas concret pour résoudre en quelques heures une problématique qui nécessiterait autrement le développement d'un visuel spécifique.<br>
<br>
<h3>
La problématique</h3>
<br>
Il est facile de créer un histogramme dont la couleur des barres est soumise à un affichage conditionnel. C'est en revanche impossible à partir du moment où plusieurs séries sont présentes.<br>
<div class="separator" style="text-align: center; clear: both;">
<a style="clear: left; margin-right: 1em; margin-bottom: 1em; float: left;" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMlfKO_sZVYS-gsPfsbKhrkZix79bQzGjq9-yHNv6w4D-WrZqvDd9EfZMu7UWAhR5PtFOESODX9OzhthmYKlqeAVSOhjn9-ztseraTsy8CZcYkYmyURMWjh82ZMxL4JhuKiuBJ/s1600/Capture_20190805_152941_001.png" imageanchor="1"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMlfKO_sZVYS-gsPfsbKhrkZix79bQzGjq9-yHNv6w4D-WrZqvDd9EfZMu7UWAhR5PtFOESODX9OzhthmYKlqeAVSOhjn9-ztseraTsy8CZcYkYmyURMWjh82ZMxL4JhuKiuBJ/s1600/Capture_20190805_152941_001.png" border="0" data-original-width="187" data-original-height="220"></a><a style="clear: right; margin-bottom: 1em; margin-left: 1em; float: right;" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYjOMj58cR0qY-UQ00YzfCanmQIriWL-FyD8iXrTy9JAh3tkZTmJtSXtCux9knO5BOziOcLA-g3W5Gz9862VeHH0xPf0rxR8wCK23o42ygUoL63rpvn_0Tp2lwOP46I6eaM_FX/s1600/Capture_20190805_153014_001.png" imageanchor="1"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYjOMj58cR0qY-UQ00YzfCanmQIriWL-FyD8iXrTy9JAh3tkZTmJtSXtCux9knO5BOziOcLA-g3W5Gz9862VeHH0xPf0rxR8wCK23o42ygUoL63rpvn_0Tp2lwOP46I6eaM_FX/s1600/Capture_20190805_153014_001.png" border="0" data-original-width="267" data-original-height="188"></a></div>
<div class="separator" style="text-align: center; clear: both;">
</div>
<h3>
La solution</h3>
Dans ce cas, l'utilisation du visuel Python permet d'obtenir le résultat attendu :<br>
<br>
Préalablement, il est bien entendu indispensable d'avoir installé Python et d'activer les scripts dans les options. Pour déployer matplotlib : <br>
<div id="codecell0">
<span style="font-family: "courier new" , "courier" , monospace; font-size: small;"><font style="background-color: rgb(204, 204, 204);"><span class="n">pip</span> <span class="n">install</span> <span class="o">-</span><span class="n">U</span> <span class="n">matplotlib</span></font></span></div>
<div style="color: black; line-height: 18px; font-weight: normal; white-space: pre; background-color: rgb(255, 255, 254);">
<div>
Une fois l'environnement prêt, il est temps de configurer le visuel.<br>
Importer le module : <br>
<span style="font-size: small;"><span style="font-family: "courier new" , "courier" , monospace;"><font style="background-color: rgb(204, 204, 204);">from pylab import *</font></span></span><br>
Créer la fonction permettant de déterminer la couleur de la barre d'histogramme :<span style="font-size: small;"><span style="font-family: "courier new" , "courier" , monospace;"> </span></span><br>
<span style="font-size: small;"><span style="font-family: "courier new" , "courier" , monospace;"><font style="background-color: rgb(204, 204, 204);">def getcolor(data, typecode, mini, maxi):<br> if typecode == "c":<br> return (0.9 * ((maxi - data)/(maxi - mini)), 0.8, 0.3 * ((maxi - data)/(maxi - mini)))<br> elif typecode == "d":<br> return (0.75 * ((maxi - data)/(maxi - mini)), 0.75 * ((maxi - data)/(maxi - mini)), 0.8)<br> else:<br> return (0.8, 0.75 * ((maxi - data)/(maxi - mini)), 0.75 * ((maxi - data)/(maxi - mini)))</font><br> </span></span><br>
Gérer les données. Première série, avec affectation de la couleur <i>via</i> la fonction :<span style="font-size: small;"><span style="font-family: "courier new" , "courier" , monospace;"> </span></span></div>
</div>
<div style="color: black; line-height: 18px; font-weight: normal; white-space: pre; background-color: rgb(255, 255, 254);">
<font style="background-color: rgb(204, 204, 204);"><span style="font-size: small;"><span style="font-family: "courier new" , "courier" , monospace;">groupedSet = dataset.where(dataset.Yogurt == "Chobani Total").groupby("Date").Prix.sum()<br>colorSet = [getcolor(data, "c", groupedSet.min(), groupedSet.max()) for data in groupedSet]<br>plt.bar(groupedSet.index, groupedSet, color = colorSet)</span></span><br></font>
<span style="font-size: small;"><span style="font-family: "courier new" , "courier" , monospace;"></span></span><br>
Seconde série, avec l'attribut <span style="font-family: "courier new" , "courier" , monospace;">bottom </span>permettant de gérer l'empilement :<span style="font-size: small;"><span style="font-family: "courier new" , "courier" , monospace;"> </span></span><br>
<span style="font-size: small;"><span style="font-family: "courier new" , "courier" , monospace;"><font style="background-color: rgb(204, 204, 204);">groupedSetAlt = dataset.where(dataset.Yogurt == "Danone Total").groupby("Date").Prix.sum()<br>colorSet = [getcolor(data, "d", groupedSetAlt.min(), groupedSetAlt.max()) for data in groupedSetAlt]<br>plt.bar(groupedSetAlt.index, groupedSetAlt, color = colorSet, bottom = groupedSet)</font></span></span><br>
<span style="font-size: small;"><span style="font-family: "courier new" , "courier" , monospace;"></span></span><br>
Gestion de l'axe des abscisses :<span style="font-size: small;"><span style="font-family: "courier new" , "courier" , monospace;"> </span></span><br>
<span style="font-size: small;"><span style="font-family: "courier new" , "courier" , monospace;"><font style="background-color: rgb(204, 204, 204);">plt.xticks(groupedSet.index[::4], [i[0:4]+"-"+i[5:7]+"-"+i[8:10] for i in groupedSet.index[::4]])</font><br> </span></span><br>
Et affichage :<span style="font-size: small;"><span style="font-family: "courier new" , "courier" , monospace;"> </span></span></div>
<div style="color: black; line-height: 18px; font-weight: normal; white-space: pre; background-color: rgb(255, 255, 254);">
<span style="font-size: small;"><span style="font-family: "courier new" , "courier" , monospace;"><font style="background-color: rgb(204, 204, 204);">plt.show()</font></span></span></div>
Et voilà !<br>
<div class="separator" style="text-align: center; clear: both;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDCac2-JCkdErCIvNsm7W8VIF_DG0jepjSK6MltPO4pvWx0jso0XBeovF184sgCmTodbfKy7D9DXLPqE6OtS_poXtXw27LtQDjNjfiXspcd2hWqqasBzA3srxDq-1sjc6lzSST/s1600/Capture_20190805_155849_001.png" imageanchor="1"><img width="100%" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDCac2-JCkdErCIvNsm7W8VIF_DG0jepjSK6MltPO4pvWx0jso0XBeovF184sgCmTodbfKy7D9DXLPqE6OtS_poXtXw27LtQDjNjfiXspcd2hWqqasBzA3srxDq-1sjc6lzSST/s640/Capture_20190805_155849_001.png" border="0" data-original-width="1068" data-original-height="339"></a></div>
<br>
J'ai évidemment simplifié mon code pour ne gérer que ces 2 séries avec un filtrage "en dur", libre à vous d'imbriquer une boucle pour traiter un nombre variable de séries...<br>
<div style="color: black; line-height: 18px; font-weight: normal; white-space: pre; background-color: rgb(255, 255, 254);">
</div>Thomas MERLYhttp://www.blogger.com/profile/03321069433241571560noreply@blogger.com0tag:blogger.com,1999:blog-11052318.post-37333466537087663452016-02-04T10:14:00.001+01:002016-02-04T14:58:13.957+01:00Perdus / Trouvés – Les chemins et URL SharePoint 2013<p>Encore un post à propos des trucs que je cherche souvent… Je l’agrémenterai au fur et à mesure…</p> <h3>Chemins</h3> <p>Suivi de synchro FIM : C:\Program Files\Microsoft Office Servers\15.0\Synchronization Service\UIShell\miisclient.exe</p> <h3>URL</h3> <p>/_layouts/viewlsts.aspx –> Tout le contenu du site. <p>/_layouts/settings.aspx –> Paramètres du site <p>/_layouts/searchresults.aspx?k=Truc –> Recherche <p>/_layouts/closeConnection.aspx?loginasanotheruser=true –> Se connecter en tant que…</p> <p>/_layouts/savetmpl.aspx –> Sauvegarder le site en tant que Template (utile après avoir activé l’infrastructure de publication)</p> <p>/_layouts/ChangeSiteMasterPage.aspx –> Accès aux pages maitres et à l’alternate CSS.</p>Thomas MERLYhttp://www.blogger.com/profile/03321069433241571560noreply@blogger.com0tag:blogger.com,1999:blog-11052318.post-72246452274933023562016-01-04T11:08:00.001+01:002016-01-04T11:08:48.835+01:00SharePoint Online - 404 Not Found - https://static.sharepointonline.com/…<span style="font-family: inherit;">Ô rage ! Ô désespoir ! Ô vieillesse ennemie… Après des heures de combat
acharné, impossible de faire fonctionner ce satané JSLink dans SharePoint
Online. Il est pourtant vérifié (16 fois, on n’est jamais trop prudent), relu,
testé, réduit à sa portion congrue… Fi, la console continue de cracher son
sibyllin message :</span><br />
<span style="font-family: inherit;"><span style="background-color: #cccccc; color: red;">404 Not
Found - https://static.sharepointonline.com/bld/_layouts/15/ 16.0.4719.1219/
<ici adresse="" au="" du="" fichier="" l="" relatif="" tenant.=""></ici></span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjn5tMnusisLGWmzC1bNM_1N6ngUREhrNetNrlXS72mbo6VFCdw2SIlqklNNCLWb7X9GGygxKdw475JKn0LkFthw0C3_nssHTJv6zyc-Fk6REkYqOGlAIF2O2uEiPdTTo4ueOAt/s1600/Capture_20151218_110849.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="48" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjn5tMnusisLGWmzC1bNM_1N6ngUREhrNetNrlXS72mbo6VFCdw2SIlqklNNCLWb7X9GGygxKdw475JKn0LkFthw0C3_nssHTJv6zyc-Fk6REkYqOGlAIF2O2uEiPdTTo4ueOAt/s640/Capture_20151218_110849.png" width="640" /></a></div>
Toutes les combinaisons de chemin relatif y passent : silence radio. Dès que
l’URL complète du fichier est fournie… Saccage du moteur qui tente de le
récupérer dans les ressources serveur, sans succès évidemment.<br />
Et si ? Oui ! La solution est d’utiliser l’alias de la collection de sites
:<br />
<span style="font-family: inherit;"><strong><span style="background-color: black; color: white;">~sitecollection/…/MonFichier.js</span></strong></span><br />
Et paf ! Ca fait ce qui est attendu ! (En l’occurrence ici, un champ
Chocapic).Thomas MERLYhttp://www.blogger.com/profile/03321069433241571560noreply@blogger.com0tag:blogger.com,1999:blog-11052318.post-20428541801171888432015-09-02T20:46:00.001+02:002015-09-08T21:44:09.497+02:00Helper – Loopback checkParce qu’on en a besoin pour les serveurs de dev, de prod, de tout, le paramétrage du loopback check est un incontournable.<br />
<h3>
Serveur de DEV</h3>
On désactive directement en PowerShell :<br />
<pre><b><span style="background-color: #333333; color: white;">New-ItemProperty HKLM:\System\CurrentControlSet\Control\Lsa</span></b></pre>
<pre><b><span style="background-color: #333333; color: white;"> -Name "DisableLoopbackCheck" -value "1" -PropertyType dword</span></b></pre>
<br />
<h3>
Serveur de PROD</h3>
<br />
A venir…Thomas MERLYhttp://www.blogger.com/profile/03321069433241571560noreply@blogger.com0tag:blogger.com,1999:blog-11052318.post-73625189948825045432015-07-16T15:46:00.001+02:002015-07-16T15:46:56.443+02:00Visual Studio–Expressions régulières<p>Plus pour moi-même, pour rappeler un groupe de capture dans la recherche avec Expressions Régulières de Visual Studio, c’est $1… qu’il faut utiliser. Là où les expressions typées Unix utiliseront le <em>backslash</em>.</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjj_hNCNW8VD2PRUVa0OKcWpHaMvixweQB7CN38qM-BSQNiZ6zmhGSKRNEaZAzCkH8ifM0Xw6bfVA-hBZdSGIlndSRW7jqYrF51e1AoYqMHaP9rgEY7ZYKsguq48lmOEg7u0DBv/s1600-h/image%25255B2%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2ycs5yypI5z-lWz6lLY4RXpCyBSJp0_MIqutoQhtDaSxMJxR_y1JzVj9T-X8Zpth2JM29gWm22nGslVzsdLmDxxP8-ujOKNdSc4cqlqOw2nj55Ic7BIsAnKLJDcyhkj2FcAED/?imgmax=800" width="244" height="71"></a></p> Thomas MERLYhttp://www.blogger.com/profile/03321069433241571560noreply@blogger.com0tag:blogger.com,1999:blog-11052318.post-78642268898638909882015-05-02T14:05:00.001+02:002015-05-02T14:05:13.046+02:00Analytics avec SharePoint 2013 – La fin des souffrances ?<p>Si vous avez comme moi des clients SharePoint 2013 dans le marketing et la communication (interne ou externe)… Vous avez forcément subi les foudres des décideurs lorsque vous avez présenté l’état des lieux des solutions de statistiques de consultation, avec insulte compte triple si vos interlocuteurs étaient aguerris à SharePoint 2010 ou 2007.</p> <blockquote> <p><em>Analytics n’existe pas sous SharePoint 2013 ? Mais ils étaient presque corrects sous 2010 !</em></p> <p><em>Ces 2 excels ne me suffisent pas !</em></p> <p><em>Même google le fait gratuitement !</em> (Là-dessus, nonobstant la qualité des productions de Mountain View, j’aurais je l’espère l’occasion de revenir sur leur “gratuité” et leur “perfection”)</p></blockquote> <p>Et bien, vous voici avec une carte “cloud” à jouer, une pierre, deux coups : Préparez le terrain de l’hybride ou consolidez un abonnement existant en utilisant la brique Azure “Application Insights” dans vos pages maitres SharePoint : </p> <p><a title="http://azure.microsoft.com/blog/2015/04/22/understand-your-sharepoint-usage-with-application-insights-2/" href="http://azure.microsoft.com/blog/2015/04/22/understand-your-sharepoint-usage-with-application-insights-2/">http://azure.microsoft.com/blog/2015/04/22/understand-your-sharepoint-usage-with-application-insights-2/</a></p> Thomas MERLYhttp://www.blogger.com/profile/03321069433241571560noreply@blogger.com0tag:blogger.com,1999:blog-11052318.post-3743378997866938022015-03-13T16:06:00.001+01:002015-03-13T16:06:42.121+01:00SharePoint - La recherche d’utilisateurs est toujours infructueuse<p>Votre recherche est fonctionnelle pour tous vos documents, vidéos et autres contenus… Mais d’utilisateurs point ! Votre belle démonstration d’annuaire basé sur la recherche tombe allo (Annuaire, allo… désolé.)</p> <p>Vérifiez donc votre <em>crawl log. </em>Il peut contenir l’erreur suivante sur le STS :</p> <blockquote> <p><font style="background-color: #000000" color="#ffffff" face="Consolas"><strong>Error in the Microsoft SharePoint Server People Protocol Handler. ( Object reference not set to an instance of an object.; SearchID = F9CC7134-A517-4E17-A81A-7419B5572B6D )</strong></font></p></blockquote> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2skDtaalzcyz-K-WWew30clbKCuBYJ2o27XmJKH9OzIfGMkm1qJ8tBgNKY9arYsLniRV4zDabf2pNCQee71-LufnzybHmhyphenhyphenYTO5Wq2e6olvpTWyRaNoRz8l7Musklemcrro-Y/?imgmax=800"><img title="Capture_20150313_143013" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="Capture_20150313_143013" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7GMQjozYS9pTG71_NwMrBs8Rj65W0CWS3YSjcabHbmMUx4o64Ucrv-yaleQLW5FCbnQlVKZjR0BFAaZ_pHo5GUr7Zhcra6TQ_-mug9hbUtPJK84VnxVGc0bxjio-J5kgoCrcV/?imgmax=800" width="554" height="211"></a></p> <p>Dans ce cas, vérifiez qu’une collection de sites racine existe à la base de votre application web. Dans mon cas, il y avait les collections de sites : <a href="http://devXXX.tomain.fr/sites/Coll1">http://devXXX.tomain.fr/sites/Coll1</a> et <a href="http://devXXX.tomain.fr/sites/Coll2">http://devXXX.tomain.fr/sites/Coll2</a>. En ajoutant la collection <a href="http://devXXX.tomain.fr/">http://devXXX.tomain.fr/</a> (un team site sans contenu ni droit), puis en lançant un nouveau crawl, mes utilisateurs sont désormais disponibles dans la recherche !</p> Thomas MERLYhttp://www.blogger.com/profile/03321069433241571560noreply@blogger.com0tag:blogger.com,1999:blog-11052318.post-15180995911370015902015-03-13T11:57:00.001+01:002015-03-13T11:57:28.847+01:00La recherche dans “ce site” ne renvoie rien alors que la recherche globale fonctionne…<p>Après vos jonglages sur cette GED intranet, paramétrage aux petits oignons des AAM et une mise en prod de haut vol, impossible de retrouver un quelconque document depuis la boite de recherche “ce site” / “this site” du coin supérieur droit de vos pages… Et pourtant, en étendant la recherche ou en recherchant dans “tout” / “All”, avec les mêmes critères, des documents apparaissent !</p> <p>Quelle que soit votre version de SharePoint, cet article est en effet toujours valable : <a title="http://support.microsoft.com/fr-fr/kb/2000365" href="http://support.microsoft.com/fr-fr/kb/2000365">http://support.microsoft.com/fr-fr/kb/2000365</a> : La recherche “this site” ne retourne rien si le chemin crawlé n’est pas celui “Par défaut” de vos AAM. Une simple permutation à chaud des mappages et tout rentre dans l’ordre.</p> Thomas MERLYhttp://www.blogger.com/profile/03321069433241571560noreply@blogger.com0tag:blogger.com,1999:blog-11052318.post-67409865536678864682015-03-10T15:47:00.001+01:002015-03-25T22:26:01.480+01:00SharePoint dans Azure–Paramétrer son DNS / son ADAprès avoir déployé votre ferme SharePoint dans Azure avec l’assistant, vous voici bien perdu sur le contrôleur de domaine : De console de paramétrage de DNS point, alors que vous êtes admin… Palsambleu !<br>Tenter de l’activer <i>via</i> l’ajout de <i>features</i> ne vous mènera pas très loin… Mais la piste du salut débute bien là.<br>Ouvrez une invite de commandes en tant qu’administrateur et entrez cette instruction :<br> <blockquote><span style="font-size: x-small; font-family: consolas; color: white; background-color: black"><b><font size="2">dism /online /Enable-Feature /FeatureName:dns-server-tools</font></b></span></blockquote>Et PAF, voici votre console ! (Merci Sylvain, pour la commande :) )<br><br><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyLpLKAh-nHtRQq3hwI8mNrpLhVQ_0T22_G92zePQnjWc3Q1OkcRb-622Xo3a0BwR8JsCJwewyFTVglA_7x3p8OvX301pIjdM3nMCOi7J5kEOqi0OHSEV-SvoiVOTdgOG6ZdXL/s1600-h/Capture_20150310_153629%25255B8%25255D.png"><img title="Capture_20150310_153629" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="Capture_20150310_153629" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlF3ysi5d5kVu0WosD6PEAIDLTUI7V9TAHPkazlxshZspac1OXjaFiB8jA_jFwzeYdsMBeH4NqNVmOx0gg2araV9Ba85EFcwS2lcjeLuCph12AgGeoILrE-HIHkb-iEduEr34o/?imgmax=800" width="554" height="389"> </a><br><br>Et pour l'annuaire :<br> <blockquote class="tr_bq"><span style="font-family: "Trebuchet MS",sans-serif"><span style="background-color: black"><span style="color: white"><b><span style="font-size: x-small; font-family: consolas; color: white; background-color: black"><b><font size="2">dism /online /Enable-Feature /FeatureName:RSAT-ADDS-Tools-Feature</font></b></span></b></span></span></span></blockquote> <blockquote> <p><span style="font-size: x-small; font-family: consolas; color: white; background-color: black"><b><font size="2">dism /online /Enable-Feature /FeatureName:DirectoryServices-DomainController-Tools</font></b></span></p></blockquote> Thomas MERLYhttp://www.blogger.com/profile/03321069433241571560noreply@blogger.com0tag:blogger.com,1999:blog-11052318.post-18501165049550020342014-12-27T15:23:00.001+01:002014-12-27T15:24:09.339+01:00Perdus / Trouvés – Les chemins et URL SharePoint 2013<p>Encore un post à propos des trucs que je cherche souvent… Je l’agrémenterai au fur et à mesure…</p> <h3>Chemins</h3> <p>Suivi de synchro FIM : C:\Program Files\Microsoft Office Servers\15.0\Synchronization Service\UIShell\miisclient.exe</p> <h3>URL</h3> <p>/_layouts/viewlsts.aspx –> Tout le contenu du site. <p>/_layouts/settings.aspx –> Paramètres du site <p>/_layouts/searchresults.aspx?k=Truc –> Recherche <p>/_layouts/closeConnection.aspx?loginasanotheruser=true –> Se connecter en tant que…</p> Thomas MERLYhttp://www.blogger.com/profile/03321069433241571560noreply@blogger.com0tag:blogger.com,1999:blog-11052318.post-41240352409123764622014-12-23T15:20:00.001+01:002014-12-23T15:39:02.089+01:00Accès anonyme sous SharePoint 2013 – Accéder aux listesVous avez activé l’accès anonyme à la Web App et à tout le site, malheureusement, impossible pour un utilisateur non authentifié d’accéder à une simple bibliothèque de documents alors même que la page d’accueil du site est parfaitement fonctionnelle…<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFnl_nd-eWiB8ZKPyDCRt8QcM1kk7xhvYe7de-oXuVFpg1JOY10lIz7RFza5Eh0hMaWrUtBDF8yVjF-bAGdao7_YH_jJ0F96phfoEQ0aVMGNBc_iCMMqhkxF06moJmpjNMLrJ8/s1600-h/Capture20141223_144306%25255B2%25255D.png"><img alt="Capture20141223_144306" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQmM3mokkUHgU76JdokYGWPG1rJxwRY3dEMDebJK7UYV_MeP5vxd1HE-gK89enrU4N9ulqyidhyQQ2ENXFoT4K4_T9-XpMa08O8tIO6AHB0YA33b0ntTe7rQitoEt-SxLxx9py/?imgmax=800" height="81" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Capture20141223_144306" width="244" /></a><br />
Il vous manque une information, surtout si vous venez du monde SharePoint 2010 : une fonctionnalité de collection de sites désormais activée par activée par défaut est la source de vos malheurs : le verrouillage de l’accès aux formulaires pour les lecteurs restreints !<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlMq9GSq3VJyDEQKP11k012PkYfBxG9W9Ad99GUAWe8yedfiwLcwmbBIWfSgFucsHrcORwpn8AC__Z9ItaMmstT-UfDYnbl2DcxMyQzssN91nS1Dn3W5PgmhoAwFUzEoj3nfnM/s1600-h/Capture20141223_144622%25255B6%25255D.png"><img alt="Capture20141223_144622" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfJxIePd3PrE6u5TZrFmNRg74GaVyXyb6jD-A76Icebn23fvrDYfOqVPsFUhAuWnCzLndDI3U6QC2ukgRBeKitwWYJjIQFOXr8WK5-0U-lgfZGskeGlHKQRs5Sngnd0Ujpqa9s/?imgmax=800" height="32" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Capture20141223_144622" width="644" /></a><br />
Si vous désactivez cette fonctionnalité, vos lecteurs anonymes auront de nouveau accès aux listes et bibliothèques… Mais également à la page “tout le contenu du site” et d’autres formulaires qu’on aimerait pouvoir cacher ! Alors, il nous faut changer les usages. Conservons la fonctionnalité sécuritaire activée et tentons quelques manœuvres.<br />
<h3>
Concevoir un portail pour l’accès anonyme</h3>
Nos pistes sont les suivantes : Les listes et bibliothèques sont inaccessibles sans fournir une identité valide (Et le log IIS présente la 401 sur la page aspx de l’affichage concerné) mais la page d’accueil du site l’est, même si elle n’affiche pas les liens vers les-dites listes. Testons les éléments suivants :<br />
<ul>
<li>Utilisation d’un lien direct vers un document d’une bibliothèque (sur laquelle les utilisateurs anonymes ont des droits de lecture restreinte) : OK, ça fonctionne</li>
<li>Accès à un affichage de liste / bibliothèque : Impossible</li>
<li>Affichage d’une page de site : OK</li>
<li>Affichage d’une page de site contenant un lien vers un doc de liste ou une webpart d’affichage de liste : OK !</li>
</ul>
Donc on va favoriser des scénarios de restitution par page de site.<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_jXlUEDaA59seTPAqY8MN6o-CfvTHONkXco5v6Zvvh2nu9CvahhL7XIm1mtL5pCALXwl1mk16NBL5Y4ThCcv7Tov12lRCx0VCsAJ86qpV2td3oQVtaW6b1zdteWDJIMFwz9-6/s1600-h/image%25255B3%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYEmjMaU3IXRWzIjhxBAjEHakSKXNneYcWgOCVC6f5B2XoNy3jDG-c7_XeRMFNa-uAVk7JZJGVkCYYUGuk_D0FVODHBb2cnya-t85-G54tMM2FTV67LgoFctEX6uVDpBzjD6qb/?imgmax=800" height="264" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="644" /></a><br />
Préparons une page de site présentant simplement une vue d’une liste : Nous avons notre affichage de liste. En plus, on bénéficie du contrôle fin des affichages car l’utilisateur anonyme ne peut voir que ceux que nous lui mettons à disposition.<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMlP-1MOOa7bqotwuxGBQ-byO8Law4NoPpTGdS5ZETdKJOQcSMPPovNwIRAQhMk68HGJ8fa_PhEzG8gQrRnRFDhD6rZ8U8clMhT6Y2YkmMoU85voKTKVCnVYkcy8fCpS9NuVBi/s1600-h/image%25255B7%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJpamQXNDdW2ml28gl-Ibyp99gV-2YGP4UsqwFAnOEy5le1RXwdA95RbWK5NFTQJTMjrUNwjzMx4DzgtSkJHXvBMl-CCh4vhvLINXSy15LU_sGC_GzIDFIwpy6e3nzHzyxhjzt/?imgmax=800" height="204" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="644" /></a><br />
Préparons ensuite nos pages de contenu. Comme ici, ma page d’accueil, avec des voues vers des listes et bibliothèques, du contenu, des liens… (Remarquez que le menu de gauche présente pour un utilisateur authentifié des listes et bibliothèques du site) L’utilisateur anonyme dispose d’un rendu correct :<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzvUiV7wVOcnp7rbBXSDEDJoMV50avETV0GNAt4ZrZneq8PMw2k6vJ7F9i1FEcm1ZQIs-B9x8RCryYhFhADnvTKckPsW6b4nX1XOBQf7OgIOmBSm226UG3p0zjV5ZUZOEq5LsW/s1600-h/image%25255B11%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBLFMJgdt5YGiODrO7EfH44NPvvpD2HRs8MhssZ9cPOfYkifTDy40EXyIWKgH06ThKsfs5t8IaTvGT2P8rIeI4-Sll03IlkpUv5JbBfRzyPUuOZZ0n78MMD5YRaCtLWp1wc_Kr/?imgmax=800" height="180" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="644" /></a><br />
Et bien sûr, il ne peut pas accéder aux autre affichages des listes rendues dans la page :<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoafUQOdhEr_ODTtSUAJO1XQf9UDDi7iKtI-HrIdq8V1xrkRDY7ZqhGt7DHYI9gAXFVkpep4r4dgiquel0_-l9NW_vsRyDSDdeGIXOrtqU7GUUfVGobJk4UZeIiDpRQvYxRnwb/s1600-h/image%25255B16%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVKj6a5OtxaAIsVjeG7Fenhmz7PquGj0IOSO_5UL_rQSVbpDc9X7DSuFYd-occiXB2OD-jYsOdPzQdWo-FL0b0o2wYxzly2DFt406APg50W0shSPFiHXVNuBtaL-mNEfE2ChEO/?imgmax=800" height="303" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="504" /></a><br />
<h3>
En conclusion</h3>
A l’instar d’un site de publication, favorisez le rendu par pages et non par menus et listes pour les sites à vocation d’accès anonyme !Thomas MERLYhttp://www.blogger.com/profile/03321069433241571560noreply@blogger.com0tag:blogger.com,1999:blog-11052318.post-5692927176762868352014-10-17T08:58:00.001+02:002014-10-17T09:01:10.160+02:00SQL Server 2008 R2–Report Builder n’aime pas monter du SP2 vers le SP3…<p>Il est possible que votre Report Builder n’apprécie pas votre mise à jour. Si c’est le cas, vous pouvez désinstaller vos SP 3 et 2 puis réinstaller le SP3 directement sur votre partie serveur. Sinon, une réinstallation des systèmes Client est possible.</p> <p>Les détails : <a title="http://blogs.msdn.com/b/sqlreleaseservices/archive/2014/10/16/report-builder-of-sql-server-2008-r2-service-pack-3-does-not-launch.aspx" href="http://blogs.msdn.com/b/sqlreleaseservices/archive/2014/10/16/report-builder-of-sql-server-2008-r2-service-pack-3-does-not-launch.aspx">http://blogs.msdn.com/b/sqlreleaseservices/archive/2014/10/16/report-builder-of-sql-server-2008-r2-service-pack-3-does-not-launch.aspx</a></p> Thomas MERLYhttp://www.blogger.com/profile/03321069433241571560noreply@blogger.com0tag:blogger.com,1999:blog-11052318.post-73348806259752359502013-07-11T15:05:00.001+02:002013-07-11T15:05:06.004+02:00Les Display Templates par le menu… (1/2)<p>Ca fait un bout de temps que je n’ai pas publié. Réparons l’outrage. Aujourd’hui, on se coltine les Display Templates. Une nouveauté introduite par SharePoint 2013 d’importance proportionnelle au carré du nombre de XSL que vous avez debuggé pour vos <em>Content Query WebParts.</em></p> <p>Là vous me dites “T’es bien intéressant Merly avec tes circonvolutions lexicales mais on vient ici pour du code, pas pour les belles lettres”… Je vous comprends, mais je pense que vous manquez quelque chose <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Clignement d'œil" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnSD6w9ivkOTyLDfro1iZTxa_qcitx0MZ5z22Iw7Qxal4fky31iSsQWqeHt_1xU_jQ1uVyWqYEdZZjZdSQVvcSH5auuuxZR2LO80iHsDZ4BBZanzc4iBpZzSPJUitL3F_VD2tZ/?imgmax=800">Bref :</p> <h3>Les display templates, qu’est-ce donc ?</h3> <p>Il s’agit de modules de rendu d’items en JavaScript (et HTML / CSS) permettant une restitution des éléments issus des modules de recherche : Content Search Web Parts, Filtres et affineurs ainsi que la restitution de la recherche : par exemple les résultats, les extraits au survol…</p> <p>On les trouve dans le catalogue des master pages. Donc soit dans les paramètres de site, soit avec SharePoint Designer :</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbpAdO6QlbL3eYNHPqPZnCuLANIM2H-sAgEUjAyol6L0Rp9Zw2ZPKC2IFZEq98Z3JJKQfUdf2ZOOBoYL1Lj31UWRjn83k919J5Z36isNpO0IDZprf_9sBXP6AWMW3cfLDyQxmG/s1600-h/image3.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; display: block; padding-right: 0px; border-top-width: 0px; margin-right: auto" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTZzKBe2BhVcD2g34n7zKn8ZYAw8beSLTkT42UJp4Ox2rjKabv2MDqhD39QVn3e-8hRcThP8NhNVO8tfjDK548ibaPDvL0Hu0ToIn59j3NaYxMmdORdqgZmhuAjFZ9k6gMboS7/?imgmax=800" width="363" height="203"></a></p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm4BysCLp0vTm3ozUNhmY0FPXlTt23HRxhyj2_LtBdwsxugh66HSvdwxYdw8KHwsGuK_YUBJBB8pCUQagGYgI12HJtC29J6K0vnxQ0MesYkxMuYmzRCGPV5fIzFObcq8HHu6M3/s1600-h/image7.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; display: block; padding-right: 0px; border-top-width: 0px; margin-right: auto" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_ZDMUkaYF7yWE8AxyWMGy5hGnN3IlwhLOD5sCL4wkLHIQrsLMyaJRz4LhVb4RNIatUiBt2GQiEb9XKZ7o1mjGjDDyGFVXqxwiqJtypzYBQqHZqJX-WcA_jq_qzuBsCkIzOIlU/?imgmax=800" width="558" height="219"></a></p> <p>Note : Dans SharePoint Designer, utilisez la rubrique “All Files” plutôt que “Master Pages” car le filtrage d’affichage de celui-ci ne vous permettra pas de voir les fichiers js.</p> <p>La description de tous les templates fournis se trouve sur Technet : <a href="http://technet.microsoft.com/fr-fr/library/jj944947.aspx">http://technet.microsoft.com/fr-fr/library/jj944947.aspx</a></p> <h4>Utilisation des display templates</h4> <p>Les display templates sont affectés soit par paramétrage des webparts, soit par association à des Result Types . Ici, l’exemple d’une Content Search WebPart :</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSBjBqsAcvYPZuaKixn3iiZmkaWsfUI258Oa51PYpfsEX8RNIMrDtfgYa9MZCQNCQ-MxH1wJqqQONxBg1GeA4KGD6163FImEzPAQGnp020chtnMjPskkssWd8kQTAElz2-Q4dQ/s1600-h/image10.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgX_YyD2vwBFSb3Ce_6KXpqnwAnw4EuuvGwulTwTPHG2Si89wtebm1vuht60nQWdNlYwJfNWP9PqQZiPg03Ro0bhXFO-covWNhhycjTkMNOWk88GkD_6S1KBOqk4FKhP8aJLFQR/?imgmax=800" width="244" height="176"></a></p> <p>Et les associations des result types d’un site de recherche (Paramètres de Site) :</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw_vFGdPt8iCWKe5oIY32Txi8noyj-2Ekq1rhQBG7F4QVBsINwrpz9clmrIUvgAmDNpV8aQinfrhbw12OOOk4ODd1vF9bzyfIHtOLuERqOkIkCh33bXnOC7Zo5Ouqlb-AK0i-2/s1600-h/image16.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFFXYgdQvdR8zYBwAW45rpCEdRvYPU7ISrBJKVFttFKtGKQiebOqvg0_rACUzpwBzy4u9dGSUDvsGl5aKse0V_OS5WQjBb1UgPdV07MzxYJ-G-bIPziLwyIAfDwc35ThcezVGK/?imgmax=800" width="551" height="241"></a></p> <h3>Premier display template custom</h3> <p>Pour montrer le principe de personnalisation par Display Template, un exemple concret : Je veux réaliser un affichage au format “carte de visite” de mes éléments avec une image / miniature / icône, un titre et un descriptif.</p> <p>On commence par créer une page et on insère la WebPart de Content Search. Pour tester les données, je vous conseille d’utiliser le template “Diagnostic” et de le mapper sur les propriétés que vous voulez. Affinez votre recherche jusqu’à obtenir les données souhaitées :</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrShces6-cAUD6Ul4Sx3VmiqsmCXsZ9p-mCxE-Gzqv4rr1iB_3iPs5J_EBNo9vqPeg3SnmW3fRc_Ae6MI_U_ELLuLa0gNc7d4Fj52pyit_qJwsrtlmj9o5TuW-xMSlYTQrUqwC/s1600-h/image4%25255B1%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; display: block; padding-right: 0px; border-top-width: 0px; margin-right: auto" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZVECFWlw9NZqbiOMCxn1EkaTrUUF9FiUI7BiQ4UmdBtulOGHiKclRAVLaVUalNH_KxjFxCD8b9s9WEWOO7GXJpjJvS3Fw3G_8nQ2nyIY-4MDZ5JOTRZrbPgOQnpJCEtyBzYbl/?imgmax=800" width="437" height="444"></a></p> <p>Maintenant qu’on a le paramétrage, y’a plus qu’à <img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Sourire" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSJS0cKS52TAn7NGpUssFlcyBVyqqwDF62lT6qEWjPjtI27MDVADhox5VgCw0D2m4YD1jdQfs2Y0KvP_Hfd82U2H_wwN2rZVhB2QV28gOz96BAWoJUVaj-RO6qBggiRWgZ6ibd/?imgmax=800"></p> <h4>Créer le template</h4> <p>On ne va pas se fatiguer : A l’aide de SharePoint Designer, on copie un template existant (je vous conseille le “2 lines”, facile à interpréter) et on l’adapte à notre situation après l’avoir renommé. Dissection :</p> <div class="csharpcode"><pre class="alt"><font size="1"><span class="lnum"> 1: </span><span class="rem">// Initialisation de la collecte de statistiques (cf. http://stackoverflow.com/questions/4177001/what-does-this-javascript-code-do/7543257#7543257)</span></font></pre><pre><font size="1"><span class="lnum"> 2: </span><span class="kwrd">function</span> ULS16h(){<span class="kwrd">var</span> o=<span class="kwrd">new</span> Object;o.ULSTeamName=<span class="str">"Search Server"</span>;o.ULSFileName=<span class="str">"Item_TwoLines.js"</span>;<span class="kwrd">return</span> o;}</font></pre><pre class="alt"><font size="1"><span class="lnum"> 3: </span> </font></pre><pre><font size="1"><span class="lnum"> 4: </span><span class="rem">// Extraction des paramètres et génération de l'élément (Note : Remplacer le Guid par votre identifiant propre partout dans la source).</span></font></pre><pre class="alt"><font size="1"><span class="lnum"> 5: </span><span class="kwrd">function</span> DisplayTemplate_dee7d9226aa44ed7b709d342fec837ee(ctx) {ULS16h:;</font></pre><pre><font size="1"><span class="lnum"> 6: </span> <span class="kwrd">var</span> ms_outHtml=[];</font></pre><pre class="alt"><font size="1"><span class="lnum"> 7: </span> <span class="kwrd">var</span> cachePreviousTemplateData = ctx[<span class="str">'DisplayTemplateData'</span>];</font></pre><pre><font size="1"><span class="lnum"> 8: </span> ctx[<span class="str">'DisplayTemplateData'</span>] = <span class="kwrd">new</span> Object();</font></pre><pre class="alt"><font size="1"><span class="lnum"> 9: </span> DisplayTemplate_dee7d9226aa44ed7b709d342fec837ee.DisplayTemplateData = ctx[<span class="str">'DisplayTemplateData'</span>];</font></pre><pre><font size="1"><span class="lnum"> 10: </span> </font></pre><pre class="alt"><font size="1"><span class="lnum"> 11: </span> <span class="rem">// Initialisation des paramètres du template avant mise en cache.</span></font></pre><pre><font size="1"><span class="lnum"> 12: </span> ctx[<span class="str">'DisplayTemplateData'</span>][<span class="str">'TemplateUrl'</span>]=<span class="str">'~sitecollection\u002f_catalogs\u002fmasterpage\u002fDisplay Templates\u002fContent Web Parts\u002fItem_TwoLines.js'</span>;</font></pre><pre class="alt"><font size="1"><span class="lnum"> 13: </span> ctx[<span class="str">'DisplayTemplateData'</span>][<span class="str">'TemplateType'</span>]=<span class="str">'Item'</span>;</font></pre><pre><font size="1"><span class="lnum"> 14: </span> ctx[<span class="str">'DisplayTemplateData'</span>][<span class="str">'TargetControlType'</span>]=[<span class="str">'Content Web Parts'</span>];</font></pre><pre class="alt"><font size="1"><span class="lnum"> 15: </span> </font></pre><pre><font size="1"><span class="lnum"> 16: </span> <span class="rem">// Initialisation :</span></font></pre><pre class="alt"><font size="1"><span class="lnum"> 17: </span> <span class="kwrd">this</span>.DisplayTemplateData = ctx[<span class="str">'DisplayTemplateData'</span>];</font></pre><pre><font size="1"><span class="lnum"> 18: </span> </font></pre><pre class="alt"><font size="1"><span class="lnum"> 19: </span> <span class="rem">// Initialisation des paramètres du tempalte avant mise en cache.</span></font></pre><pre><font size="1"><span class="lnum"> 20: </span> ctx[<span class="str">'DisplayTemplateData'</span>][<span class="str">'ManagedPropertyMapping'</span>]={<span class="str">'Link URL'</span>:[<span class="str">'Path'</span>], <span class="str">'Line 1'</span>:[<span class="str">'Title'</span>], <span class="str">'Line 2'</span>:[], <span class="str">'FileExtension'</span>:<span class="kwrd">null</span>, <span class="str">'SecondaryFileExtension'</span>:<span class="kwrd">null</span>};</font></pre><pre class="alt"><font size="1"><span class="lnum"> 21: </span> </font></pre><pre><font size="1"><span class="lnum"> 22: </span> <span class="kwrd">var</span> cachePreviousItemValuesFunction = ctx[<span class="str">'ItemValues'</span>];</font></pre><pre class="alt"><font size="1"><span class="lnum"> 23: </span> ctx[<span class="str">'ItemValues'</span>] = <span class="kwrd">function</span>(slotOrPropName) {ULS16h:;</font></pre><pre><font size="1"><span class="lnum"> 24: </span> <span class="kwrd">return</span> Srch.ValueInfo.getCachedCtxItemValue(ctx, slotOrPropName)</font></pre><pre class="alt"><font size="1"><span class="lnum"> 25: </span> };</font></pre><pre><font size="1"><span class="lnum"> 26: </span> </font></pre><pre class="alt"><font size="1"><span class="lnum"> 27: </span> ms_outHtml.push(<span class="str">''</span>,<span class="str">''</span>);</font></pre><pre><font size="1"><span class="lnum"> 28: </span> </font></pre><pre class="alt"><font size="1"><span class="lnum"> 29: </span> <span class="rem">// Génération d'un ID prefixant les sous-éléments</span></font></pre><pre><font size="1"><span class="lnum"> 30: </span> <span class="kwrd">var</span> encodedId = $htmlEncode(ctx.ClientControl.get_nextUniqueId() + <span class="str">"_2lines_"</span>);</font></pre><pre class="alt"><font size="1"><span class="lnum"> 31: </span> </font></pre><pre><font size="1"><span class="lnum"> 32: </span> <span class="rem">// Récupération effective des paramètres de la WebPart "Display Template"-ée.</span></font></pre><pre class="alt"><font size="1"><span class="lnum"> 33: </span> <span class="kwrd">var</span> linkURL = $getItemValue(ctx, <span class="str">"Link URL"</span>);</font></pre><pre><font size="1"><span class="lnum"> 34: </span> linkURL.overrideValueRenderer($urlHtmlEncode);</font></pre><pre class="alt"><font size="1"><span class="lnum"> 35: </span> <span class="kwrd">var</span> iconURL = Srch.ContentBySearch.getIconSourceFromItem(ctx.CurrentItem);</font></pre><pre><font size="1"><span class="lnum"> 36: </span> <span class="kwrd">var</span> line1 = $getItemValue(ctx, <span class="str">"Line 1"</span>);</font></pre><pre class="alt"><font size="1"><span class="lnum"> 37: </span> <span class="kwrd">var</span> line2 = $getItemValue(ctx, <span class="str">"Line 2"</span>);</font></pre><pre><font size="1"><span class="lnum"> 38: </span> line1.overrideValueRenderer($contentLineText);</font></pre><pre class="alt"><font size="1"><span class="lnum"> 39: </span> line2.overrideValueRenderer($contentLineText);</font></pre><pre><font size="1"><span class="lnum"> 40: </span> </font></pre><pre class="alt"><font size="1"><span class="lnum"> 41: </span> <span class="rem">// Préparation des Id des différents éléments. Ils peuvent ainsi être adressés directement en JS par la suite.</span></font></pre><pre><font size="1"><span class="lnum"> 42: </span> <span class="kwrd">var</span> containerId = encodedId + <span class="str">"container"</span>;</font></pre><pre class="alt"><font size="1"><span class="lnum"> 43: </span> <span class="kwrd">var</span> pictureLinkId = encodedId + <span class="str">"pictureLink"</span>;</font></pre><pre><font size="1"><span class="lnum"> 44: </span> <span class="kwrd">var</span> pictureId = encodedId + <span class="str">"picture"</span>;</font></pre><pre class="alt"><font size="1"><span class="lnum"> 45: </span> <span class="kwrd">var</span> dataContainerId = encodedId + <span class="str">"dataContainer"</span>;</font></pre><pre><font size="1"><span class="lnum"> 46: </span> <span class="kwrd">var</span> line1LinkId = encodedId + <span class="str">"line1Link"</span>;</font></pre><pre class="alt"><font size="1"><span class="lnum"> 47: </span> <span class="kwrd">var</span> line1Id = encodedId + <span class="str">"line1"</span>;</font></pre><pre><font size="1"><span class="lnum"> 48: </span> <span class="kwrd">var</span> line2Id = encodedId + <span class="str">"line2"</span>;</font></pre><pre class="alt"><font size="1"><span class="lnum"> 49: </span> </font></pre><pre><font size="1"><span class="lnum"> 50: </span> <span class="rem">// Envoi de la source générée pour le rendu.</span></font></pre><pre class="alt"><font size="1"><span class="lnum"> 51: </span> ms_outHtml.push(<span class="str">''</span></font></pre><pre><font size="1"><span class="lnum"> 52: </span> ,<span class="str">' <div class="cbs-Item" id="'</span>, containerId ,<span class="str">'" data-displaytemplate="Item2Lines">'</span></font></pre><pre class="alt"><font size="1"><span class="lnum"> 53: </span> ,<span class="str">' <a class="cbs-ItemLink" title="'</span>, $htmlEncode(line1.defaultValueRenderer(line1)) ,<span class="str">'" id="'</span>, pictureLinkId ,<span class="str">'">'</span></font></pre><pre><font size="1"><span class="lnum"> 54: </span> ,<span class="str">' <img class="cbs-Thumbnail" src="'</span>, $urlHtmlEncode(iconURL) ,<span class="str">'" alt="'</span>, $htmlEncode(line1.defaultValueRenderer(line1)) ,<span class="str">'" id="'</span>, pictureId ,<span class="str">'" />'</span></font></pre><pre class="alt"><font size="1"><span class="lnum"> 55: </span> ,<span class="str">' </a>'</span></font></pre><pre><font size="1"><span class="lnum"> 56: </span> ,<span class="str">' <div class="cbs-Detail" id="'</span>, dataContainerId ,<span class="str">'">'</span></font></pre><pre class="alt"><font size="1"><span class="lnum"> 57: </span> ,<span class="str">' <a class="cbs-Line1Link ms-noWrap ms-displayBlock" href="'</span>, linkURL ,<span class="str">'" title="'</span>, $htmlEncode(line1.defaultValueRenderer(line1)) ,<span class="str">'" id="'</span>, line1LinkId ,<span class="str">'">'</span>, line1 ,<span class="str">'</a>'</span></font></pre><pre><font size="1"><span class="lnum"> 58: </span> );</font></pre><pre class="alt"><font size="1"><span class="lnum"> 59: </span> <span class="kwrd">if</span>(!line2.isEmpty)</font></pre><pre><font size="1"><span class="lnum"> 60: </span> {</font></pre><pre class="alt"><font size="1"><span class="lnum"> 61: </span> ms_outHtml.push(<span class="str">''</span></font></pre><pre><font size="1"><span class="lnum"> 62: </span> ,<span class="str">' <div class="cbs-Line2 ms-noWrap" title="'</span>, $htmlEncode(line2.defaultValueRenderer(line2)) ,<span class="str">'" id="'</span>, line2Id ,<span class="str">'">'</span>, line2 ,<span class="str">'</div>'</span></font></pre><pre class="alt"><font size="1"><span class="lnum"> 63: </span> );</font></pre><pre><font size="1"><span class="lnum"> 64: </span> }</font></pre><pre class="alt"><font size="1"><span class="lnum"> 65: </span> ms_outHtml.push(<span class="str">''</span></font></pre><pre><font size="1"><span class="lnum"> 66: </span> ,<span class="str">' </div>'</span></font></pre><pre class="alt"><font size="1"><span class="lnum"> 67: </span> ,<span class="str">' </div>'</span></font></pre><pre><font size="1"><span class="lnum"> 68: </span> ,<span class="str">' '</span></font></pre><pre class="alt"><font size="1"><span class="lnum"> 69: </span> );</font></pre><pre><font size="1"><span class="lnum"> 70: </span> </font></pre><pre class="alt"><font size="1"><span class="lnum"> 71: </span> <span class="rem">// "Nettoyage" de l'objet contexte emprunté.</span></font></pre><pre><font size="1"><span class="lnum"> 72: </span> ctx[<span class="str">'ItemValues'</span>] = cachePreviousItemValuesFunction;</font></pre><pre class="alt"><font size="1"><span class="lnum"> 73: </span> ctx[<span class="str">'DisplayTemplateData'</span>] = cachePreviousTemplateData;</font></pre><pre><font size="1"><span class="lnum"> 74: </span> <span class="kwrd">return</span> ms_outHtml.join(<span class="str">''</span>);</font></pre><pre class="alt"><font size="1"><span class="lnum"> 75: </span>}</font></pre><pre><font size="1"><span class="lnum"> 76: </span> </font></pre><pre class="alt"><font size="1"><span class="lnum"> 77: </span><span class="rem">// Inscription du template pour affichage (permet l'affichage. Le template reste visible mais ne fonctionnera pas si cette fonction est incorrecte).</span></font></pre><pre><font size="1"><span class="lnum"> 78: </span><span class="kwrd">function</span> RegisterTemplate_dee7d9226aa44ed7b709d342fec837ee() {ULS16h:;</font></pre><pre class="alt"><font size="1"><span class="lnum"> 79: </span> <span class="kwrd">if</span> (<span class="str">"undefined"</span> != <span class="kwrd">typeof</span> (Srch) &&<span class="str">"undefined"</span> != <span class="kwrd">typeof</span> (Srch.U) &&<span class="kwrd">typeof</span>(Srch.U.registerRenderTemplateByName) == <span class="str">"function"</span>) {</font></pre><pre><font size="1"><span class="lnum"> 80: </span> Srch.U.registerRenderTemplateByName(<span class="str">"TwoLines"</span>, DisplayTemplate_dee7d9226aa44ed7b709d342fec837ee);</font></pre><pre class="alt"><font size="1"><span class="lnum"> 81: </span> }</font></pre><pre><font size="1"><span class="lnum"> 82: </span> </font></pre><pre class="alt"><font size="1"><span class="lnum"> 83: </span> <span class="kwrd">if</span> (<span class="str">"undefined"</span> != <span class="kwrd">typeof</span> (Srch) &&<span class="str">"undefined"</span> != <span class="kwrd">typeof</span> (Srch.U) &&<span class="kwrd">typeof</span>(Srch.U.registerRenderTemplateByName) == <span class="str">"function"</span>) {</font></pre><pre><font size="1"><span class="lnum"> 84: </span> Srch.U.registerRenderTemplateByName(<span class="str">"~sitecollection\u002f_catalogs\u002fmasterpage\u002fDisplay Templates\u002fContent Web Parts\u002fItem_TwoLines.js"</span>, DisplayTemplate_dee7d9226aa44ed7b709d342fec837ee);</font></pre><pre class="alt"><font size="1"><span class="lnum"> 85: </span> }</font></pre><pre><font size="1"><span class="lnum"> 86: </span> </font></pre><pre class="alt"><font size="1"><span class="lnum"> 87: </span> $includeLanguageScript(<span class="str">"~sitecollection\u002f_catalogs\u002fmasterpage\u002fDisplay Templates\u002fContent Web Parts\u002fItem_TwoLines.js"</span>, <span class="str">"~sitecollection/_catalogs/masterpage/Display Templates/Language Files/{Locale}/CustomStrings.js"</span>);</font></pre><pre><font size="1"><span class="lnum"> 88: </span>}</font></pre><pre class="alt"><font size="1"><span class="lnum"> 89: </span> </font></pre><pre><font size="1"><span class="lnum"> 90: </span>RegisterTemplate_dee7d9226aa44ed7b709d342fec837ee();</font></pre><pre class="alt"><font size="1"><span class="lnum"> 91: </span> </font></pre><pre><font size="1"><span class="lnum"> 92: </span><span class="rem">// Etape d'initialisation.</span></font></pre><pre class="alt"><font size="1"><span class="lnum"> 93: </span><span class="kwrd">if</span> (<span class="kwrd">typeof</span>(RegisterModuleInit) == <span class="str">"function"</span> && <span class="kwrd">typeof</span>(Srch.U.replaceUrlTokens) == <span class="str">"function"</span>) {</font></pre><pre><font size="1"><span class="lnum"> 94: </span> RegisterModuleInit(Srch.U.replaceUrlTokens(<span class="str">"~sitecollection\u002f_catalogs\u002fmasterpage\u002fDisplay Templates\u002fContent Web Parts\u002fItem_TwoLines.js"</span>), RegisterTemplate_dee7d9226aa44ed7b709d342fec837ee);</font></pre><pre class="alt"><font size="1"><span class="lnum"> 95: </span>}</font></pre></div><br /><p>Faisons donc une première passe d’adaptation : On remplace “TwoLines” et “2line” par des noms adaptés. et les liens / noms de fichier par ceux de notre nouveau template. Ne touchez pour l’instant pas au code généré ou aux variables récupérées.</p><br /><h4>Premier test</h4><br /><p>Sauvegardez, modifiez le Titre de l’élément pour qu’il corresponde à ce que vous souhaitez et retournez sur votre page de test. Rafraichissez et affichez les propriétés de la WebPart : Votre Template doit apparaitre dans la liste et avoir le même comportement que le template “TwoLines” existant.</p><br /><p align="center"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgupoFOXYNFQ-j7rY68tZU8yi9ejS_HuGAh9TEv8x58vqOsHpWv5tu1Qp4PlzZzNYTdmmv5s-GvR0gIvXQs2i6t9xmJHKjLXm7Cy1mEUj8JYQCd6jmUZNSdg8TnJnMtjJ73YZX5/s1600-h/image%25255B3%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5_KBZa8yD3mGI_yQ0-vYVk2Du8Au8a3H_j6OaAkK2c8eHMMCq9v4khJne65m6e6rQka-nSYkgYH-_V0a5bBUkNkYpEjWXaANMmueCVcH71ooNnFuYB4T5hXy4gTMsXQ9-QErP/?imgmax=800" width="228" height="138"></a>TADA…</p><br /><p align="left">Et c’est le moment d’ajouter de la valeur à notre template : Modifier les paramètres et le contenu.</p><br /><h4 align="left">Modifier les paramètres</h4><br /><p align="left">Reprenons la source du template. Modifions d’abord le mapping des propriétés :</p><pre class="csharpcode"><font size="1">ctx[<span class="str">'DisplayTemplateData'</span>][<span class="str">'ManagedPropertyMapping'</span>]={<span class="str">'Link URL'</span>:[<span class="str">'Path'</span>], <span class="str">'Thumbnail'</span>:[], <span class="str">'Title Line'</span>:[<span class="str">'Title'</span>], <span class="str">'Summary'</span>:[<span class="str">'Description'</span>], <span class="str">'FileExtension'</span>:<span class="kwrd">null</span>, <span class="str">'SecondaryFileExtension'</span>:<span class="kwrd">null</span>};</font></pre><br /><br /><style type="text/css">.csharpcode, .csharpcode pre<br />{<br /> font-size: small;<br /> color: black;<br /> font-family: consolas, "Courier New", courier, monospace;<br /> background-color: #ffffff;<br /> /*white-space: pre;*/<br />}<br />.csharpcode pre { margin: 0em; }<br />.csharpcode .rem { color: #008000; }<br />.csharpcode .kwrd { color: #0000ff; }<br />.csharpcode .str { color: #006080; }<br />.csharpcode .op { color: #0000c0; }<br />.csharpcode .preproc { color: #cc6633; }<br />.csharpcode .asp { background-color: #ffff00; }<br />.csharpcode .html { color: #800000; }<br />.csharpcode .attr { color: #ff0000; }<br />.csharpcode .alt <br />{<br /> background-color: #f4f4f4;<br /> width: 100%;<br /> margin: 0em;<br />}<br />.csharpcode .lnum { color: #606060; }<br /></style><br /><br /><h4></h4><br /><style type="text/css">.csharpcode, .csharpcode pre<br />{<br /> font-size: small;<br /> color: black;<br /> font-family: consolas, "Courier New", courier, monospace;<br /> background-color: #ffffff;<br /> /*white-space: pre;*/<br />}<br />.csharpcode pre { margin: 0em; }<br />.csharpcode .rem { color: #008000; }<br />.csharpcode .kwrd { color: #0000ff; }<br />.csharpcode .str { color: #006080; }<br />.csharpcode .op { color: #0000c0; }<br />.csharpcode .preproc { color: #cc6633; }<br />.csharpcode .asp { background-color: #ffff00; }<br />.csharpcode .html { color: #800000; }<br />.csharpcode .attr { color: #ff0000; }<br />.csharpcode .alt <br />{<br /> background-color: #f4f4f4;<br /> width: 100%;<br /> margin: 0em;<br />}<br />.csharpcode .lnum { color: #606060; }<br /></style><br /><br /><h4></h4><br /><br /><p>Le format est un tableau associatif de ‘Nom de Propriété déclaré’:[‘Champ associé par défaut’]</p><br /><p>Ensuite, on modifie l’extraction des données :</p><br /><div class="csharpcode"><pre class="alt"><font size="1"><span class="lnum"> 1: </span><span class="kwrd">var</span> thumbnail = $getItemValue(ctx, <span class="str">"Thumbnail"</span>);</font></pre><pre><font size="1"><span class="lnum"> 2: </span><span class="kwrd">var</span> titleLine = $getItemValue(ctx, <span class="str">"Title Line"</span>);</font></pre><pre class="alt"><font size="1"><span class="lnum"> 3: </span><span class="kwrd">var</span> summary = $getItemValue(ctx, <span class="str">"Summary"</span>);</font></pre><pre><font size="1"><span class="lnum"> 4: </span>thumbnail.overrideValueRenderer($contentLineText);</font></pre><pre class="alt"><font size="1"><span class="lnum"> 5: </span>titleLine.overrideValueRenderer($contentLineText);</font></pre><pre><font size="1"><span class="lnum"> 6: </span>summary.overrideValueRenderer($contentLineText);</font></pre></div><br /><style type="text/css">.csharpcode, .csharpcode pre<br />{<br /> font-size: small;<br /> color: black;<br /> font-family: consolas, "Courier New", courier, monospace;<br /> background-color: #ffffff;<br /> /*white-space: pre;*/<br />}<br />.csharpcode pre { margin: 0em; }<br />.csharpcode .rem { color: #008000; }<br />.csharpcode .kwrd { color: #0000ff; }<br />.csharpcode .str { color: #006080; }<br />.csharpcode .op { color: #0000c0; }<br />.csharpcode .preproc { color: #cc6633; }<br />.csharpcode .asp { background-color: #ffff00; }<br />.csharpcode .html { color: #800000; }<br />.csharpcode .attr { color: #ff0000; }<br />.csharpcode .alt <br />{<br /> background-color: #f4f4f4;<br /> width: 100%;<br /> margin: 0em;<br />}<br />.csharpcode .lnum { color: #606060; }<br /></style><br /><br /><br /><p>Notez que le 2e paramètre de $getItemValue est le nom de propriété déclaré. Enfin, modifiez le rendu. Par exemple, en affichant les propriétés directement :</p><br /><div class="csharpcode"><pre class="alt"><span class="lnum"> 1: </span><span class="rem">// Rendu poussé dans ms_outHtml :</span></pre><pre><span class="lnum"> 2: </span>ms_outHtml.push(</pre><pre class="alt"><span class="lnum"> 3: </span> <span class="str">'<p>linkURL : '</span> + linkURL + <span class="str">'</p>'</span>,</pre><pre><span class="lnum"> 4: </span> <span class="str">'<p>iconURL : '</span> + iconURL + <span class="str">'</p>'</span>,</pre><pre class="alt"><span class="lnum"> 5: </span> <span class="str">'<p>thumbnail : '</span> + thumbnail + <span class="str">'</p>'</span>,</pre><pre><span class="lnum"> 6: </span> <span class="str">'<p>titleLine : '</span> + titleLine + <span class="str">'</p>'</span>,</pre><pre class="alt"><span class="lnum"> 7: </span> <span class="str">'<p>summary : '</span> + summary + <span class="str">'</p>'</span>,</pre><pre><span class="lnum"> 8: </span> <span class="str">'<hr />'</span>);</pre></div><br /><style type="text/css">.csharpcode, .csharpcode pre<br />{<br /> font-size: small;<br /> color: black;<br /> font-family: consolas, "Courier New", courier, monospace;<br /> background-color: #ffffff;<br /> /*white-space: pre;*/<br />}<br />.csharpcode pre { margin: 0em; }<br />.csharpcode .rem { color: #008000; }<br />.csharpcode .kwrd { color: #0000ff; }<br />.csharpcode .str { color: #006080; }<br />.csharpcode .op { color: #0000c0; }<br />.csharpcode .preproc { color: #cc6633; }<br />.csharpcode .asp { background-color: #ffff00; }<br />.csharpcode .html { color: #800000; }<br />.csharpcode .attr { color: #ff0000; }<br />.csharpcode .alt <br />{<br /> background-color: #f4f4f4;<br /> width: 100%;<br /> margin: 0em;<br />}<br />.csharpcode .lnum { color: #606060; }<br /></style><br /><br /><p>Sauvegardez et dans les paramètres de site, n’oubliez pas de mettre à jour les propriétés du template et notamment “Managed Property Mappings” pour propager les propriété personnalisées.</p><br /><p>'Link URL'{Link URL}:'Path','Thumbnail'{Thumbnail}:'','Title Line'{Item Title}:'Title','Summary'{Summary}:'','FileExtension','SecondaryFileExtension'</p><br /><p>Attention, contrairement à ce que la documentation prétend, le découpage est ‘Nom déclaré de la propriété (cf. ci-dessus)’{Libellé affiché}:’Champ par défaut’ mais vous le verrez rapidement pendant ce test pour peu que vous preniez la peine de faire varier les valeurs… On peut désormais valider le rendu :</p><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjibdhSPhdoucldXUldCzaJT_Sa26qKOCpRS4QLd4xiQRMwktGVScNLZUSaaJQZ8Z3nEIJzjNJNXeEFjkFxm0a6Rp8xu7oRxeoWL9GSatz4ADIzBIMTyCAb2G_GvgSrChmHCQTR/s1600-h/image%25255B7%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRsTBUDboIqmIhKB5JzLMVYXB_dSgPt3TQ-97aklsBbruK26mzJq-bqRMR7wmmvDiFtaDEqLK_fA-OFEC_NcHRojYdXB0Vsf4gEw99tMXrtKhN-rHaNyr5FEiUeFi9UdJLGXGP/?imgmax=800" width="531" height="230"></a></p><br /><p>On retourne travailler le rendu et avec quelques modification du style et autres (OK, dans cet exemple j’ai fait le goret en injectant mon style directement sur les balises mais vous n’êtes pas obligé de faire moche en m’imitant <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Clignement d'œil" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnSD6w9ivkOTyLDfro1iZTxa_qcitx0MZ5z22Iw7Qxal4fky31iSsQWqeHt_1xU_jQ1uVyWqYEdZZjZdSQVvcSH5auuuxZR2LO80iHsDZ4BBZanzc4iBpZzSPJUitL3F_VD2tZ/?imgmax=800">) :</p><br /><div class="csharpcode"><pre class="alt"><font size="1">ms_outHtml.push(</font></pre><pre><font size="1"> <span class="str">'<div class="cbsCardItem" id="'</span>, containerId ,<span class="str">'" data-displaytemplate="ItemCard" style="border: 1px solid #FFBB99;width: 500px;height: 200px;padding: 0;margin: 0;">'</span>,</font></pre><pre class="alt"><font size="1"> <span class="str">' <a class="cbsCardLink" title="Cliquez pour afficher l\'élément" href="'</span>, $urlHtmlEncode(linkURL), <span class="str">'" style="color: inherit;">'</span>,</font></pre><pre><font size="1"> <span class="str">' <img class="cbs-Thumbnail" src="'</span>, $urlHtmlEncode((thumbnail.isEmpty) ? iconURL : thumbnail) ,<span class="str">'" alt="'</span>, $htmlEncode(titleLine.defaultValueRenderer(titleLine)) ,<span class="str">'" id="'</span>, pictureId ,<span class="str">'" style="height: 200px;width: auto;float: left;display: inline-block; margin-right: 5px;" />'</span>,</font></pre><pre class="alt"><font size="1"> <span class="str">' <div class="cbs-TextContainer" id="'</span>, dataContainerId ,<span class="str">'" style="background-color: #99DDFF; height: 100%;">'</span>,</font></pre><pre><font size="1"> <span class="str">' <h1>'</span>, titleLine ,<span class="str">'</h1>'</span>,</font></pre><pre class="alt"><font size="1"> <span class="str">' <p>'</span>, summary ,<span class="str">'</p>'</span>,</font></pre><pre><font size="1"> <span class="str">' </div>'</span>,</font></pre><pre class="alt"><font size="1"> <span class="str">' </a>'</span>,</font></pre><pre><font size="1"> <span class="str">'</div>'</span>,</font></pre><pre class="alt"><font size="1"> <span class="str">'<hr />'</span>);</font></pre></div><br /><style type="text/css">.csharpcode, .csharpcode pre<br />{<br /> font-size: small;<br /> color: black;<br /> font-family: consolas, "Courier New", courier, monospace;<br /> background-color: #ffffff;<br /> /*white-space: pre;*/<br />}<br />.csharpcode pre { margin: 0em; }<br />.csharpcode .rem { color: #008000; }<br />.csharpcode .kwrd { color: #0000ff; }<br />.csharpcode .str { color: #006080; }<br />.csharpcode .op { color: #0000c0; }<br />.csharpcode .preproc { color: #cc6633; }<br />.csharpcode .asp { background-color: #ffff00; }<br />.csharpcode .html { color: #800000; }<br />.csharpcode .attr { color: #ff0000; }<br />.csharpcode .alt <br />{<br /> background-color: #f4f4f4;<br /> width: 100%;<br /> margin: 0em;<br />}<br />.csharpcode .lnum { color: #606060; }<br /></style><br /><br /><p>Et hop, j’ai mon premier Template un tant soit peu “pêchu” :</p><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZ1XDCkee-gjzd3LxrF26mxillCXfd5ebBqWRxKYFEjUhzTA81CtFHNNTZWP-9Na5ucuSF-ySZTvhKWIwrJzjE_OI3HhLeIWMq8OohPQ2x9GuWYU00aLDXgvX3jZ2VExutcROk/s1600-h/image%25255B11%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg57Wm8V8_JL-WRUfgZJrAvZoqmPAihp01AiO7NCdBQqlenMgnsJ1ykpPHq13zbkn8b7mBn_FzW31tWCpfsyskWiVtEjcMmgya0ipOBXJ99g6Z0VLsoXTDD984hBJMeOEKnoLs/?imgmax=800" width="552" height="490"></a></p><br /><h3>Le control : un peu plus de personnalisation</h3><br /><p>Bien. Si vous m’avez suivi jusqu’ici. Déjà je vous en remercie, de plus, ça fait chaud au cœur et enfin, sachez qu’on n’a vu que 25 % du truc mais que pour le reste, ça en découle grandement.</p><br /><p>Donc, on sait mettre en forme plutôt aisément un élément en mappant un template qu’on génère en JS sur des propriétés assignables à la volée sur une WebPart. Finissons le travail en traitant du groupe d’éléments. En effet, un détail n’aura pas échappé à votre perspicacité légendaire (ne rougissez pas, c’est sincère) :</p><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2ZsQIsYlStrHaQcDnsJqjhYVACZB4O2kut44TluI5QCIaCBcZ9xDGDs2NmVGHfyO2RrVWf926XXdLvGNNZa02CDzvLwi0n3ld9xLePtpuru0_PIP4IL_t7qn4AEqfyB7RvvIc/s1600-h/image%25255B14%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: left; padding-top: 0px; padding-left: 0px; margin: 0px 5px 0px 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" align="left" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguC60pIv9D19amCeK2Gr0PgJ9WO_35O405fvlvqGKuTAs83xsH_ISSzPtYZ5WRAuafjxWoBR1IG0NRP_6nldervSkSImJrNWewkzRxqCcbK7axchAVJcpCcIrQhyPY_8dIaY7Y/?imgmax=800" width="228" height="138"></a></p><br /><br /><br /><br /><br /><br /><br /><br /><br /><p>Et oui, on s’est occupé de “Item”, mais pas encore de cet attribut “Control”, qui permet pour l’instant de faire une liste, paginée ou non, ou un diaporama basique et dont on retrouve trace dans le catalogue “Display Templates > Content Web Parts” : Control_List.js et consorts…</p><br /><p>Bingo ! On s’y attèle de suite (à la différence de celle de maintien qui n’aurait sa place que sur un blog médical, loin de mon propos… Bref.) !</p><br /><h4>Scénario cible</h4><br /><p>J’ai donc un affichage en cartes, et bien, je vais les faire afficher en forme de pile avec possibilité de les consulter par survol à la souris.</p><br /><p>Retour dans SharePoint Designer ou je duplique le template de Contrôle de liste et en fait un Control_Stack.js avec modification des propriétés comme on en a désormais l’habitude. Je vous épargne la dissection étant donné que le contenu est proche de celui de l’item à la différence majeur qu’on adresse ici l’ensemble des éléments et qu’il faut appeler les template d’items dans le push de génération.</p><br /><h4>Superposition des cartes</h4><br /><p>Première manipulation sur le contenu : Transformer la liste ul / li en un esemble de div se chevauchant. Attention, là aussi, j’ai fait vite en utilisant une variable globale qui causera un conflit si plusieurs contrôles de ce type sont utilisés sur a même page. Vous pouvez utiliser l’objet ctx pour générer un id unique et traiter ainsi proprement votre empilement.</p><br /><div class="csharpcode"><pre class="alt"><font size="1"><span class="lnum"> 1: </span><span class="kwrd">var</span> g_ItemCount = 0;</font></pre><pre><font size="1"><span class="lnum"> 2: </span><span class="kwrd">var</span> ListRenderRenderWrapper = <span class="kwrd">function</span>(itemRenderResult, inCtx, tpl)</font></pre><pre class="alt"><font size="1"><span class="lnum"> 3: </span>{ULS9sP:;</font></pre><pre><font size="1"><span class="lnum"> 4: </span> <span class="kwrd">var</span> iStr = [];</font></pre><pre class="alt"><font size="1"><span class="lnum"> 5: </span> iStr.push(<span class="str">'<div class="itemToPop" style="position: absolute; top: '</span>, <span class="str">""</span> + (g_ItemCount*20), <span class="str">'px; left: '</span>, <span class="str">""</span> + (g_ItemCount*20), <span class="str">'px">'</span>);</font></pre><pre><font size="1"><span class="lnum"> 6: </span> iStr.push(<span class="str">'<!--'</span>, g_ItemCount++ , <span class="str">'-->'</span>);</font></pre><pre class="alt"><font size="1"><span class="lnum"> 7: </span> iStr.push(itemRenderResult);</font></pre><pre><font size="1"><span class="lnum"> 8: </span> iStr.push(<span class="str">'</div>'</span>);</font></pre><pre class="alt"><font size="1"><span class="lnum"> 9: </span> <span class="kwrd">return</span> iStr.join(<span class="str">''</span>);</font></pre><pre><font size="1"><span class="lnum"> 10: </span>}</font></pre><pre class="alt"><font size="1"><span class="lnum"> 11: </span>ctx[<span class="str">'ItemRenderWrapper'</span>] = ListRenderRenderWrapper;</font></pre><pre><font size="1"><span class="lnum"> 12: </span>ms_outHtml.push(<span class="str">''</span></font></pre><pre class="alt"><font size="1"><span class="lnum"> 13: </span>,<span class="str">' <div class="cbs-List" style="position: relative;">'</span></font></pre><pre><font size="1"><span class="lnum"> 14: </span>,<span class="str">''</span></font></pre><pre class="alt"><font size="1"><span class="lnum"> 15: </span>,<span class="str">' '</span>, ctx.RenderGroups(ctx) ,<span class="str">''</span></font></pre><pre><font size="1"><span class="lnum"> 16: </span>,<span class="str">' </div>'</span></font></pre><pre class="alt"><font size="1"><span class="lnum"> 17: </span>);</font></pre></div><br /><style type="text/css">.csharpcode, .csharpcode pre<br />{<br /> font-size: small;<br /> color: black;<br /> font-family: consolas, "Courier New", courier, monospace;<br /> background-color: #ffffff;<br /> /*white-space: pre;*/<br />}<br />.csharpcode pre { margin: 0em; }<br />.csharpcode .rem { color: #008000; }<br />.csharpcode .kwrd { color: #0000ff; }<br />.csharpcode .str { color: #006080; }<br />.csharpcode .op { color: #0000c0; }<br />.csharpcode .preproc { color: #cc6633; }<br />.csharpcode .asp { background-color: #ffff00; }<br />.csharpcode .html { color: #800000; }<br />.csharpcode .attr { color: #ff0000; }<br />.csharpcode .alt <br />{<br /> background-color: #f4f4f4;<br /> width: 100%;<br /> margin: 0em;<br />}<br />.csharpcode .lnum { color: #606060; }<br /></style><br /><br /><p>Un petit test pour valider le comportement. Ca semble pas mal :</p><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEhW5ilvhoCR48oaNqJDIsKfq2Z79Av1NTcAWPAWjLL5yMKYNLatRgYA9CCwSPWr2pbFMlbqqLoieQj3nDqbd715_FZjOYcYiq_l0_Qf0ewSltDEnsgAoZNiH1v63dic_bTJJg/s1600-h/image%25255B18%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXj3_0AEQvrhlpC51w0nNeT6tbVEBB95PYDyoqsdd2tHC7tPtGZcHhk3ISzIUj32KuU3sPfax0W8Y4HP3iMh8q5RClijYiRY4I0io7sOh6O9cOHZn-knLnrAlT3ka1PyOShRJW/?imgmax=800" width="545" height="265"></a></p><br /><br /><h4>Astuce : Utilisation de jQuery dans les Display Templates</h4><br /><p>OK, à ce stade, pour gérer les survols et autres, j’aimerais bien utiliser jQuery… Qu’à cela ne tienne : J’ajoute les liens dans l’en-tête (au passage, inclusion d’une CSS personnalisée, ça ne mange pas de pain)</p><br /><div class="csharpcode"><pre class="alt"><font size="1"><span class="lnum"> 1: </span><span class="kwrd">var</span> script = document.createElement(<span class="str">'script'</span>);</font></pre><pre><font size="1"><span class="lnum"> 2: </span>script.src = <span class="str">'http://ajax.microsoft.com/ajax/jQuery/jquery-1.9.1.min.js'</span>;</font></pre><pre class="alt"><font size="1"><span class="lnum"> 3: </span>script.type = <span class="str">'text/javascript'</span>;</font></pre><pre><font size="1"><span class="lnum"> 4: </span>document.getElementsByTagName(<span class="str">'head'</span>)[0].appendChild(script);</font></pre><pre class="alt"><font size="1"><span class="lnum"> 5: </span><span class="kwrd">var</span> link_tag = document.createElement(<span class="str">'link'</span>);</font></pre><pre><font size="1"><span class="lnum"> 6: </span>link_tag.setAttribute(<span class="str">'rel'</span>, <span class="str">'stylesheet'</span>);</font></pre><pre class="alt"><font size="1"><span class="lnum"> 7: </span>link_tag.setAttribute(<span class="str">'type'</span>, <span class="str">'text/css'</span>);</font></pre><pre><font size="1"><span class="lnum"> 8: </span>link_tag.setAttribute(<span class="str">'href'</span>, <span class="str">'/_layouts/TME/SimpleLinks.css'</span>);</font></pre><pre class="alt"><font size="1"><span class="lnum"> 9: </span>document.getElementsByTagName(<span class="str">'head'</span>)[0].appendChild(link_tag);</font></pre></div><br /><style type="text/css">.csharpcode, .csharpcode pre<br />{<br /> font-size: small;<br /> color: black;<br /> font-family: consolas, "Courier New", courier, monospace;<br /> background-color: #ffffff;<br /> /*white-space: pre;*/<br />}<br />.csharpcode pre { margin: 0em; }<br />.csharpcode .rem { color: #008000; }<br />.csharpcode .kwrd { color: #0000ff; }<br />.csharpcode .str { color: #006080; }<br />.csharpcode .op { color: #0000c0; }<br />.csharpcode .preproc { color: #cc6633; }<br />.csharpcode .asp { background-color: #ffff00; }<br />.csharpcode .html { color: #800000; }<br />.csharpcode .attr { color: #ff0000; }<br />.csharpcode .alt <br />{<br /> background-color: #f4f4f4;<br /> width: 100%;<br /> margin: 0em;<br />}<br />.csharpcode .lnum { color: #606060; }<br /></style><br /><br /><p>Et j’ajoute benoitement l’appel :</p><br /><div class="csharpcode"><pre class="alt"><font size="1"><span class="lnum"> 1: </span><span class="rem">// Cette ligne est déjà présente dans le template...</span></font></pre><pre><font size="1"><span class="lnum"> 2: </span>ctx[<span class="str">'DisplayTemplateData'</span>] = cachePreviousTemplateData;</font></pre><pre class="alt"><font size="1"><span class="lnum"> 3: </span> </font></pre><pre><font size="1"><span class="lnum"> 4: </span><span class="rem">// Gestion du passage au premier plan :</span></font></pre><pre class="alt"><font size="1"><span class="lnum"> 5: </span>$(document).ready(<span class="kwrd">function</span>() {</font></pre><pre><font size="1"><span class="lnum"> 6: </span> <span class="rem">// find the div elements and hook the hover event</span></font></pre><pre class="alt"><font size="1"><span class="lnum"> 7: </span> $(<span class="str">'.itemToPop'</span>).hover(<span class="kwrd">function</span>() {</font></pre><pre><font size="1"><span class="lnum"> 8: </span> $(<span class="kwrd">this</span>).css(<span class="str">'z-index'</span>,2)</font></pre><pre class="alt"><font size="1"><span class="lnum"> 9: </span> }, <span class="kwrd">function</span> () {</font></pre><pre><font size="1"><span class="lnum"> 10: </span> $(<span class="kwrd">this</span>).css(<span class="str">'z-index'</span>,1)</font></pre><pre class="alt"><font size="1"><span class="lnum"> 11: </span> });</font></pre><pre><font size="1"><span class="lnum"> 12: </span>});</font></pre></div><br /><style type="text/css">.csharpcode, .csharpcode pre<br />{<br /> font-size: small;<br /> color: black;<br /> font-family: consolas, "Courier New", courier, monospace;<br /> background-color: #ffffff;<br /> /*white-space: pre;*/<br />}<br />.csharpcode pre { margin: 0em; }<br />.csharpcode .rem { color: #008000; }<br />.csharpcode .kwrd { color: #0000ff; }<br />.csharpcode .str { color: #006080; }<br />.csharpcode .op { color: #0000c0; }<br />.csharpcode .preproc { color: #cc6633; }<br />.csharpcode .asp { background-color: #ffff00; }<br />.csharpcode .html { color: #800000; }<br />.csharpcode .attr { color: #ff0000; }<br />.csharpcode .alt <br />{<br /> background-color: #f4f4f4;<br /> width: 100%;<br /> margin: 0em;<br />}<br />.csharpcode .lnum { color: #606060; }<br /></style><br /><br /><br /><p>Note : Il est possible que ce code ne fonctionne pas directement (erreur jQuery inconnu ou $ est null ou n’est pas objet…). Dans ce cas, on peut utiliser la propriété “OnPostRender” de l’objet de contexte :</p><br /><div class="csharpcode"><pre class="alt"><font size="1"><span class="lnum"> 1: </span><span class="rem">// Cette ligne est toujours là pour situer l'action :)</span></font></pre><pre><font size="1"><span class="lnum"> 2: </span>ctx[<span class="str">'DisplayTemplateData'</span>] = cachePreviousTemplateData;</font></pre><pre class="alt"><font size="1"><span class="lnum"> 3: </span> </font></pre><pre><font size="1"><span class="lnum"> 4: </span>ctx.OnPostRender = [];</font></pre><pre class="alt"><font size="1"><span class="lnum"> 5: </span>ctx.OnPostRender.push(<span class="kwrd">function</span>(){ <span class="rem">/* invoke your plugin code here to ensure the plugin has the content to work against */</span></font></pre><pre><font size="1"><span class="lnum"> 6: </span>$(document).ready(<span class="kwrd">function</span>() {</font></pre><pre class="alt"><font size="1"><span class="lnum"> 7: </span> <span class="rem">// find the div elements and hook the hover event</span></font></pre><pre><font size="1"><span class="lnum"> 8: </span> $(<span class="str">'.itemToPop'</span>).hover(<span class="kwrd">function</span>() {</font></pre><pre class="alt"><font size="1"><span class="lnum"> 9: </span> $(<span class="kwrd">this</span>).css(<span class="str">'z-index'</span>,2)</font></pre><pre><font size="1"><span class="lnum"> 10: </span> }, <span class="kwrd">function</span> () {</font></pre><pre class="alt"><font size="1"><span class="lnum"> 11: </span> $(<span class="kwrd">this</span>).css(<span class="str">'z-index'</span>,1)</font></pre><pre><font size="1"><span class="lnum"> 12: </span> });</font></pre><pre class="alt"><font size="1"><span class="lnum"> 13: </span> })</font></pre><pre><font size="1"><span class="lnum"> 14: </span>});</font></pre></div><br /><style type="text/css">.csharpcode, .csharpcode pre<br />{<br /> font-size: small;<br /> color: black;<br /> font-family: consolas, "Courier New", courier, monospace;<br /> background-color: #ffffff;<br /> /*white-space: pre;*/<br />}<br />.csharpcode pre { margin: 0em; }<br />.csharpcode .rem { color: #008000; }<br />.csharpcode .kwrd { color: #0000ff; }<br />.csharpcode .str { color: #006080; }<br />.csharpcode .op { color: #0000c0; }<br />.csharpcode .preproc { color: #cc6633; }<br />.csharpcode .asp { background-color: #ffff00; }<br />.csharpcode .html { color: #800000; }<br />.csharpcode .attr { color: #ff0000; }<br />.csharpcode .alt <br />{<br /> background-color: #f4f4f4;<br /> width: 100%;<br /> margin: 0em;<br />}<br />.csharpcode .lnum { color: #606060; }<br /></style><br /><br /><p>Et zou, on vide les caches, on ouvre ses chakras et on contemple avec béatitude le rendu dynamique <img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Sourire" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSJS0cKS52TAn7NGpUssFlcyBVyqqwDF62lT6qEWjPjtI27MDVADhox5VgCw0D2m4YD1jdQfs2Y0KvP_Hfd82U2H_wwN2rZVhB2QV28gOz96BAWoJUVaj-RO6qBggiRWgZ6ibd/?imgmax=800"></p><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlf-iTLFWxT67ElkTFSS7ocADcue8Ciu4Z_BCidMPXiXWnKdfLnRjYXi6XC2lWiUiO8LGCnh71wbfrJfdvfm0vR6NjVu5Z-5UqpBX-M4Gff_gUQfELBNUdp_l66oVUnL2Ln7dv/s1600-h/image%25255B22%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwHdsJPVY-rYevk-pDap6JT0Qt7Uu2sV7rsEQVfu_VL1pI5arVxwl5uXLkMnKRMcKOSQHAjE6ooTfPJPxstGX2HG7D-1y-QM4y8sijnvhDitybf5mOOn4b9htd0QXH_KCo4ghY/?imgmax=800" width="563" height="141"></a></p><br /><p>Ceci clôture la première partie du dossier “Display Templates”. Vous avez matière à expérimenter. Rendez-vous d’ici quelques jours pour la 2e partie plus axée sur la recherche : affineurs, filtres et résultat de recherche au menu avec quelques pépites surprises…</p> Thomas MERLYhttp://www.blogger.com/profile/03321069433241571560noreply@blogger.com0tag:blogger.com,1999:blog-11052318.post-9865300363196110802013-05-25T14:12:00.000+02:002013-05-26T07:54:05.244+02:001e ConfSharePoint Française–Ce qu’il faut en retenir…Les pontes SharePoint avaient rendez-vous du 22 au 24 mai 2013 à Disneyland Paris pour cette première. Les événements marquants vus par le prisme de la twittosphère :<br><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsDNpCfIjr0nJAFEhcZNp9-ZlDNQ57KcLjssV9LRSq_gXR7dzrlL3gzIvj9YlFKLZV9qcqV-poaqZkf7XX7P7lzyxW0OOJWfh9WXcDQ-WYVN_65pUvZpYKiyH_tpBMhQBFUhWT/s1600-h/image%25255B2%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHKiN-HjSay7EcRF2B0WGtQ9aZzCML9GcYKl9zVpDj-I9hImGNo5Y1FlFP6C92mBm3JCGOMq8m50TTwXAwkVkfS3DC0qSCSNeK2N9xvQpwjtIYJdyBNMPniwbiDZf-tU9t7TAv/?imgmax=800" width="244" height="44"></a><br>Ah ben oui, on vous l’avait pas dit ? Office Web Apps, maintenant, c’est sur un serveur dédié : Si vous ne répartissiez pas vos infra sur plusieurs serveurs avant, c’était déjà mal… Maintenant, ça se verra dans votre portail de recherche qui ne comportera pas les miniatures dynamiques des docs <img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Sourire" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDjX0sEG188gNLu1-8EHMqUVPBaoKg45nU2YagFEbzjLe1T8nfibXLAcm4oUvz0hFSUOj9Ho1kMXVISUW7G7_tWRzKjgqYzS9uMwzqRDcTxJyXX9Whgk6_wNZb5j-Y3tFHK0SY/?imgmax=800">.<br><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguh4cmHDJJOdG32N-dRx4wHSRCAwWDriaNqT9sMnIsVr9QBWGBsrpNlEI0fEu_HcpYyWBzTxxHdEMGr9ZWe7KrMq-7V0nxOEa8lCcoXdMpsVGSDl_C-cL0isHWnZvnF0OOdIRB/s1600-h/image%25255B5%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYg8iDE1JOULTe_Wj4fcmvw3jg1h-vNEgBJXZUD8uF1OvHnDMLym3oyz9p3zBWoYdtn5yX-nMiOoGwPEzErcb1NTp2FznzIlXR82Qsb-FzS9U2HLLKf84ZstHWoItsXwJZlxcp/?imgmax=800" width="244" height="175"></a><br>Le ton est donné dès la première journée : En parcours “D”, de l’apps, tu vas en bouffer (et notre session n’y dérogera pas). Abandonnez le modèle Sandbox (<i>deprecated</i> nous confirmait le 3e jour @Michaeltnoel) et passez aux apps (ou appelez-nous <img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Sourire" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDjX0sEG188gNLu1-8EHMqUVPBaoKg45nU2YagFEbzjLe1T8nfibXLAcm4oUvz0hFSUOj9Ho1kMXVISUW7G7_tWRzKjgqYzS9uMwzqRDcTxJyXX9Whgk6_wNZb5j-Y3tFHK0SY/?imgmax=800"> ) !<br><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRwIOl3oU6PPrWDGckku-DhfPjM8QuaQ3qKJKNaDN-dSTJT48UvDFcwR321ZUzwv8cK0APaHHMgixLHUDmLCemlTOuDHhHXTpbkb8PEGKvbSq6C7oBS3rE7BdrVIUK4tRZzFsu/s1600-h/image%25255B14%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1CAL9BBqcBbegjqnQrNHciXkhOFQuJt04MzZJHl2p0S0dfEY7sjxosUFb4JeAzuLKpQGGe0T9G814Eba78CqWcyRph_emprxNvPh1_oVIIdXkoL1AwwXJ_TsKoLRFSX7KbtMU/?imgmax=800" width="244" height="49"></a><br>Copinage : La session présentée par Ben et Lio s’est bien déroulée, avec de l’effet wow sur la géolocalisation “out-of-the-box”.<br><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqTQw1kTWoUxVPsSe6BhR-OoLB1kQBmjicvDcZ40yPDuoeqZ3NrQR_xlBOIUyRzg2hpUeDSuHR_le0vMejmnU5z8DxV_qM5iyXfGZ5UhKD-1xcy_h7wr_q5z9LcmKCqlpRKfYe/s1600-h/image%25255B8%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWrSuhL7Rf4gljs2FI8jIvxUPAr-0rF9lplVfI-2-rDVMdML53xGAlNMP80JTdVvhK-9wECQ2xznJOHiOTBRYglVgXNb2hIxjM9qkXnMNjo927Dbtiw9bvYEATQ3r8on0hwtup/?imgmax=800" width="244" height="225"></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH5MrgYJwpz1899bpYHshtdTHqv2ffphZv_c_HiIAhkbQO3NhAM3VqpNUdDs0fS8OiIe1iGcdzFf_R4CNmfkZXz1Qbk6ccY6jwfqN52JMeee0e5ImFm7kk6fDHWqNUOIkW2tg_/s1600-h/image%25255B11%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh64v2itxAC6OgiLUK8vd60oyDGGhbzJRhz4biq0EbuVVQGpBSqOy8A88DCqWcza9B-6Ba6QhMiDVhHXc6ySmdB9bwUgqIn-s8ERKqitfIynEIsQHJg9F8vm9j-qTHDDhBonEK1/?imgmax=800" width="244" height="50"></a><br>Le message est passé : Notre culture française est trop timorée vis-à-vis des outils tiers : AvePoint, NewsGator, Yammer… Nos cousins Québecois ou Belges nous ont d’ailleurs martelé le message : Que ce soit en migration ou en contenu avancé (RBS et consors, social…), les outils tiers sont présents et performants.<br><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMK_MxKsIBjOxdh8qrT7lnA84BSrEIW8QVbFYb6ijT3COEQGkL0uMNaLL0G9NM3HlvlzOfneFEaXTg1wOtBva8XmMR4dtq-B3PDH4jRrihrfxEBhXiGJg7hqkwwIb98eSwWY4T/s1600-h/image%25255B17%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjk5UwrQKaS1OMVXQ1OfV9b8N8wtvh39xDYe997RqMQqKF7Qcqf0eIl2sUmlejZObXKh8Bun-PPSIlVTZoRZfDI5G_0OlqFP31J_AdXNCrstOy2Lz25_VRa1CoYzZviYBfJyHY4/?imgmax=800" width="244" height="49"></a><br>Un framework qui vous facilite la vie, couplé à des apps Auto-Hosted : 20 minutes de NAPA, SkyDrive Pro, votre éditeur JS préféré et c’est Byzance. (Désolé pour la relance Guillaume, mais il m’intéresse aussi grandement ce FWK <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Clignement d'œil" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI45YuhAvm4o2Sdsl_2P_xpIzMQEn6TB2LGDBn-bL4ge0W75r_NBxDVdmuCUm64QCsSqie_arG0wZbY0lSwujzR0p-42SovB_ASSEeuZx8z97yI6aR661p458Itx5kZ8jDA8J4/?imgmax=800"> )<br><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDTs8Z9brX69pNcQcXJOMmjX5EcO11oTkMxCL5GnW1-cY3fzIvHSBAi2uocWY15fDx-Av3HZiQPJkXc9xzhe-wVJYovO3XlxzhyrfeiGLvdA4ZyBLR55N4KPsp1IBr-1gdbfCQ/s1600-h/image%25255B20%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3pkQrMizBlM9VDoBpu7HTw04EoDC3NnIlwKT-DJF8caNlwRDcj3gmWDOfUrfBs_nfUd0BVc8qqFykV7FpZNkGqhYRGcgjSUyono4-hhSNGGpPL3l0eh4seVncEYxa8VWNkR5a/?imgmax=800" width="244" height="228"></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHB6ICmSEZxbwiKA1XAM19W7bpdE61rApUbESox-CgM-inZXQuQM6wvDJZVvZCnp9szz-GHjzYyMxAnBUpF2s5fEIVDut_LXCXi1ZoLD1jtiQiXg42uOGsGZ4hFriKZuV6Evkc/s1600-h/image%25255B23%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkUBoFy9ovjIJA52t3wj01OTEOypbZElXHB4agU7rFPfrUf6lD5Zrl3_HHzO0_eSDfrV3j85ShpVsrdha5NptOV_CC3TwzEq0FsNpHEpzsEBEFtvvirKgVX-NsqDqZLBbzj-3-/?imgmax=800" width="244" height="42"></a><br>LA session à ne pas rater : la nôtre ! Les apps Provider-Hosted (et la comparaison aux autres) pour déployer sans interrompre le portail et migrer “en moins de 5 minutes” votre applicatif ASP.NET “kivabien” <img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Sourire" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDjX0sEG188gNLu1-8EHMqUVPBaoKg45nU2YagFEbzjLe1T8nfibXLAcm4oUvz0hFSUOj9Ho1kMXVISUW7G7_tWRzKjgqYzS9uMwzqRDcTxJyXX9Whgk6_wNZb5j-Y3tFHK0SY/?imgmax=800"> Défi relevé.<br><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpnTxM8cP2nDlwANiscifjLgsl3RYDGXJ6TSlBRo66zyOX_Flyn2Ux45F4WV7oOBYKiZT30FzsWaR-Q5DocFJgsdpGkPGI965LdcWih_1kggX5CbaMIKezNDhORCrYxX6YALs2/s1600-h/image%25255B26%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_Z0YwxnxVenlxdjYmP5yTlRrwqUuv1QZC10rvTheniPntlnmvNI9YymZJMuFm1AB5hiXVekKuFwVVAz2M395t7faP6_KD0p5tqxuZURcXuk6Zzpt_NeopgQDtSOX8eYT75AMt/?imgmax=800" width="244" height="216"></a><br>Pas de secrets : Pour une mécanique bien huilée, Dev et IT (ou l’inverse) doivent travailler main dans la main. Pour ça l’industrialisation des procédés (par scripting massif), la séparation des rôles et une bonne dose de café et de bière sont nécessaires !<br><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5eGPiKyak10p73qCvmnnKqn53XKj9VXVBgSGz1N9x7dvoVI53bIIqL9vnr7WoUrJyglXEEATPP91NazKfSpSRCJV5ye9C-mbHTTWlRdE-tYPvKzcp2DV5BUuhd2D-aUPt7EXa/s1600-h/image%25255B29%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1ZzHNDB6Y7l6oFMzNxCS1Z_asPzSJ3hEtM5upBID86Yzj9C5zsV24rM3FMm6czQFk1OEPEag-Mon-8wVUXNhkZsbc5sZj7JmWROfSViWvvPJD5j3RRX-C2HYRxrHKOerJpPUF/?imgmax=800" width="244" height="96"></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkaqdpRuY1ydZI7CCyjGwctHZzsAUAp6CDBBXO3GePetVfx-JqDnhlDftkcnY-dR8YKQ5JR6oOFH8WEXdJJlyjHHxDWvZVwjOgXn0e2g-gzqKyzP0j0pBT1oGu_dNLVq8juJuF/s1600-h/image%25255B32%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizE4YwQAyCtPN-w_qRCFqY8dKKd7JsQ9mpmlg_dfCyJVFOGGCkzRAjzGyC4G4tR6zXFC8wVKXssQoTDuR2lzwLTVRzIn9-epg0Zoogh3-wdxNdECaWjBl0Q40yqz3z-JUzmls_/?imgmax=800" width="244" height="42"></a><br>La BI à l’honneur sur la J3 avec les "wow effects” des rendus clients direct sous Excel mais Performance Point Services et SSRS ont encore leur mot à dire avec des intégrations UI plus poussées et des temps de développement ultra-réduits grace au tabulaire qui supplante le cube dans les complexités moindres.<br><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWMF8IZ4KrV_FlI3lZty-2-b-nhWN8qF_Ki2N9v3tQeXPyfI7D35ff7Jr-oPfutzqGaUiuXuWOY3qfZ4LYeVaaCYVmvK8XzSeJ8LV1xC1vLAxZsuJP8Wc_RBN1aRtusGom8wOV/s1600-h/image%25255B35%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilUm6k1N-DWj0tI8Ib2b_SDxELJ0NscXSZhckTUgo8q1yCszPXr-b5qc2KmsxPN8NvlFaCwp-cnkNOnKtMnRcAuiqDYKrnO-MfnX5gcpIxtdYEBY0lsft-w_apgJkcpni0N5yq/?imgmax=800" width="244" height="42"></a><br>Du grand michael avec des chiffres mais pas trop, des exemples mais pas trop, des règles mais pas trop et un débit anglais rapide mais pas trop (sauf quelques fois <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Clignement d'œil" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI45YuhAvm4o2Sdsl_2P_xpIzMQEn6TB2LGDBn-bL4ge0W75r_NBxDVdmuCUm64QCsSqie_arG0wZbY0lSwujzR0p-42SovB_ASSEeuZx8z97yI6aR661p458Itx5kZ8jDA8J4/?imgmax=800"> ) Dimensionnez correctement vos plateformes, virtualisez, Always-Onisez mais faites-le intelligemment.<br><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhiFb27hesFAPKhUhocejkYlJeT9HhdTtyuwX_P2OgWzcL36vNA-ON0imKizZS22Spn6uagn8Z4kOqbdkNa9OHZHRxEX3TbAf-Y-ZqJGc-iBfRdPwKFrR066VavKnorpLbcRd8/s1600-h/image%25255B38%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4olMUUdHAofTjGjxXGFuCYKIHVuhoQdWr79_E_EQCIDjMXrrX8_lxFxo1DQWB9pUEjsR7eQh9th0Ct0NO4Xf3kMT4C5zD0IHJMR4Cz4ZhaFVfozXZYMyIcrAPre_gIKmM8_0i/?imgmax=800" width="244" height="177"></a><br>Pendant ce temps-là… On fait des apps pour le plaisir…<br><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_PvdwzklpXebb2yOVM1fRwKXGYLFbvR3WV8W5UB6Q6WtUk86T1UuuIWKfxWJ1T8KNLcubX6qwknX4_LGqdj8KdDVPvViEDlL7rfbQPQqcMUp6QwAxCDSs31vYL3u56dttYybG/s1600-h/image%25255B41%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2FWo_gEhficy81BMaDeuVLcPBcWijTGvtFgqr-GcgKTbvaPxehnZnNQlBYpUdhma-EDOU5F9uk16kKQwC9UT74PoSBMKzycySckWqDJl6FpBJrBNpNgouYeOMEsWVb4fD-NDt/?imgmax=800" width="244" height="58"></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjV-3K2g0zxhFTHXIjeLaoLgN-b-AP2cgeUtvJbVJArJKv-3csuVrkrZuX1fqEX45g3HLe2vowX42kzWn24Z_L4u_slxDhB1UcP0mpPiXvqqmJf3eTzxLug4ltpN-i7KSp57Rb/s1600-h/image%25255B44%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjtLedWrMv_dBQHy25-Q7oTfWD3ICZUoQCnlIObVgZYzTqxmATUCB2UD_4qvalczFxV3ZSoFwxLyQUXCY0HQ5KPkmMhRZnORMwsNeWL1qudFCvVlY6UNXF4aSxFQA1JCR-j7hL/?imgmax=800" width="244" height="44"></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimEmEKYex6dDiGiJ7uymDE0k4W0t93aCofqT6CmViadO-IYK6ZmGVftJ56pZv-iE-jEHVe89mNrrEGu0sKOVHOUj5ZB1IABFkPgxNH9dGb5z4-SKGD9FX5GDh-Hk3D0LEVSn9t/s1600-h/image%25255B47%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheNWG-Zo5vrmvkluFACOT3pj-I5ZM5lFEsr8RC0nEf2AZCje_ASz3frrkmjA6w0hecqlJH_oa2kibLOG4-4j-Gj3Gkw__yFijQtnZgEC6Ty9kDWpG-VASN3QyueddqYcvMSGJQ/?imgmax=800" width="244" height="192"></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9IHgCt2XL29znJokc2jYcUE3ZUqAQo9y_nmIkXgyX6OuK9Qn7xEKLpfdNIygx6yLe5VHTib9LrI-H1lu58Pbf-6fnrXzre0DK-DlcJ114WjJ4mI8_Enx3JWoFtv5X6QQTCWGy/s1600-h/image%25255B50%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicOCWYTrejJWa349SktERKuuhiZ2jvq6uqwcK9xlpK33v_Dv8i-QclcdRiLHVIVXZLm_U2QGjc2ZMYH6-tK3uA3EEm0VyV3vXQ2rw57EsUwqSZKll-JNBZK6_LUwH_DmxI3xG1/?imgmax=800" width="244" height="36"></a><br>Avalanche d’outils et de tips sur les 3 dernières sessions… (“Mais pourquoi n’y ai-je pensé avant ?”)<br>Au fait, je vous ai parlé du cloud ? (à part les apps Auto-Hosted) L’autre vedette de cette 3e journée :<br><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGmerpghmB2nmgu5bklt2TRTWcINZjvNrRiKXW5YpiytXYhCmZgb-jSZr-GofPbhwcxfPbeUhup5jMGhbFk4W58VhkgM_qWfUwuEM7ps7hJsizOEjyFUkmoTY1OsNFdzE8ARHO/s1600-h/image%25255B53%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuToNbnfh1j4skxOIAQyVm5IxyqSHMEB9vp52HlOnaMu9eEcfSA5KyufL2-8d06rn4Ceb6wjf36jF7gc99uXmgsLyyKDQ2rDogQWx32-rRCgaIUB_iViXayLJSABQ8HiyWq4px/?imgmax=800" width="244" height="200"></a><br>C’est le moment de s’y pencher si ce n’est pas déjà fait.<br>Bref, une conférence d’un beau niveau technique, des intervenants de qualité ET sympas et pas mal d’infos à collecter, assimiler, creuser… Rendez-vous l’année prochaine ! Thomas MERLYhttp://www.blogger.com/profile/03321069433241571560noreply@blogger.com1tag:blogger.com,1999:blog-11052318.post-85704588376191709822013-05-20T14:34:00.001+02:002013-05-20T14:35:00.262+02:00SharePoint 2013 – Intégration de vos applicatifs existants<p>La démo est prête ! Rendez-vous jeudi à 14h50 en salle 2 de la <a href="http://www.confsharepoint.com/">ConfSharePoint France 2013</a> pour y découvrir comment intégrer sans douleur (ou presque) ni péridurale vos applicatifs HTML / JS et ASP.NET existant dans votre portail SharePoint 2013 ; une heure sans trucage (de toutes façons, j’aurai des manches courtes).</p> <p>Une démo de CMS “kienvoiduboi” par <a href="http://www.paslatek.net/">Lionel LIMOZIN</a> et moi–même !</p> <p>Et si vous cherchez où vous vous trouvez, rendez-vous en salle 1 la veille même heure pour suivre Benoit et Lionel dans le périple mobilité “kidémontelodyssée”.</p> Thomas MERLYhttp://www.blogger.com/profile/03321069433241571560noreply@blogger.com0tag:blogger.com,1999:blog-11052318.post-64405158132699191512013-04-24T14:58:00.001+02:002013-04-24T14:58:39.181+02:00Conf’SharePoint – Rendez-vous le 23 mai chez Mickey !<p>Quel honneur ! J’aurai le plaisir de vous présenter comment “Développer pour SharePoint 2013 sans intrusion” jeudi 23 mai à 14h50 lors de la première Conf’SharePoint française !</p> <p>Pour ce baptême du feu, je serai <em>bizuthé</em> par <a href="http://www.paslatek.net/">Lionel LIMOZIN</a> et j’espère vous apporter les clés d’un développement d’App réussi.</p> <p>Tous les détails de la conf ici : <a title="http://www.confsharepoint.com/" href="http://www.confsharepoint.com/">http://www.confsharepoint.com/</a></p> <p>Je dispose également de places à tarif préférentiel. N’hésitez pas à me solliciter en commentaire.</p> Thomas MERLYhttp://www.blogger.com/profile/03321069433241571560noreply@blogger.com0tag:blogger.com,1999:blog-11052318.post-25577838453197149902013-04-08T10:53:00.001+02:002013-04-08T10:53:12.708+02:00Pense-bête–Tous les styles SharePoint<p>Parce qu’une psychopathe l’a déjà fait et que je ne retrouve jamais mon bookmark :</p> <p><a title="http://sharepointexperience.com/csschart/csschart.html" href="http://sharepointexperience.com/csschart/csschart.html">http://sharepointexperience.com/csschart/csschart.html</a></p> <p>Merci <img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Smile" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRIrj-R-cottE8meqrzA-42qcYMVfykhbcmjASJuqU4uC0H4nR4PTiNKWv2GJlmMc-EfuDKCJDfvIOmgfDGBfxtq6Qzk-tdpikUu7DItMRa9H1OM6H5p6Lhf-6R4f0SwHB50kV/?imgmax=800"></p> Thomas MERLYhttp://www.blogger.com/profile/03321069433241571560noreply@blogger.com0tag:blogger.com,1999:blog-11052318.post-78562204888319308612013-03-23T18:26:00.001+01:002013-03-23T18:28:41.603+01:00Office Web Apps–Le prérequis KB2592525 refuse de s’installer<p>Envie de voir vos miniatures dans la recherche et d’exploiter tout le potentiel de SharePoint 2013 “On Premise”, vous préparez votre serveur OWA sour Windows Server 2008 R2 SP1… Et Patatras : OWA vous réclame l’installation de la KB2592525 mais l’installation de celle-ci vous martèle que “This update is not applicable to your computer.”</p> <p>Et merci le forum Technet : <a title="http://social.technet.microsoft.com/Forums/en-US/winserversetup/thread/9827c20c-09ae-4963-bd82-7aabc6cd7565" href="http://social.technet.microsoft.com/Forums/en-US/winserversetup/thread/9827c20c-09ae-4963-bd82-7aabc6cd7565">http://social.technet.microsoft.com/Forums/en-US/winserversetup/thread/9827c20c-09ae-4963-bd82-7aabc6cd7565</a></p> <p>Après téléchargement / décompression du MSU dans un répertoire local (ici : C:\Temp), il suffit de lancer l’installation “à la main” :</p> <p><font face="Courier New">PS C:\Temp> .\Windows6.1-KB2592525-x64.msu /extract:C:\Temp\PKG<br>PS C:\Temp> Set-Location PKG<br>PS C:\Temp\PKG> pkgmgr.exe /n:Windows6.1-KB2592525-x64.xml</font></p> <p>L’installation d’OWA se déroule ensuite sans problème !</p> <div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:93c3af0e-53c0-45ba-b5de-b7dfb4f075e2" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px">Technorati Tags: <a href="http://technorati.com/tags/SharePoint+2013" rel="tag">SharePoint 2013</a>,<a href="http://technorati.com/tags/OWA" rel="tag">OWA</a>,<a href="http://technorati.com/tags/KB2592525" rel="tag">KB2592525</a>,<a href="http://technorati.com/tags/2592525" rel="tag">2592525</a></div> Thomas MERLYhttp://www.blogger.com/profile/03321069433241571560noreply@blogger.com0tag:blogger.com,1999:blog-11052318.post-58650988572997333442013-03-06T17:49:00.000+01:002013-03-06T17:51:06.789+01:00Perfidie du moteur XSL et déstructuration avec apply-templates<p>Un effet “amusant” découvert il y a peu et qui m’a couté quelques heures de recherche et de tests (avec un cache pour augmenter le “plaisir”) :</p> <p>Considérons la transformation XSL suivante :</p> <blockquote> <p><font face="Courier New">...</font></p> <p><font face="Courier New"><div class="Items"><br> <div class="Level0"><br> <xsl:apply-templates select="..."/><br> </div><br> <div class="Level1"><br> <xsl:apply-templates select="..."/><br> </div><br></div></font></p> <p><font face="Courier New">...</font></p></blockquote> <p>Lorsque les sélections contiennent toutes des éléments dans le flux d’entrée, tout se passe bien mais si la source du premier sélecteur (Level0) ne rencontre aucun candidat : patatras ! Le sous-flux retourné ressemble à :</p> <blockquote> <p><font face="Courier New"><div class="Items"><br> <div class="Level0"><br> <div class="Level1"><br> Des éléments...<br> </div><br> </div><br></div></font></p></blockquote> <p>La balise fermant le div “Level0” n’est injectée dans le flux de sortie qu’à la fin de celui-ci, causant éventuellement un décalage visuel sur un affichage HTML…</p> <p>Pour revenir à une situation cohérente, il faut ajouter la directive précisant la méthode sortie en tête de flux XSL :</p> <blockquote> <p><font face="Courier New"><xsl:stylesheet version="1.0" ...><br> <xsl:output method="html"/><br> ...</font></p></blockquote> <p>Et tout rentre dans l’ordre :</p> <blockquote> <p><font face="Courier New"><div class="Items"><br> <div class="Level0"><br> </div><br> <div class="Level1"><br> Des éléments...<br> </div><br></div></font></p></blockquote> <p>Si l’un d’entre vous a un début d’explication, je prends !</p> <p> <div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:d7c7f3c3-f6bd-4945-bc70-02154853d8a4" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px">Mots clés Technorati : <a href="http://technorati.com/tags/XSL" rel="tag">XSL</a>,<a href="http://technorati.com/tags/apply-templates" rel="tag">apply-templates</a>,<a href="http://technorati.com/tags/structure" rel="tag">structure</a>,<a href="http://technorati.com/tags/empty" rel="tag">empty</a></div></p> Thomas MERLYhttp://www.blogger.com/profile/03321069433241571560noreply@blogger.com0tag:blogger.com,1999:blog-11052318.post-63872671204661121322013-03-04T17:03:00.001+01:002013-03-04T17:03:37.476+01:00Appels aux Services Web SharePoint – Ne négligez aucune piste !<p>Un petit retour personnel sur un problème rencontré lors de l’appel aux services Web. Lorsque les détails de l’exception remontée semblent bien sibyllins :</p> <blockquote> <p>Exception of type 'Microsoft.SharePoint.SoapServer.SoapServerException' was thrown.</p></blockquote> <p>… et que l’accès au client pour augmenter le niveau de détail est difficile, il reste les logs SharePoint !</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgedKqTB5pvuGHeyP-5jtakStboD3GLfQfPyAN12-nc1u5wSuAJBVw4PWEdrgq3iJuEIEULOnhpsCUIUuhB197WR15OnmQBpUwaIV_-Qi7jjTL06AVIz35ZKYXr3-y1IH5N1vjI/s1600-h/SharePoint_Blog_ULS_Threshold%25255B3%25255D.png"><img title="SharePoint_Blog_ULS_Threshold" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="SharePoint_Blog_ULS_Threshold" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTI5c5s6rkmF8muWCUtz-Qh1FeY8MBsgtttiGBefHbuGsm1VjqTuMwGqAArrE6ylMeawHer5_wCBYMY4YeqjNCJZ5m09ZkohdgQA1RcB_tnpDMpt6kzksOrgJ21afUhHNIXjVR/?imgmax=800" width="548" height="253"></a></p> <p>Et le calvaire prend fin…</p> <p> <div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:58fd9699-a67b-468f-9507-6d8158a661a2" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px">Mots clés Technorati : <a href="http://technorati.com/tags/SharePoint" rel="tag">SharePoint</a>,<a href="http://technorati.com/tags/ULS" rel="tag">ULS</a>,<a href="http://technorati.com/tags/SOAPException" rel="tag">SOAPException</a></div></p> Thomas MERLYhttp://www.blogger.com/profile/03321069433241571560noreply@blogger.com0tag:blogger.com,1999:blog-11052318.post-56570392211309296342013-02-14T09:59:00.000+01:002013-02-14T10:00:04.391+01:00Redéfinition des styles riches et CSS multiples<p>Dans un souci permanent de la satisfaction client… Et pour respecter la charte, vous avez redéfini les styles d’édition de vos champs de texte riche (par exemple, en suivant : <a title="http://www.sharepointblues.com/2010/10/27/custom-styles-for-sharepoint-2010-rich-html-field/" href="http://www.sharepointblues.com/2010/10/27/custom-styles-for-sharepoint-2010-rich-html-field/">http://www.sharepointblues.com/2010/10/27/custom-styles-for-sharepoint-2010-rich-html-field/</a>).</p> <p>MAIS vous avez défini plusieurs feuilles de style CSS. Par exemple, pour pouvoir “compresser” vos feuilles CSS tout en gardant la possibilité d’utiliser la surcharge de thème proposée par SharePoint et pour laquelle il ne faut pas supprimer les commentaires, ce que la compression fait :) !</p> <p>Et là, Ô rage, Ô désespoir, le titre de vos styles disparait !</p> <p align="center"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgD0YSKyQdix8E4dnoq4fWLUrMIEiHgbXQ0zJ0ix_099otu_XasvIaP5YzI2dtC-He8RbmoPLMH5s2_1JOBCsdd23ZmRV0tkdXy_WnGdDXL0s_fW_7LT6CG6fA7LxoIOfkotDK/s1600-h/Capture_20130214_094715%25255B5%25255D.png"><img title="Capture_20130214_094715" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="Capture_20130214_094715" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8FwXgZz956Rypv-gFiOsge88ry7j5FfJTa8ZJxtPUgQ2k8WdOHMFR1befFmYk2XY8MwH7VKv2cpc0HMevyK5uQwxTvYJH1KSax7O5lgV7-cuDu0QDgyF_xLbt6RbNTFI_ycXz/?imgmax=800" width="403" height="189"></a></p> <p align="left">Quelques tests tendent à montrer que c’est le premier qui parle qui a raison ! Donc, la première occurrence de votre classe personnalisée DOIT définir l’attribut –ms-name !</p> <p align="left">Vérification, en plaçant le même nom partout (pas très pratique mais évite les effets de bord en cas de modification ultérieure…) :</p> <p align="center"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqd95P8mTLnt5YWm-c3AAdUqBRMQ6VCn28WBKDYv9FWwKvehKwRSXFTkGjI8joOO9sK-_SipTuGN47JQhIo5FZT3ZeyG7X5cRvRoGU2ZiMFrNgO2wUB1URO6UKoA-ZGBF5sXJD/s1600-h/Capture_20130214_095702%25255B2%25255D.png"><img title="Capture_20130214_095702" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="Capture_20130214_095702" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggFHUZvZkHbhORsWfZqLu368aiO87lnt75iq3o9Q-wGg2-QwqNwg0pXsfPc68KtSj1SlknI-lGKAACqYyb7Tt6Z6pK6J9rdi0OcsBU9FH2aG8zy4AVs_lG5A6ofeqJQXstPlG1/?imgmax=800" width="207" height="183"></a></p> <p align="center">TADAAAAAAA</p> <p align="left">Ca marche aussi pour le renommage des styles SharePoint par défaut : On peut chercher longtemps pourquoi le style semble s’appliquer alors que le nom n’est pas modifié :)</p> <p align="left">A vos marques, prêts, concevez ! <div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:e8f63206-af18-4a37-bbe3-bb62e4002479" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px">Mots clés Technorati : <a href="http://technorati.com/tags/SharePoint" rel="tag">SharePoint</a>,<a href="http://technorati.com/tags/Design" rel="tag">Design</a>,<a href="http://technorati.com/tags/CSS" rel="tag">CSS</a>,<a href="http://technorati.com/tags/-ms-name" rel="tag">-ms-name</a>,<a href="http://technorati.com/tags/Markup+Styles" rel="tag">Markup Styles</a></div></p> Thomas MERLYhttp://www.blogger.com/profile/03321069433241571560noreply@blogger.com0tag:blogger.com,1999:blog-11052318.post-90728125874224066872013-02-12T09:24:00.001+01:002013-02-12T09:24:22.304+01:00SharePoint Foundation 2013 - The SDDL string contains an invalid sid or a sid that cannot be translated<p>Vous installez votre serveur standalone pour vos inavouables desseins personnels et la vie vous semble rose. Quand tout à coup, lors de l’exécution du <em>SharePoint Product Configuration Tool</em>…</p> <blockquote> <p>The SDDL string contains an invalid sid or a sid that cannot be translated</p></blockquote> <p>Enfer, damnation, il n’y a pourtant rien de compliqué à cette installation basique !?</p> <p>Mais une installation SharePoint sans surprise n’a pas vraiment de saveur alors c’est parti pour la recherche des blogs… Et on tombe sur cet article : <a title="http://kancharla-sharepoint.blogspot.fr/2012/07/the-sddl-string-contains-invalid-sid-or.html" href="http://kancharla-sharepoint.blogspot.fr/2012/07/the-sddl-string-contains-invalid-sid-or.html">http://kancharla-sharepoint.blogspot.fr/2012/07/the-sddl-string-contains-invalid-sid-or.html</a></p> <blockquote> <p>Service running under Network Service account in workgroup environment is not supported.</p></blockquote> <p>Qu’à cela ne tienne, on y va pour les manipulations, au cas où :</p> <ol> <li>Exécution avec PowerShell sous contexte SharePoint de <code>psconfig.exe -cmd Configdb create SkipRegisterAsDistributedCacheHost </code>dans le répertoire BIN de la ruche SharePoint.</li> <li>Création d’un compte de Service (exemple : svcSPSearch) appartenant au moins au groupe WSS_ADMIN_WPG.</li> <li>Attacher un compte géré à ce compte de service, soit par la Central Admin, soit par powerShell : <font face="Courier New">New-SPManagedAccount –Credential (Get-Credential)</font>.</li> <li>Associer le compte au service de recherche. <strong>ATTENTION ! N’utilisez pas pour cela les propriétés de l’application de service car le compte n’est pas modifié. Utilisez la page <em>Service Accounts</em> de la rubrique <em>Security</em>.</strong></li> <li>Relancez le Configuration Wizard qui devrait se terminer correctement.</li></ol> <p>NB : Si une <code>NullReferenceException</code> se produit lors de l’appel à <code>Microsoft.SharePoint.SPEvaluatorModeProvisioner.IsProvisioned()</code>, assurez-vous que vos applications web comportent au moins une collection de site. <div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:dd0d5227-0cc6-4c53-a750-ea371c43a9ce" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px">Mots clés Technorati : <a href="http://technorati.com/tags/SharePoint" rel="tag">SharePoint</a>,<a href="http://technorati.com/tags/2013" rel="tag">2013</a>,<a href="http://technorati.com/tags/Installation" rel="tag">Installation</a>,<a href="http://technorati.com/tags/SDDL" rel="tag">SDDL</a>,<a href="http://technorati.com/tags/invalid+SID" rel="tag">invalid SID</a>,<a href="http://technorati.com/tags/standalone" rel="tag">standalone</a></div></p> Thomas MERLYhttp://www.blogger.com/profile/03321069433241571560noreply@blogger.com0tag:blogger.com,1999:blog-11052318.post-66643698971568018922012-05-03T15:48:00.000+02:002012-05-03T15:48:06.104+02:00Reporting Services - Toolbox "Report Data"Parce que je l'oublie tout le temps :)... La toolbox Report Data est accessible depuis le menu "view"...<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhayOi5aPRa9Ys_PbLmlfFSQ34NW0n2rU9hwzuUwNwHauMIRfrh9CwI4hl_uDYw0Et9eLuRH8nJbbxgCGYQ9L-aYbafMHv81RM_FtRL1AW5CmabKHbxKxjvzEOVTfcaNCkFsB1U/s1600/Toolbox_ReportData.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhayOi5aPRa9Ys_PbLmlfFSQ34NW0n2rU9hwzuUwNwHauMIRfrh9CwI4hl_uDYw0Et9eLuRH8nJbbxgCGYQ9L-aYbafMHv81RM_FtRL1AW5CmabKHbxKxjvzEOVTfcaNCkFsB1U/s320/Toolbox_ReportData.png" width="179" /></a></div>
<br />Thomas MERLYhttp://www.blogger.com/profile/03321069433241571560noreply@blogger.com0tag:blogger.com,1999:blog-11052318.post-35935625542265560542012-05-02T11:43:00.000+02:002012-05-02T11:43:27.508+02:00Linq to SQL : Impossible de sauvegarder (WHERE 0 = 1 et ChangeConflictException)<div style="font-family: Verdana,sans-serif;">
<span style="font-size: small;">Scénario gênant : Vous avez modifié votre modèle de données et votre DBML et depuis, impossible de sauvegarder !</span></div>
<blockquote class="tr_bq">
<div style="font-family: Verdana,sans-serif;">
<span style="font-size: small;">"Row not found or changed." / ChangeConflictException</span></div>
</blockquote>
<div style="font-family: Verdana,sans-serif;">
<span style="font-size: small;">Le profiler vous montre d'aileurs un pédant "WHERE 0 = 1"...</span></div>
<div style="font-family: Verdana,sans-serif;">
<br /></div>
<div style="font-family: Verdana,sans-serif;">
<span style="font-size: small;">Dans ce cas : </span></div>
<div style="font-family: Verdana,sans-serif;">
<span style="font-size: small;">Recontrôlez votre dbml et votre table : un nvarchar ne serait-il pas devenu varchar ? Les tailles et les facteurs NULL / NOT NULL correspondent-ils bien tous ? Vous en êtes sûr ? ;)</span></div>Thomas MERLYhttp://www.blogger.com/profile/03321069433241571560noreply@blogger.com0tag:blogger.com,1999:blog-11052318.post-54282310672500547432012-04-04T18:39:00.000+02:002012-04-04T18:39:25.350+02:00SharePoint - Value does not fall within the expected range.<div style="font-family: "Trebuchet MS",sans-serif;">Une petite erreur agaçante... Vous avez développé un bout de code qui récupère la valeur d'un champ d'une liste SharePoint.</div><div style="font-family: "Trebuchet MS",sans-serif;">Bien entendu, le code est sécurisé par la vérification de la présence du champ pour afficher un beau message au responsable du paramétrage :</div><div style="font-family: "Trebuchet MS",sans-serif;"><pre>if (currentListItem.Fields.ContainField(seekedFieldName)) ...</pre></div><div style="font-family: "Trebuchet MS",sans-serif;"><br />
</div><div style="font-family: "Trebuchet MS",sans-serif;">Seulement voilà, tout semble bien se passer, le champ est trouvé mais dès la récupération de la valeur :</div><div style="font-family: "Trebuchet MS",sans-serif;"><pre>currentListItem[seekedFieldName]</pre></div><blockquote class="tr_bq"><div style="font-family: "Trebuchet MS",sans-serif;">ArgumentException : Value does not fall within the expected range.</div></blockquote><div style="font-family: "Trebuchet MS",sans-serif;"><br />
</div><div style="font-family: "Trebuchet MS",sans-serif;">On peut même chercher à récupérer l'ID du champ, on l'obtient correctement et sans souci mais :</div><div style="font-family: "Trebuchet MS",sans-serif;"><pre>currentListItem[seekedFieldId]</pre></div><blockquote class="tr_bq"><div style="font-family: "Trebuchet MS",sans-serif;">ArgumentException : Value does not fall within the expected range.</div></blockquote><div style="font-family: "Trebuchet MS",sans-serif;"><br />
</div><div style="font-family: "Trebuchet MS",sans-serif;">Si vous filtrez la récupération de vos <span style="font-family: "Courier New",Courier,monospace;">SPListItems</span> par une <span style="font-family: "Courier New",Courier,monospace;">SPView</span>, ne cherchez pas plus loin : <span style="font-family: "Courier New",Courier,monospace;">SPListItem.Fields.Contains</span> se base sur la <span style="font-family: "Courier New",Courier,monospace;">SPList</span>, de même que la récupération de l'ID. En revanche, la récupération de la valeur se fait sur ce qui est retourné par la <span style="font-family: "Courier New",Courier,monospace;">SPView</span>. Ajoutez le champ à la vue de filtrage... Et hop !</div>Thomas MERLYhttp://www.blogger.com/profile/03321069433241571560noreply@blogger.com0