Content Type
Création de Content Type par Feature
08/01/2010
5174 lectures
6 commentaires
3.5/5 (2 votes)
Créer un content type via l'interface utilisateur de SharePoint n'est pas bien compliqué, mais il est important de pouvoir le faire via feature pour améliorer le processus de déploiement. Il est donc possible de déployer des content type via des features. Commencez donc par ouvrir Visual Studio 2010, lancez la création d'un nouveau projet de type Content Type et nommez-le "MyContentType".
Déployez cette feature dans le "bac à sable" en laissant la première option cliquée. L'écran suivant vous permettra de choisir de quel Content Type vous désirez hériter. Choisissez alors "Élément" (ou "Item") pour dériver du content type élément contenant juste la colonne Title.
Cliquez alors sur Finish pour finaliser la création de votre Content Type. Dans l'arborescence de votre solution, vous verrez qu'un élément appelé ContentType1 a été crée. Nous allons le renommer pour plus de simplicité. Cliquez donc une fois sur cet élément et modifiez sa propriété FolderName sur "MyContentType".
Dans l'état actuel des choses, votre solution comporte un fichier Elements.xml contenant ce code :
Ce code correspond simplement à la définition d'un content type vide héritant du content type Item. Avant d'aborder l'explication de ce code, nous nous devons de parler un peu de l'héritage des content types. Comme vous le savez, un content type personnalisé hérite tout le temps d'un autre. Il faudra donc symboliser ce lien d'une manière ou d'un autre. Celle choisie par Microsoft a été de lier les deux content type grâce à leur ID.
Dans notre exemple, l'ID de notre Content type est le suivant : 0x01009a59d3f8336a435d8e5352f6d9541a4d. En fait, c'est assez simple. De base, l'héritage d'un Content Type se fait de la sorte :
[ID du content type Parent]00[nouveau GUID sans les tirets]
La question qui se pose maintenant est de savoir comment connaitre l'ID du Content Type parent. Pour cela, il y a deux manières. La première est d'ouvrir le fichier C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\FEATURES\ctypes\ctypeswss.xml. Dans notre exemple, nous voulons hériter du content type Item, nous localisons donc celui-ci et voyons qu'il correspond à la déclaration suivante :
L'ID de ce content type est donc 0x01. Si nous revenons à notre ID (0x01009a59d3f8336a435d8e5352f6d9541a4d), vous pouvez remarquer que celui-ci est composé de 0x01, suivi de 00, suivi d'un GUID sans les tirets. Cela indique donc que notre content type dérive du content type Item. L'autre façon de connaitre l'ID d'un content type est via l'UI. Ouvrez donc votre site SharePoint et allez dans les paramètres de votre site. Repérez ensuite "Types de contenu de site" (Site content types) et repérez l'ID du content type duquel vous désirez hériter. Cliquez par exemple sur le content type Document et vous verrez que l'url de la page chargée ressemblera à ceci :
http://pc-de-ssougnez/_layouts/ManageContentType.aspx?ctype=0x0101&Source=http%3A%2F%2Fpc%2Dde%2Dssougnez%2F%5Flayouts%2Fmngctype%2Easpx
Le plus important étant bien évidemment la valeur de l'élément ctype. Ici, nous voyons que l'ID du content type Document est 0x0101. Dériver de ce content type formerait donc un ID du genre 0x010100GUID.
Revenons maintenant à la déclaration de votre content type personnel. Nous avons tout d'abord l'attribut Name qui va permettre de définir le nom de notre content type. Renommez le en "My Content Type". L'attribut Group nous permet de définir le nom du groupe dans lequel notre content type s'ajoutera. Si ce nom identifie un groupe existant, il se placera dedans, sinon, le groupe sera créé. Modifiez donc cet attribut sur "My Content Type Group". Nous avons ensuite bien évidemment l'attribut Description permettant de donner une description de notre Content Type. Modifiez la valeur de cette attribut sur "My content type deployed by a feature.". Enfin, nous avons l'attribut Version permettant de définir la version de notre content type. Au final, votre content type devrait ressembler à celui-ci :
L'étape suivante va bien évidemment consister à ajouter des champs à ce content type. L'élément FieldRefs va permettre de contenir des références aux champs contenus dans ce content type. Bien que ce dernier hérite du content type Item, il est nécessaire de faire une référence au champ Title, malgré que celui-ci soit déjà contenu dans le content type Item. Les deux éléments nécessaires pour faire une référence à des colonnes de site sont l'ID et le nom de ces colonnes. Bien entendu, dans notre cas, il est bien plus simple d'ouvrir à nouveau le fichier ctypes.xml, de localiser le content type Item et de copier/coller le contenu de ses FieldRefs dans le nôtre. Ainsi, nous récupérons l'élément suivant :
Comme vous le voyez, nous utilisons bien l'ID et le nom de la colonne pour y faire référence. Bien entendu, cette référence est uniquement valide parce que la colonne existe déjà au niveau du site. Effectivement, si vous ouvrez le fichier C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\FEATURES\fields\fieldswss.xml, vous pourrez voir toute les colonnes de site déclarées nativement par SharePoint. Et dans ces colonnes, vous pourrez voir celle-ci :
Ce bout de code est la déclaration de la colonne Title. Vous remarquez que l'ID et le nom de cette colonne sont bien les même que ceux utilisés pour référencer cette colonne dans notre content type.
Nous ajoutons cependant quelques attributs à la référence pour indiquer le comportement de la colonne dans notre content type. L'attribut Required permet d'indiquer que le champ est obligatoire. Nous avons ensuite l'attribut ShowInNewForm permettant d'afficher ce champ dans la page de création d'un nouvel élément basé sur ce content type. Enfin, l'attribut ShowInEditForm fonctionne de la même manière mais pour la page d'édition des éléments.
Bien entendu, l'intérêt de créer des content type est bien évidemment de leur faire contenir des nouvelles colonnes de site. Nous allons donc créer 2 nouvelles colonnes de site pour notre content type. Ici, nous allons ajouter une colonne nommée "Identité" permettant de contenir l'identité d'une personne et une colonne "Sexe" permettant de choisir entre "Homme" ou "Femme".
La manière de créer une colonne de site est assez simple. Effectivement, il suffit simplement d'ajouter un élément Field dans le fichier Elements.xml. Par exemple, voici le code nécessaire à la création de la colonne de site nommée "Identité" :
Comme vous le voyez, c'est assez simple. Tout d'abord, nous utilisons l'attribut ID pour lui attribuer un nouveau GUID. Pour générer un nouveau GUID, il vous suffit de vous rendre sur le site http://www.newguid.com. Nous avons ensuite l'attribut Name et StaticName qui vont permettre de définir le nom de la colonne. Il est impératif de définir ces deux propriétés pour que la colonne soit correctement nommée. Remarquez qu'ici nous avons mis "Identité" en anglais. Effectivement, c'est une habitude que j'ai pris. SharePoint n'aime pas beaucoup recevoir des caractères accentués pour des noms internes de colonnes, il les transforme d'ailleurs tous en leur équivalent hexa-décimal. L'astuce consiste donc à mettre le nom des champs en anglais (pour éviter les caractères accentués) et de ne mettre aucun espace.
Les attributs suivants vont définir le comportement par défaut de notre colonne. Ainsi, le nom d'affichage de cette colonne sera "Identité" (attribut DisplayName). L'attribut Type va permettre de définir le type de la colonne. En l'occurrence, nous choisissons Text pour indiquer qu'il s'agit d'une colonne pouvant contenir une ligne de texte. Nous avons également l'attribut Required qui va permettre d'indiquer si le champ est obligatoire (true) ou non (false). Enfin, nous avons l'attribut Hidden qui va indiquer que le champ sera visible (si sa valeur est false).
Nous n'avons là qu'une petite partie de tous les attributs pouvant être spécifiés pour une colonne de site. Nous n'allons pas nous étendre sur ceux ci car il y en a trop. Vous pouvez cependant retrouver la liste des ces attributs ici.
Nous allons maintenant passer à la création de notre deuxième colonne qui contiendra le sexe de la personne. Tapez donc le code suivant en dessous de la déclaration de votre première colonne :
Ce bout de code va permettre de définir une colonne de type Choice. Ce type de colonne va devoir contenir une énumération qui va permettre de définir les différents éléments présentés par la liste déroulante. Ici, cette liste d'élément est introduite par l'élément CHOICES. Cet élément va contenir des élément CHOICE qui définiront chacun un élément de la liste. Il suffit de taper le nom de cet élément dans l'élément CHOICE. En dessous de l'énumération CHOICES, nous avons également un élément Default (facultatif) permettant d'indiquer le choix qui sera sélectionné par défaut par SharePoint.
A ce stade de notre développement il ne reste plus qu'une seule chose à faire. Référencer nos colonnes dans notre content type. Pour cela, il suffit de faire comme précédemment pour le champ Title. Tapez donc ceci dans l'élément FieldRefs de votre content type :
Ici, c'est exactement la même chose que précédemment. Effectivement, nous ne créons qu'une référence vers les deux colonnes que nous venons de créer en faisant passer leur ID et leur nom en valeur des attributs adéquats.
Déployez maintenant votre projet et créez une nouvelle liste sur votre site. Allez ensuite dans les paramètres de votre listes, choisissez "Advanced Parameter" (ou paramètres avancés) et autorisez la gestion des content types (première option). Dans les paramètres de la liste, cliquez alors sur "Ajouter à partir de types de contenu de site existants" (ou "Add from existing site content type") et ajoutez notre content type. Vous remarquez donc que le groupe "My Content Type Group" a bien été créé et que notre content type se trouve à l'intérieur.
Une fois notre content type ajouté à la liste, retournez dans celle-ci, cliquez sur "Éléments" dans le Ribbon et déroulez le menu "New" ("Nouveau").
Notre content type est bien pris en compte et apparaît maintenant comme option de création de l'élément. Cliquez donc sur l'option représentant notre content type pour voir l'écran suivant apparaître :
C'est donc bien les champs que nous avons définit dans notre content type qui apparaissent et vous pouvez voir que l'option "Femme" est automatiquement sélectionnée dans notre liste de choix.
Télécharger les sources de l'exemple
Déployez cette feature dans le "bac à sable" en laissant la première option cliquée. L'écran suivant vous permettra de choisir de quel Content Type vous désirez hériter. Choisissez alors "Élément" (ou "Item") pour dériver du content type élément contenant juste la colonne Title.
Cliquez alors sur Finish pour finaliser la création de votre Content Type. Dans l'arborescence de votre solution, vous verrez qu'un élément appelé ContentType1 a été crée. Nous allons le renommer pour plus de simplicité. Cliquez donc une fois sur cet élément et modifiez sa propriété FolderName sur "MyContentType".
Dans l'état actuel des choses, votre solution comporte un fichier Elements.xml contenant ce code :
Ce code correspond simplement à la définition d'un content type vide héritant du content type Item. Avant d'aborder l'explication de ce code, nous nous devons de parler un peu de l'héritage des content types. Comme vous le savez, un content type personnalisé hérite tout le temps d'un autre. Il faudra donc symboliser ce lien d'une manière ou d'un autre. Celle choisie par Microsoft a été de lier les deux content type grâce à leur ID.
Dans notre exemple, l'ID de notre Content type est le suivant : 0x01009a59d3f8336a435d8e5352f6d9541a4d. En fait, c'est assez simple. De base, l'héritage d'un Content Type se fait de la sorte :
[ID du content type Parent]00[nouveau GUID sans les tirets]
La question qui se pose maintenant est de savoir comment connaitre l'ID du Content Type parent. Pour cela, il y a deux manières. La première est d'ouvrir le fichier C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\FEATURES\ctypes\ctypeswss.xml. Dans notre exemple, nous voulons hériter du content type Item, nous localisons donc celui-ci et voyons qu'il correspond à la déclaration suivante :
L'ID de ce content type est donc 0x01. Si nous revenons à notre ID (0x01009a59d3f8336a435d8e5352f6d9541a4d), vous pouvez remarquer que celui-ci est composé de 0x01, suivi de 00, suivi d'un GUID sans les tirets. Cela indique donc que notre content type dérive du content type Item. L'autre façon de connaitre l'ID d'un content type est via l'UI. Ouvrez donc votre site SharePoint et allez dans les paramètres de votre site. Repérez ensuite "Types de contenu de site" (Site content types) et repérez l'ID du content type duquel vous désirez hériter. Cliquez par exemple sur le content type Document et vous verrez que l'url de la page chargée ressemblera à ceci :
http://pc-de-ssougnez/_layouts/ManageContentType.aspx?ctype=0x0101&Source=http%3A%2F%2Fpc%2Dde%2Dssougnez%2F%5Flayouts%2Fmngctype%2Easpx
Le plus important étant bien évidemment la valeur de l'élément ctype. Ici, nous voyons que l'ID du content type Document est 0x0101. Dériver de ce content type formerait donc un ID du genre 0x010100GUID.
Revenons maintenant à la déclaration de votre content type personnel. Nous avons tout d'abord l'attribut Name qui va permettre de définir le nom de notre content type. Renommez le en "My Content Type". L'attribut Group nous permet de définir le nom du groupe dans lequel notre content type s'ajoutera. Si ce nom identifie un groupe existant, il se placera dedans, sinon, le groupe sera créé. Modifiez donc cet attribut sur "My Content Type Group". Nous avons ensuite bien évidemment l'attribut Description permettant de donner une description de notre Content Type. Modifiez la valeur de cette attribut sur "My content type deployed by a feature.". Enfin, nous avons l'attribut Version permettant de définir la version de notre content type. Au final, votre content type devrait ressembler à celui-ci :
L'étape suivante va bien évidemment consister à ajouter des champs à ce content type. L'élément FieldRefs va permettre de contenir des références aux champs contenus dans ce content type. Bien que ce dernier hérite du content type Item, il est nécessaire de faire une référence au champ Title, malgré que celui-ci soit déjà contenu dans le content type Item. Les deux éléments nécessaires pour faire une référence à des colonnes de site sont l'ID et le nom de ces colonnes. Bien entendu, dans notre cas, il est bien plus simple d'ouvrir à nouveau le fichier ctypes.xml, de localiser le content type Item et de copier/coller le contenu de ses FieldRefs dans le nôtre. Ainsi, nous récupérons l'élément suivant :
Comme vous le voyez, nous utilisons bien l'ID et le nom de la colonne pour y faire référence. Bien entendu, cette référence est uniquement valide parce que la colonne existe déjà au niveau du site. Effectivement, si vous ouvrez le fichier C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\FEATURES\fields\fieldswss.xml, vous pourrez voir toute les colonnes de site déclarées nativement par SharePoint. Et dans ces colonnes, vous pourrez voir celle-ci :
Ce bout de code est la déclaration de la colonne Title. Vous remarquez que l'ID et le nom de cette colonne sont bien les même que ceux utilisés pour référencer cette colonne dans notre content type.
Nous ajoutons cependant quelques attributs à la référence pour indiquer le comportement de la colonne dans notre content type. L'attribut Required permet d'indiquer que le champ est obligatoire. Nous avons ensuite l'attribut ShowInNewForm permettant d'afficher ce champ dans la page de création d'un nouvel élément basé sur ce content type. Enfin, l'attribut ShowInEditForm fonctionne de la même manière mais pour la page d'édition des éléments.
Bien entendu, l'intérêt de créer des content type est bien évidemment de leur faire contenir des nouvelles colonnes de site. Nous allons donc créer 2 nouvelles colonnes de site pour notre content type. Ici, nous allons ajouter une colonne nommée "Identité" permettant de contenir l'identité d'une personne et une colonne "Sexe" permettant de choisir entre "Homme" ou "Femme".
La manière de créer une colonne de site est assez simple. Effectivement, il suffit simplement d'ajouter un élément Field dans le fichier Elements.xml. Par exemple, voici le code nécessaire à la création de la colonne de site nommée "Identité" :
Comme vous le voyez, c'est assez simple. Tout d'abord, nous utilisons l'attribut ID pour lui attribuer un nouveau GUID. Pour générer un nouveau GUID, il vous suffit de vous rendre sur le site http://www.newguid.com. Nous avons ensuite l'attribut Name et StaticName qui vont permettre de définir le nom de la colonne. Il est impératif de définir ces deux propriétés pour que la colonne soit correctement nommée. Remarquez qu'ici nous avons mis "Identité" en anglais. Effectivement, c'est une habitude que j'ai pris. SharePoint n'aime pas beaucoup recevoir des caractères accentués pour des noms internes de colonnes, il les transforme d'ailleurs tous en leur équivalent hexa-décimal. L'astuce consiste donc à mettre le nom des champs en anglais (pour éviter les caractères accentués) et de ne mettre aucun espace.
Les attributs suivants vont définir le comportement par défaut de notre colonne. Ainsi, le nom d'affichage de cette colonne sera "Identité" (attribut DisplayName). L'attribut Type va permettre de définir le type de la colonne. En l'occurrence, nous choisissons Text pour indiquer qu'il s'agit d'une colonne pouvant contenir une ligne de texte. Nous avons également l'attribut Required qui va permettre d'indiquer si le champ est obligatoire (true) ou non (false). Enfin, nous avons l'attribut Hidden qui va indiquer que le champ sera visible (si sa valeur est false).
Nous n'avons là qu'une petite partie de tous les attributs pouvant être spécifiés pour une colonne de site. Nous n'allons pas nous étendre sur ceux ci car il y en a trop. Vous pouvez cependant retrouver la liste des ces attributs ici.
Nous allons maintenant passer à la création de notre deuxième colonne qui contiendra le sexe de la personne. Tapez donc le code suivant en dessous de la déclaration de votre première colonne :
Ce bout de code va permettre de définir une colonne de type Choice. Ce type de colonne va devoir contenir une énumération qui va permettre de définir les différents éléments présentés par la liste déroulante. Ici, cette liste d'élément est introduite par l'élément CHOICES. Cet élément va contenir des élément CHOICE qui définiront chacun un élément de la liste. Il suffit de taper le nom de cet élément dans l'élément CHOICE. En dessous de l'énumération CHOICES, nous avons également un élément Default (facultatif) permettant d'indiquer le choix qui sera sélectionné par défaut par SharePoint.
A ce stade de notre développement il ne reste plus qu'une seule chose à faire. Référencer nos colonnes dans notre content type. Pour cela, il suffit de faire comme précédemment pour le champ Title. Tapez donc ceci dans l'élément FieldRefs de votre content type :
Ici, c'est exactement la même chose que précédemment. Effectivement, nous ne créons qu'une référence vers les deux colonnes que nous venons de créer en faisant passer leur ID et leur nom en valeur des attributs adéquats.
Déployez maintenant votre projet et créez une nouvelle liste sur votre site. Allez ensuite dans les paramètres de votre listes, choisissez "Advanced Parameter" (ou paramètres avancés) et autorisez la gestion des content types (première option). Dans les paramètres de la liste, cliquez alors sur "Ajouter à partir de types de contenu de site existants" (ou "Add from existing site content type") et ajoutez notre content type. Vous remarquez donc que le groupe "My Content Type Group" a bien été créé et que notre content type se trouve à l'intérieur.
Une fois notre content type ajouté à la liste, retournez dans celle-ci, cliquez sur "Éléments" dans le Ribbon et déroulez le menu "New" ("Nouveau").
Notre content type est bien pris en compte et apparaît maintenant comme option de création de l'élément. Cliquez donc sur l'option représentant notre content type pour voir l'écran suivant apparaître :
C'est donc bien les champs que nous avons définit dans notre content type qui apparaissent et vous pouvez voir que l'option "Femme" est automatiquement sélectionnée dans notre liste de choix.
Télécharger les sources de l'exemple







