lundi 17 juin 2013

Package and deploy page layout and master page for SharePoint 2013

There is a lot of new parameters available in the new SharePoint 2013 about page layouts and master page packaging and deployment.

Provision a page layout in sharepoint 2013


A couple of things have changed. The new markup that SharePoint itself uses for provisioning a page layout file looks like this:
Note: you can check this by creating a design package via the new Design Manager, and check the content that has been generated.

Provision a published version 

How to Provision Your Master Pages

For provision master pages, the same approach as discussed above can be used. The only difference will be the properties you're going to provide. The properties that I use in my elements file the following:

vendredi 14 juin 2013

SharePoint Get Convivial URL for a specific Term by Label

You can use the following function in order to retrieve the convivial url associated for a specific term if you use the navigation thanks to the termstore in sharepoint 2010 and 2013


        /// Get convivial URL for a specific term using Label
        /// </summary>
        /// <param name="navigation_Group_Name">Navigation group name for the site collection</param>
        /// <param name="navigation_TermSet_Name">Termset name used for termstore navigation</param>
        /// <param name="navigation_Nom_Term">Name of the term you want to retrieve</param>
        /// <param name="navigation_default_url">Default url used if none term match the label filter</param>
        /// <param name="site"></param>
        /// <returns>site relative convival url   /</returns>
        public static string GetUrlConvivialForTerm(
            string navigation_Group_Name,
            string navigation_TermSet_Name, 
            string navigation_Nom_Term, 
            string navigation_default_url,
            SPSite site)
        {
            string url = string.Empty;
            //Utiliser SPContext SPContext.Current.Site
            TaxonomySession session = new TaxonomySession(site, false);
            TermStore store = session.TermStores[0];
            CacheManager cm = new CacheManager();
            TermSet tHE = TermManager.GetTermSet(navigation_Group_Name, navigation_TermSet_Name, site.RootWeb.Url);

            NavigationTermSet navTermSet = NavigationTermSet.GetAsResolvedByWeb(tHE, site.RootWeb,
                           StandardNavigationProviderNames.GlobalNavigationTaxonomyProvider);

            IEnumerable<NavigationTerm> terms = navTermSet.Terms.Where(t => t.GetTaxonomyTerm().Name.Equals(navigation_Nom_Term));
           
            if(terms != null)
            {
                NavigationTerm term = terms.FirstOrDefault();
                if (term != null)
                {
                    url = term.GetWebRelativeFriendlyUrl();
                }
            }

            if(url.Equals(string.Empty))
            {
                return navigation_default_url;
            }
            else
            {
                return url;
            }
        }

mardi 21 mai 2013

Ajouter l'icone PDF et la recherche dans les fichiers PDF sur SharePoint 2013 / Add pdf file icon and parse to SharePoint 2013


Tutoriel pour l'installation de iFilter ainsi que l'ajout de l'icone PDF:
  1. Télécharger l'icone depuis le site : http://www.adobe.com/misc/linking.html#pdficon
  2. Ajouter les icones au répertoire : C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\TEMPLATE\IMAGES
  3. Modifier le fichier DOCICON.XML situé dans le dossier C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\TEMPLATE\XML
  4. Ajouter l'entrée suivante au fichier : <Mapping Key="pdf" Value="pdficon_small.png"/>
  5. Effectuer un redémarrage du serveur web : IISRESET
Intrégration des fichiers PDF à la recherche:
Télécharger et installer:

Récupérer l'url convivial d'une page depuis le magasin des termesSharePoint 2013. / Get friendly url using cache and performanceoptimization

SharePoint permets de gérer la navigation d'un site via les friendly-url ou url convivial, lors de développement de webParts il est donc important de faire le lien entre une page physique (/Pages/article-1.aspx) et son url convivial ( /mon-Article)

Voici un exemple complet d'utilisation du cache serveur ainsi que la récupération de l'url convivial d'une page.

jeudi 16 mai 2013

Try and like it Win Acer and Xbox 360

Merci pour le coup de pouces et des cadeaux à gagner (Tablettes + 5 xbox) sur :
https://www.tryandlikeit.fr/faites-le-show/?d=08ba9b65-a437-43c1-b9fc-4f59421349dd

Et pour participer au concours voici le lien :
https://www.tryandlikeit.fr/inscrivez-vous/?d=7037c27d-465b-4299-8c39-bfd1e7107a3d

Sharepoint 2013 Online utilisation des états. create KPI in SharePoint for business intelligence

Dans ce tutoriel nous allons créer une liste d'état basé sur plusieurs listes SharePoint.

Rendez vous dans un premier dans la page du contenu de site de votre site.

Puis ajouter une nouvelle liste personnalisée. (add new custom list)


Et nommer la liste "Etats", rendez vous dans les paramètres de la liste.


Cliquez sur paramètres avancés
Et cliquez sur "Autoriser la gestion des types de contenu" (enable content types)

Ajoutez ensuite le type de contenu en cliquant sur "Ajouter à parti de types de contenu de site existants" (add existing content type)



Ajoutez le type de contenu "Indicateur basé sur les listes SharePoint" depuis la catégorie "Business Intelligence". Cliquez sur "Modifier l'ordre et le type de contenu par défaut sur le bouton Nouveau" en décocher le type de contenu élément de sorte à ne pouvoir stocker que les indicateurs dans cette liste.



Résumons les différentes actions menées pour la création de la liste d'états:
- Ajout d'une liste personnalisée
- Activation de la gestion des types de contenu sur la liste
- Ajout du type de contenu "Indicateur basé sur les listes SharePoint" depuis la catégorie "Business Intelligence"

A cette étape du tutoriel nous disposons d'une liste permettant de stocker nos indicateurs (KPI).

Ajoutons maintenant une liste personnalisée que j'appelerai "Congés", ajouter une colonne de type choix nommée "Catégorie congés" contenant les choix :
- Congés payés
- Congés maladie
- Congés familial
- Congés sans solde
- Autres congés

Deux colonnes existantes "Date de début" et "Date de fin" depuis la catégorie "Colonne de bases", et enfin une colonne "Description".

Rendez les colonnes "Date de début", "Date de fin", "Catégorie congés" comme obligatoires.

















Ajoutez maintenant une colonne intitulé "Nombre" avec comme type "Valeur calculée"
Et pour formule :   "=[Date de fin]-[Date de début]"
Supprimez finalement la colonne "Titre" de l'affichage de la liste par défaut.


Ajoutez ensuite à la liste 3 éléments avec les valeurs suivantes :

A cette étape du tutoriel nous avons désormais la liste qui va nous servir de sources de données pour nos indicateurs.

Rendez vous maintenant dans la liste des états et ajouter un nouvel élément.
Avec :
Nom : Indicateurs de congés sans solde
Description : Indique le rapport entre les congés sans solde et les congés payés
Url de la liste : /sites/project/rh/Lists/Congs (url de votre liste)

Affichage : Tous les éléments
Calcul de la valeurPourcentage d'éléments de liste dans l'affichage où
Catégorie congés égale à Congés sans solde
Règles d'icône d'état : les meilleurs valeurs sont supérieurs à
Afficher OK lorsque la valeur est égale ou supérieure à l’objectif
: 35

Afficher Avertissement lorsque la valeur est égale ou supérieure à l’avertissement : 25

Afficher Problème autrement

SharePoint 2013 Managed Meta data .csv and Setting site navigation to use taxonomy using PowerShell and Custom Property

You can import .csv file using the following powershell function, you can after launch the function with the following parameters:

webApplication URL
CSV file path
Group Term Name

In order to set the managed metadata Navigation you have to set the option in "Navigation" menu.

Param(
 [Parameter(Mandatory=$True,Position=1)]
 [string]$WebAppUrl,
 [Parameter(Mandatory=$True,Position=2)]
 [string]$CSVFilePath,
 [Parameter(Mandatory=$True,Position=3)]
 [string]$TermGroupName
)

Add-PSSnapin Microsoft.SharePoint.PowerShell -erroraction SilentlyContinue