6 commentaires
Thibault a dit:
Merci richard.
La solution où il faut faire "retrait" de la solution puis fermer et ré-ouvrir la solution à fonctionner chez moi pour le problème de GUID.
Richard a dit:
Il suffit d'entouré l'ID des "Field" par des accolades {}.
Il subsiste des bug concernant ce problème : http://support.microsoft.com/kb/2022443
Richard a dit:
Pareil, même erreur ... quelqu'un as une solution ?
thegritch a dit:
j'ai le même soucis.
j'ai eu beau changer les ID des champs : cela n'a rien fait : blocage.
Si vous avez des idées ou des pistes je suis preneur .. je sèche un peu là :)
Cdt !
Pogo a dit:
stsadm -o installfeature -filename "DOSSIERDELAFEATURE/feature.xml" -force
L'option -force permet de supprimer la feature si elle existe déjà.
Puis pour activer la feature, avec l'option force également :
stsadm -o activatefeature -filename "DOSSIER DELAFEATURE/feature.xml" -url "hachetteépée://monserveur/sites/monsite" -force
Yosh a dit:
C'est clair merci pour ces infos.
Par contre, le déploiement ne fonctionne qu'une fois...
Il semble que visual studio ne retrait pas les colonnes de site en base.
A chaque fois j'ai le message d'erreur suivant:
Une erreur s'est produite lors de l'étape de déploiement 'Activer les fonctionnalités' : Le champ avec l’ID {ff8b5dcf-a0e8-405a-a128-fdd0054774e5} défini dans la fonctionnalité {ce5248e2-c3ec-434c-890c-15759be4c0d8} a été trouvé dans la collection de sites active ou dans un sous-site.
Une idée de se qu'il faut faire?
Merci d'avance
Ajouter un commentaire