function ImportTermSet([Microsoft.SharePoint.Taxonomy.TermStore]$store, [string]$groupName, [PSCustomObject]$termSet) { 
   function ImportTerm([Microsoft.SharePoint.Taxonomy.Group]$group,
                       [Microsoft.SharePoint.Taxonomy.TermSet]$set,
                       [Microsoft.SharePoint.Taxonomy.Term]$parent,
                       [string[]]$path) {       
     if ($path.Length -eq 0) {
       return
     }
      elseif ($group -eq $null)
       {
       $group = $store.Groups | where { $_.Name -eq $path[0] }
       if ($group -eq $null)
       {
         $group = $store.CreateGroup($path[0])
       }
      }
      elseif ($set -eq $null)
       {
       $set = $group.TermSets | where { $_.Name -eq $path[0] }
       if ($set -eq $null)
        {
         $set = $group.CreateTermSet($path[0])
        }
        $set.SetCustomProperty("_Sys_Nav_IsNavigationTermSet", "True")
     }
      else
       {
       $node = if ($parent -eq $null) { $set } else { $parent }
       $parent = $node.Terms | where { $_.Name -eq $path[0] }      
       if ($parent -eq $null -and $path -ne $null -and $path[0] -ne $null) {
         $parent = $node.CreateTerm($path[0], 1036)
        #Debut Menu
        if($_.MenuID -ne "" -and $parent  -ne $null )
        {
            $parent.SetLocalCustomProperty("Menu ID", $_.MenuID)
        }
        if($_.Menu_Particulier -ne "" -and $parent  -ne $null )
        {
            $parent.SetLocalCustomProperty("Menu Particulier", $_.Menu_Particulier)
        }
        if($_.Menu_Professionnel -ne "" -and $parent  -ne $null )
        {
            $parent.SetLocalCustomProperty("Menu Professionnel", $_.Menu_Professionnel)
        }
        if($_.SousTitre -ne "" -and $parent  -ne $null )
        {
            $parent.SetLocalCustomProperty("Sous Titre", $_.SousTitre)
        }
        if($_.TitreAccueil -ne "" -and $parent  -ne $null )
        {
            $parent.SetLocalCustomProperty("Titre accueil", $_.TitreAccueil)
        }
        if($_.SousTitreAccueil -ne "" -and $parent  -ne $null )
        {
            $parent.SetLocalCustomProperty("Sous titre accueil", $_.SousTitreAccueil)
        }
        if($_.Picto -ne "" -and $parent  -ne $null )
        {
            $parent.SetLocalCustomProperty("Picto", $_.Picto)
        }
        #Fin Menu
        #Debut colonne
        if($_.ColonneID -ne "" -and $parent  -ne $null )
        {
            $parent.SetLocalCustomProperty("Colonne ID", $_.ColonneID)
        }
        if($_.ClasseTitreColonne -ne "" -and $parent  -ne $null )
        {
            $parent.SetLocalCustomProperty("Classe titre colonne", $_.ClasseTitreColonne)
        }
        if($_.TitreColonne -ne "" -and $parent  -ne $null )
        {
            $parent.SetLocalCustomProperty("Titre colonne", $_.TitreColonne)
        }
        #Fin colonne
        #Debut lien
        if($_.LienID -ne "" -and $parent  -ne $null )
        {
            $parent.SetLocalCustomProperty("Lien ID", $_.LienID)
        }
        if($_.SousTitreLien -ne "" -and $parent  -ne $null )
        {
            $parent.SetLocalCustomProperty("Sous titre lien", $_.SousTitreLien)
        }
        #Fin lien
        #Debut rubrique
        if($_.RubriqueID -ne "" -and $parent  -ne $null )
        {
            $parent.SetLocalCustomProperty("Rubrique ID", $_.RubriqueID)
        }
        if($_.BaliseRubriqueIcon -ne "" -and $parent  -ne $null )
        {
            $parent.SetLocalCustomProperty("Balise rubrique icone", $_.BaliseRubriqueIcon)
        }
        if($_.ClasseIconRubrique -ne "" -and $parent  -ne $null )
        {
            $parent.SetLocalCustomProperty("Classe icone rubrique", $_.ClasseIconRubrique)
        }
        if($_.TitreIcon -ne "" -and $parent  -ne $null )
        {
            $parent.SetLocalCustomProperty("Titre icone", $_.TitreIcon)
        }
        if($_.SousTitreIcon -ne "" -and $parent  -ne $null )
        {
            $parent.SetLocalCustomProperty("Sous titre icone", $_.SousTitreIcon)
        }
        if($_.ClasseLien -ne "" -and $parent  -ne $null )
        {
            $parent.SetLocalCustomProperty("Classe lien", $_.ClasseLien)
        }
        if($_.TitreLien -ne "" -and $parent  -ne $null )
        {
            $parent.SetLocalCustomProperty("Titre lien", $_.TitreLien)
        }
        if($_.EmphaseTitre -ne "" -and $parent  -ne $null )
        {
            $parent.SetLocalCustomProperty("Emphase titre", $_.EmphaseTitre)
        }
        if($_.ParentRubriqueID -ne "" -and $parent  -ne $null )
        {
            $parent.SetLocalCustomProperty("Parent rubrique ID", $_.ParentRubriqueID)
        }
        if($_.ClasseSousTitre -ne "" -and $parent  -ne $null )
        {
            $parent.SetLocalCustomProperty("Classe sous titre", $_.ClasseSousTitre)
        }
        if($_.ClasseParagrapheEnglobantLien -ne "" -and $parent  -ne $null )
        {
            $parent.SetLocalCustomProperty("Classe paragraphe englobant lien", $_.ClasseParagrapheEnglobantLien)
        }
        #Fin rubrique
        if($_.Ordre -ne "" -and $parent  -ne $null )
        {
            $parent.SetLocalCustomProperty("Ordre", $_.Ordre)
        }
        if($_.ClasseCSS -ne "" -and $parent  -ne $null )
        {
            $parent.SetLocalCustomProperty("Classe CSS", $_.ClasseCSS)
        }
        if($_.Visible -ne "" -and $parent  -ne $null )
        {
            $parent.SetLocalCustomProperty("Visible", $_.Visible)
        }
        if($_.Type -ne "" -and $parent  -ne $null )
        {
            $parent.SetLocalCustomProperty("Type", $_.Type)
        }
        if($_.PlanSite -ne "" -and $parent  -ne $null )
        {
            $parent.SetLocalCustomProperty("PlanSite", $_.PlanSite)
        }
       }
     }

     ImportTerm $group $set $parent $path[1..($path.Length)]
         Commit $store 2>&1 | out-null
   }

   function RemoveTermGroup([Microsoft.SharePoint.Taxonomy.TermStore]$store, [string]$groupName) {
     $group = $store.Groups | where { $_.Name -eq $groupName }
     if ($group -ne $null) {
       $group.TermSets | foreach { $_.Delete() }
       $group.Delete()
       $store.CommitAll()
     }
   }
   function Commit($store) {
     $store.CommitAll()
   }

   $termSetName = $termSet[0]."Term Set Name"
   $termSet | where { $_."Level 1 Term" -ne "" } | foreach {
     $path = @($groupName, $termSetName) + @(for ($i = 1; $i -le 5; $i++) {
       $term = $_."Level $i Term"
         if ($term -eq "") {
           break
         } else {
           $term
         }
       }
     )
     ImportTerm -path $path
     $ErrorActionPreference = "Continue";
   }
   }

$session = [Microsoft.SharePoint.Publishing.Navigation.TaxonomyNavigation]::CreateTaxonomySessionForEdit($web)
$store = $session.TermStores[0]
$termSet = Import-csv $CSVFilePath
ImportTermSet $store $TermGroupName $termSet

$store.CommitAll()

lundi 13 mai 2013

Change SPWeb Properties, CreateFriendlyUrlsForNewPages and CreateFriendlyUrlsForNewPages for SharePoint 2013 Navigation

Use the following Powershell in order to change the behavior of the managed navigation when you create a new page. Replace whether by true or false in order to fit the needs.


Add-PSSnapin Microsoft.SharePoint.PowerShell -erroraction SilentlyContinue
$site = Get-SPSite $siteUrl;

$site.AllWebs | foreach {

$webNav = $_.Properties["_webnavigationsettings"];
$webNav ;

#Replace  AddNewPagesToNavigation="True"  and  CreateFriendlyUrlsForNewPages="True" 


$webNav = $webNav.Replace('AddNewPagesToNavigation="True"','AddNewPagesToNavigation="False"');
$webNav = $webNav.Replace('CreateFriendlyUrlsForNewPages="True"','CreateFriendlyUrlsForNewPages="False"');
$_.Properties["_webnavigationsettings"] = $webNav;
$_.Properties.Update();
$_.Update();
}



lundi 29 avril 2013

Cache et perfomances SharePoint 2013

Plan for caching and performance in SharePoint Server 2013

Learn about the BLOB cache, Bit Rate Throttling, and other SharePoint features that can improve browser performance.

For a publishing site for which most of the visitors are anonymous or where most of the files are static content, enable the BLOB cache for as many file types as possible.

Using BLOB cache in a high traffic environment, and if you will use ULS logging, consider placing the BLOB cache on a separate physical drive from the ULS log — not on a separate partition. Storing the BLOB cache and the ULS log on the same drive can result in poor server performance.

Each front-end web server has its own local copy of the BLOB cache that is built as requests for files are received. If you use load balancing with multiple front-end web servers, each server contains its own cache.

By default, the BLOB cache is set to 10 gigabytes (GB). Allow at least 20 percent more space on the drive than the size of the cache. For example, if you have 100 GB of content, set the size of the cache to 120 GB on a drive that has at least 150 GB of space. If the BLOB cache is too small, serving files to users slows, reducing the performance of your site.

http://technet.microsoft.com/en-us/library/ee424404.aspx

Cache settings operations in SharePoint Server 2013

Learn about the available caches and the settings that can be configured for the BLOB cache, cache profiles and object cache settings.

http://technet.microsoft.com/en-us/library/cc261797.aspx

Monitor cache performance in SharePoint 2013

Learn how to monitor the SharePoint BLOB cache, the ASP.NET output cache, and the SharePoint object cache.

http://technet.microsoft.com/en-us/library/ff934623.aspx

Configure cache settings for a web application in SharePoint Server 2013

Learn how to configure the BLOB cache, page output cache profiles, and the object cache for a web application.

http://technet.microsoft.com/en-us/library/cc770229.aspx

Create a Data Collector Set to Monitor Performance Counters

You can create a custom Data Collector Set containing performance counters and configure alert activities based on the performance counters exceeding or dropping below limits you define.

http://technet.microsoft.com/en-us/library/cc722414.aspx

mardi 23 avril 2013

Premiers pas sur Office 365 et SharePoint 2013 Online

Création de votre site

Une offre d'essai permet de créer un compte sur Office 365 pendant 30 jours, tout ce qu'il vous suffit c'est une adresse mail Microsoft (hotmail /outlook /live).

http://msdn.microsoft.com/fr-fr/library/fp179924.aspx#o365_signup



Une fois votre compte créé il ne reste plus qu'à vous rendre sur votre portail avec le compte créé ( @onmicrosoft.com)



Votre première application

Commençons par nous rendre sur l'administration SharePoint


Rendez-vous ensuite sur la première collection de sites SharePoint 2013 online créée par défaut dont l'URL est https://angama.sharepoint.com dans mon cas puisque mon domaine est 'angama'

Vous voici donc sur votre site SharePoint 2013 dédié au développement d'application.

Nous allons nous intéresser en premier lieu à l'ajout d'application à votre portail et plus particulièrement aux liste de tâches.
Dans la partie paramètres située en haut à droite de votre site cliquez sur "Ajouter une application".


Une fois dans la galerie des applications, cliquez sur le modèle de liste "Tâches" et nommez votre liste "Planning".


Une fois la liste créée vous vous retrouvez sur la page "Contenu de site" avec la liste "Planning" correctement créée.
La prochaine étape consistera à populer cette liste et modifier l'affichage de celle-ci.

Ajoutez du contenu à la liste en vous servant du formulaire d'ajout et ajoutez les tâches à la vue chronologique.


Nous allons maintenant ajouter cette vue à la page principale de notre site, revenez à la page d'accueil du site en cliquant sur le logo SharePoint 2013 en haut à gauche de la page.

Cliquez ensuite sur "Page" et enfin sur "Modifer la page".


 Depuis l'onglet "Insérer" cliquez sur "Composant WebPart", il vous suffit maintenant de chercher l'application correspondant à la liste "Planning" et de l'ajouter à la page.

Voici le résultat final en ajoutant à gauche la WebPart Planning et sur la droite cette même WebPart en filtrant les résultats sur "Mes tâches".


Libre à vous de modifier l'affichage de la page notamment en changeant le thème de votre de site et en le renommant.

Le prochain tutoriel portera sur la navigation grâce au magasin des termes, les URL conviviales et le SEO (search engine optimization).

vendredi 1 mars 2013

Modify Site Collection URL SharePoint 2010

In order to rename a Site collection in SharePoint 2010 you need to backup the site first and restore it on an new Site collection.
To do that you can use the following PowerShell :
Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue 
  
#Get the Source Site Collection URL
$sourceURL = Read-Host “Enter the Source Site Collection URL:”
  
#Get the Target Site Collection URL
$targetURL = Read-Host “Enter the Destination Site Collection URL”
  
#Location for the backup file 
$backupPath = Read-Host “Enter the Backup File name & location (E.g. c:\temp\Source.bak):”
  
#Backup the source site collection
Backup-SPSite $sourceURL -Path $backupPath -force
  
#Delete source Site Collection 
Remove-SPSite -Identity $sourceURL -Confirm:$false
  
#Restore Site Collection to new URL
Restore-SPSite $targetURL -Path $backupPath -Confirm:$false
  
#Remove backup files
Remove-Item $backupPath
  
write-host "Process Completed!"


vendredi 15 février 2013

Windows 8 : Open a local file and read Xml content

Thanks to this tutorial you will learn how to open an Xml File located in you Solution Explorer and how to retrieve value.

We will use Linq on Xml file so you have to add the following  librairies to your projet :


using System.Xml.Linq;
using Windows.Data.Xml.Dom;
using Windows.Storage;


Add a folder named 'Data' for exemple into you Windows Store solution and add the following Xml content into the file 'Schools.xml':

<?xml version="1.0" encoding="utf-8" ?>
<school>
  <name>IUT Toulouse</name>
  <type>Public</type>
  <location>
    <X>45.1</X>
    <Y>32.5</Y>
  </location>
</school>

And into a EventHandler or in the Page_Load for example add the folowing code :

Windows.Storage.StorageFolder storageFolder =await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFolderAsync("Data"); StorageFile storageFile =await storageFolder.GetFileAsync("Schools.xml"); IAsyncOperation<IRandomAccessStream> stream = await storageFile.OpenAsync(FileAccessMode.Read); XmlDocument xmlDoc = await XmlDocument.LoadFromFileAsync(storageFile); XDocument doc = XDocument.Parse(xmlDoc.GetXml()); string name = from schools in doc.Descendants("name") select schools.Value;string type = from schools in doc.Descendants("type") select schools.Value;

At the end of the code the variables  name and type contains the value retrieve in the xml file.





jeudi 7 février 2013

Windows 8 par où commencer ?

Voici quelques liens qui peuvent vous aidez à prendre en main windows 8 aussi bien niveau usage que développement :


Le top 10 des App :
http://www.pcworld.com/article/2012988/10-windows-8-apps-you-should-download-first.html


Génération App Microsoft avec les offres en cours et les concours:
http://www.generationapp.com/code/#fbid=FcBScBurfJr


Vos ressources de développement avec Microsoft code pour windowsApp:
http://code.msdn.microsoft.com/windowsapps

Comment concevoir vos applications et les rendre #1:
http://msdn.microsoft.com/library/windows/apps/hh779072/


Utilisation de la barre d'application suivant le context:
http://blogs.msdn.com/b/windowsappdev/archive/2012/09/06/embracing-ui-on-demand-with-the-app-bar.aspx

mercredi 30 janvier 2013

How to log directly into EventLog server (Observateurs d'événements)

Every application can write into the server event log diary thanks to a C# class called "System.Diagnostics.EventLog"

In order to log message you have to instanciate one object of this class and specify two important elements Source and Log

Log will define the category in which your message will appear, you can use 'Application' 'Security' 'Installation' and so on.

Source define the name of the application that log the message, you can use your application name for example.


And the C# code to log into the diary event :


private static string SourceLog = "MyApplicationName";
private static string LogApp = "Application";
private static System.Diagnostics.EventLog eventLogApplication;

/// <summary>
/// Log the message into the Windows event log diary
/// </summary>
/// <param name="message">Message</param>
static void Log( string message )
{
     Log( message, System.Diagnostics.EventLogEntryType.Information );
}

/// <summary>
/// Log the message into the Windows event log diary
/// </summary>
/// <param name="message">Message enregistré</param>
/// /// <param name="entryType">Entry type</param>
static void Log( string message, System.Diagnostics.EventLogEntryType entryType )
{
     try
     {
          //Initialisation
          if (!System.Diagnostics.EventLog.SourceExists(SourceLog))
         {
              System.Diagnostics.EventLog.CreateEventSource(SourceLog, LogApp);
         }
         if (eventLogApplication == null)
        {
             eventLogApplication = new System.Diagnostics.EventLog();
             ((System.ComponentModel.ISupportInitialize)(eventLogApplication)).BeginInit();
             eventLogApplication.Source = SourceLog;
              eventLogApplication.Log = LogApp;
        }

        //Writing
        eventLogApplication.WriteEntry(message, entryType);
   }
    catch (Exception e)
    {
        Log("Error Log : " + e.InnerException + " " + e.Message, EventLogEntryType.Error);
      }
}

lundi 28 janvier 2013

BeMyApp dev kings 2013

L'initiative BeMyApp continue son petit bonhomme de chemin et propose un nouveau défi pour les fan de développement :

http://pitchyourapp.eventbrite.fr/

Source : BeMyApp.fr

DEV KINGS 2013 - On remet ça !
Edition spéciale app'citoyenne

Venez développer vos applications citoyennes et participez au concours des DEV KINGS 2013.
Choisissez la localité à représenter, créez votre team et développez vos app' !


2 MOIS POUR DEVELOPPER LA MEILLEURE APP'CITOYENNE
Le 12 février
Soirée Pitch Your App, lancement du concours. Pitchez vos idées, rencontrez votre équipe de développeurs, porteurs d'idées, designers et autres super pouvoirs.

Du 12 février au 12 avril
Sessions de coaching Microsoft, développez à l'aide des experts Microsoft vos applications en deux mois.

Weekend du 12 au 14 avril
DEV KINGS 2013inscrivez-vous et venez terminer vos applications avec vos équipes en 48h ! Participez à la grande finale, soumettez vos applications sur Windows Store et passez un WeekEnd de folie dans l'Under d'EPITECH.


INSCRIVEZ-VOUS ICI A LA SOIREE PITCH YOUR APP
Mardi 12 février Chez Régine, venez créer votre équipe à la soirée Pitch Your App

Le but de cette soirée est de mettre en relation des personnes qui ont des idées d'applications, des développeurs et des designers pour créer des applications citoyennes sous Windows 8 et Windows Phone.
Vous avez une super idée d'application, mais pas les compétences, c'est le moment de vous inscrire pour la pitcher et trouver votre team. 
Vous êtes développeurs, designers ou avez des compétences à apporter ? Alors participez au challenge pour rejoindre une équipe, trouvez des compétences complémentaires pour vos applis et gagnez des dotations Microsoft et Intel !

SharePoint 2013 : Log as an other user, add the custom action

Please follow the following step in order to activate the option 'Log as an other user'.

Open the file located in


C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\TEMPLATE\CONTROLTEMPLATES\Welcome.ascx

Add the following lines after the element « ID_RequestAccess » :

<SharePoint:MenuItemTemplate runat="server" ID="ID_LoginAsDifferentUser"
Text="<%$Resources:wss,personalactions_loginasdifferentuser%>"
 Description="<%$Resources:wss,personalactions_loginasdifferentuserdescription%>"
 MenuGroupId="100"
 Sequence="100"
 UseShortId="true"
 />
















And save the file.

You can now do a 'iisreset' and see the result as :


http://support.microsoft.com/kb/2752600


jeudi 24 janvier 2013

Sort DataTable DataView ascending with null or empty last.


You first need to specify the sorting column in 'param' and replace the original DataTable by 'collection'.

In this example I filter a DataTable with the SelectedValue given by my DropDownList control (ddlFiltre).

In the DataRow array 'nameNotNull' I simply simply the data that are not null for my parameter and sort them.
And in the DataRow array 'nameNull' I select the null data for my parameter.

You just need to merge the two DataRow array and bind it with the GridView

DataTable collection;
//Fill the dataTable
//...
///

protected void ddlFiltre_Change(object sender, EventArgs e){ 
  if (!string.IsNullOrEmpty(ddlFiltre.SelectedValue)) {   
       string param = "Name";
       DataRow[] nameNotNull = collection.Select(string.Format("{0} IS NOT NULL AND {0} <> ''", param),string.Format("{0} ASC", param));
       DataRow[] nameNull = collection.Select(string.Format("{0} IS NULL OR {0} = ''", param));
        DataTable collectionSorted = collection.Clone();
   if (nameNotNull.Length > 0)
   {
      foreach (DataRow dr in nameNotNull)
      {
         DataRow newRow = collectionSorted.NewRow();
         newRow.ItemArray = dr.ItemArray;
         collectionSorted.Rows.Add(newRow);
      }
      if (nameNull.Length > 0)
      {
         foreach (DataRow dr in nameNull)
         {
            DataRow newRow = collectionSorted.NewRow();
            newRow.ItemArray = dr.ItemArray;
            collectionSorted.Rows.Add(newRow);
         }
       }
    }
    else if (nameNull.Length > 0)
    {
       foreach (DataRow dr in nameNull)
       {
          DataRow newRow = collectionSorted.NewRow();
          newRow.ItemArray = dr.ItemArray;
          collectionSorted.Rows.Add(newRow);
       }
    }
    gvItems.DataSource = collectionSorted;
    gvItems.DataBind();
}
}

jeudi 10 janvier 2013

Modifier les pages SharePoint par défaut. (AccessDenied.aspx, Confirmation.aspx, Error.aspx, Login.aspx, RequestAccess.aspx, Signout.aspx, WebDeleted.aspx)

Il est possible d'avoir de modifier l'url des pages suivantes et de les surcharger pour intégrer le design de l'entreprise :
  •  AccessDenied (Specifies AccessDenied.aspx)
  •  Confirmation (Specifies Confirmation.aspx)
  •  Error (Specifies Error.aspx)
  •  Login (Specifies Login.aspx)
  •  RequestAccess (Specifies ReqAcc.aspx)
  •  Signout (Specifies SignOut.aspx)
  •  WebDeleted (Specifies WebDeleted.aspx)
Avec les classes correspondantes se trouvant dans le namespace : 


Microsoft.SharePoint.ApplicationPages



Il est aussi nécéssaire de modifier la masterpage de votre page d'application par :

MasterPageFile="~/_layouts/simple.master"

Et d'hériter la classe correspondante 

UnsecuredLayoutsPageBase pour AccessDenied.aspx par exemple.




La modification de ces pages peut ensuite se faire de deux manières, soit par code C# :

SPWebApplication.UpdateMappedPage(SPWebApplication.SPCustomPage.AccessDenied, 

"_layouts/MyAccessDenied.aspx);


Soit via powershell : 


Set-SPCustomLayoutsPage -Identity "AccessDenied" -RelativePath 

"/_layouts/MyAccessDenied.aspx" -WebApplication http://serveur 

Get-SPCustomLayoutsPage –Identity "AccessDenied" -WebApplication http://serveur 

iisreset


Voici une page complète d'une customisation simple de la page AccessDenied.aspx avec changement du lien 'Retour au site' par défaut : 



<%@ Assembly Name="Name, Version=1.0.0.0, Culture=neutral,PublicKeyToken=092c1c010b5e2820" %>
<%@ Import Namespace="Microsoft.SharePoint.ApplicationPages" %>
<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="asp" Namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="AccessDenied.aspx.cs" Inherits="AccessDenied" MasterPageFile="~/_layouts/simple.master" %>

<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Import Namespace="Microsoft.SharePoint.Publishing" %>
<%@ Import Namespace="System.Web" %>
<%@ Import Namespace="Microsoft.SharePoint.WebControls" %>

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        if (SPContext.Current != null && SPContext.Current.Web != null && SPContext.Current.Web.CurrentUser != null)
        {
            LabelUserName.Text = SPContext.Current.Web.CurrentUser.LoginName;
        }
     
        if (SPContext.Current != null && SPContext.Current.Web != null && SPContext.Current.Web.Site != null
            && SPContext.Current.Web.Site.WebApplication != null)
        {
         
            Page.ClientScript.RegisterStartupScript(this.GetType(), "click",
        "modifierRetour('" + SPContext.Current.Web.Site.WebApplication.Sites[0].Url + "');", true);
        }


   //     HLinkLoginAsAnother.Attributes.Add("onclick", "LoginAsAnother('\u002fsites\u002factuariat\u002f_layouts\u002fcloseConnection.aspx?loginasanotheruser=true', 1)");
    //    HLinkLoginAsAnother.NavigateUrl = "http://www.google.com/";
    }
    </script>

<asp:Content ID="PageHead" ContentPlaceHolderID="PlaceHolderAdditionalPageHead" runat="server">
    <style type="text/css"></style>
    <script type="text/javascript">
        function modifierRetour() {
            var backbutton = document.getElementById('ctl00_PlaceHolderGoBackLink_idSimpleGoBackToHome');

            if (backbutton != null) {
                backbutton.href = "javascript:history.back()"; // cacherBackToSite.arguments[0];
            }
        }
</script>
</asp:Content>

<asp:Content ID="Main" ContentPlaceHolderID="PlaceHolderMain" runat="server">
 
   <table border="0" cellpadding="0">
         <asp:Panel id="PanelUserName" runat="server">
         <tr>
       <td class="ms-sectionheader">
       <%--<img src="/_layouts/images/ListSet.gif" alt="" />--%>
       <SharePoint:EncodedLiteral ID="EncodedLiteral3" runat="server" text="<%$Resources:wss,accessDenied_currentuser%>" EncodeMethod='HtmlEncode'/>
       </td>
         </tr>
         <tr>
       <td valign="top" class="ms-descriptiontext"><SharePoint:EncodedLiteral ID="EncodedLiteral4" runat="server" text="<%$Resources:wss,accessDenied_loggedInAs%>" EncodeMethod='HtmlEncode'/>
       &#160;<b><asp:Label id="LabelUserName" runat="server"/></b>
       </td>
         </tr>
         </asp:Panel>
    </table>
</asp:Content>

<asp:Content ID="PageTitle" ContentPlaceHolderID="PlaceHolderPageTitle" runat="server">
 <SharePoint:EncodedLiteral ID="EncodedLiteral1" runat="server" text="Accès refusé au site demandé" EncodeMethod='HtmlEncode'/>
</asp:Content>

<asp:Content ID="PageTitleInTitleArea" ContentPlaceHolderID="PlaceHolderPageTitleInTitleArea" runat="server" >
    <SharePoint:EncodedLiteral ID="EncodedLiteral2" runat="server" text="Vous n'avez pas le droit de visualiser ce site." EncodeMethod='HtmlEncode'/>
</asp:Content>