Dans le précédent post, je vous avais montré à quoi ressemblait la liste de Quizz que j'avais crée :
Or si vous regardez bien le champ question, il est un peu particulier...c'est loin d'être un champ Titre classique (le contenu est en italique et en gras)
Mais avant d'expliquer en détail comment obtenir ce genre de champ, voyons ce qui a été précédemment réalisé (cf post précédents, ici et là) :
- Création d'une feature QuizzFields qui définit 4 champs : Réponse, Choix, Catégorie et Question.
- Création d'une feature QuizzContentType qui définit le type de contenu regroupant ces 4 champs
Seulement je ne vous ai pas tout montré lors du dernier post, en effet le fichier elements.xml correspondant à QuizzField définit des champs supplémentaires :
QuizzFields > elements.xml
1: <?xml version="1.0"?>
2: <Elements xmlns="http://schemas.microsoft.com/sharepoint/">
3: ...
4: <Field ID="{7BCDA1EC-2484-4703-8288-4990D03551E6}"
5: Name="QuizzQuestionNoMenu"
6: SourceID="http://schemas.microsoft.com/sharepoint/v3"
7: StaticName="QuizzQuestionNoMenu"
8: Group="Demo"
9: ReadOnly="TRUE"
10: Type="Computed"
11: DisplayName="$Resources:Quizz,Quizz_Field_Question;"
12: Dir=""
13: DisplayNameSrcField="QuizzQuestion"
14: AuthoringInfo="$Resources:core,Linked_Item;">
15: <FieldRefs>
16: <FieldRef ID="{3bfd9f63-3c57-4a0d-b22a-3ed324150348}" Name="QuizzQuestion"/>
17: </FieldRefs>
18: <DisplayPattern>
19: <IfNew>
20: <HTML><![CDATA[<IMG Style='float:right;' SRC="/_layouts/[%=System.Threading.Thread.CurrentThread.CurrentUICulture.LCID%]/images/new.gif" alt="]]></HTML>
21: <HTML>$Resources:core,new_gif_alttext</HTML>
22: <HTML><![CDATA[">]]></HTML>
23: </IfNew>
24: <HTML><![CDATA[<a onfocus="OnLink(this)" href="]]></HTML>
25: <URL/>
26: <HTML><![CDATA[" ONCLICK="GoToLink(this);return false;" target="_self">]]></HTML>
27: <Column Name="QuizzQuestion" Default="$Resources:core,NoTitle"/>
28: <HTML><![CDATA[</a>]]></HTML>
29: </DisplayPattern>
30: </Field>
31: <Field ID="{CAC4431D-FBFD-41A0-9F3A-C1FBC2FDB223}"
32: Name="QuizzQuestionMenu"
33: SourceID="http://schemas.microsoft.com/sharepoint/v3"
34: StaticName="QuizzQuestionMenu"
35: Group="Demo"
36: ReadOnly="TRUE"
37: Type="Computed"
38: DisplayName="$Resources:Quizz,Quizz_Field_Question;"
39: DisplayNameSrcField="QuizzQuestion"
40: ClassInfo="Menu"
41: AuthoringInfo="$Resources:core,Linked_Item_With_Menu;">
42: <FieldRefs>
43: <FieldRef ID="{3bfd9f63-3c57-4a0d-b22a-3ed324150348}" Name="QuizzQuestion"/>
44: <FieldRef ID="{7BCDA1EC-2484-4703-8288-4990D03551E6}" Name="QuizzQuestionNoMenu"/>
45: <FieldRef ID="{3c6303be-e21f-4366-80d7-d6d0a3b22c7a}" Name="_EditMenuTableStart"/>
46: <FieldRef ID="{2ea78cef-1bf9-4019-960a-02c41636cb47}" Name="_EditMenuTableEnd"/>
47: </FieldRefs>
48: <DisplayPattern>
49: <FieldSwitch>
50: <Expr>
51: <GetVar Name="FreeForm"/>
52: </Expr>
53: <Case Value="TRUE">
54: <Field Name="QuizzQuestionNoMenu"/>
55: </Case>
56: <Default>
57: <Field Name="_EditMenuTableStart"/>
58: <Field Name="QuizzQuestionNoMenu"/>
59: <Field Name="_EditMenuTableEnd"/>
60: </Default>
61: </FieldSwitch>
62: </DisplayPattern>
63: </Field>
64: </Elements>
Ce qui revient à dire tout simplement à SharePoint de créer 2 champs liés à QuizzQuestion :
- QuizzQuestionNoMenu affichera la question avec un lien vers la page d'information
- QuizzQuestionMenu affichera QuizzQuestionNoMenu mais avec un menu contextuel

Vous l'aurez compris, dans l'exemple ci dessus, il s'agit simplement d'englober le champ qui nous interesse par EditMenuTableStart et EditMenuTableEnd.
Une fois les champs définis, il ne me reste plus qu'à créer ma définition de liste de la façon suivante :
Créons une définition basé sur une liste personnalisé (copier-coller basique provenant du répertoire C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\TEMPLATE\FEATURES\CustomList)
- Préciser que cette liste utilisera le ContentType Quizz
- Rajouter les champs d'affichage (QuizzQuestionMenu et QuizzQuestionNoMenu) dans la section <Fields>
- Rajouter les champs désirés (QuizzQuestionMenu, QuizzChoices, QuizzAnswers, QuizzCategory) dans la section <Views><View><ViewFields>
Et le tour est joué ! enfin c'est vite dit, voilà le bout d'XML tronqué (sinon le fichier fait dans les 4000 lignes):
QuizzListDefinition > schema.xml
1: <?xml version="1.0" encoding="utf-8"?>
2: <List Title="QuizzListDefinition" FolderCreation="FALSE"
3: Direction="$Resources:Direction;" Url="Lists/Quizz List" BaseType="0">
4: <MetaData>
5: <ContentTypes>
6: <ContentTypeRef ID="0x010081DA7661E43E254B8B4F823AA9A3F578"/>
7: <ContentTypeRef ID="0x0120" />
8: </ContentTypes>
9: <Fields>
10: <!-- Copier coller des champs QuestionMenu et NoMenu -->
11: </Fields>
12: <Views>
13: <View BaseViewId="0" Type="HTML"><!-- ... --></View>
14: <View BaseViewID="1" Type="HTML" WebPartZoneID="Main"
15: DisplayName="$Resources:core,objectiv_schema_mwsidcamlidC24;"
16: DefaultView="TRUE" SetupPath="pages\viewpage.aspx"
17: ImageUrl="/_layouts/images/generic.png" Url="AllItems.aspx">
18: <!-- ... -->
19: <ViewFields>
20: <FieldRef Name="QuizzQuestionMenu" />
21: <FieldRef Name="QuizzChoices" />
22: <FieldRef Name="QuizzAnswers" />
23: <FieldRef Name="QuizzCategory" />
24: </ViewFields>
25: <Query><!-- ... --></Query>
26: </View>
27: </Views>
28: <Forms><!-- ... --></Forms>
29: </MetaData>
30: </List>
QuizzListDefinition > elements.xml
1: <?xml version="1.0" encoding="utf-8"?>
2: <Elements Id="ac51712b-36a6-4afc-bf95-efee98b8ddb0" xmlns="http://schemas.microsoft.com/sharepoint/">
3: <ListTemplate
4: Name="QuizzListDefinition"
5: DisplayName="$Resources:Quizz,Quizz_List_Definition_DisplayName;"
6: Type="10042"
7: Description="$Resources:Quizz,Quizz_List_Definition_Description;"
8: BaseType="0"
9: OnQuickLaunch="TRUE"
10: SecurityBits="11" />
11: </Elements>
QuizzListDefinition > feature.xml
1: <Feature xmlns="http://schemas.microsoft.com/sharepoint/"
2: Id="65E774A0-0B40-4341-B694-429B61A6EE15"
3: Title="$Resources:FeatureTitle;"
4: Description="$Resources:FeatureDescription;"
5: Scope="Site"
6: Hidden="True"
7: DefaultResourceFile="_Res"
8: Version="1.0.0.0">
9: <ElementManifests>
10: <ElementManifest Location="elements.xml" />
11: </ElementManifests>
12: </Feature>
Il ne reste plus qu'à activer la feature et tout celles dont elle dépend et vous pourrez créer votre ... ou presque.
En effet, les habitués des definitions de liste savent très bien que la déclaration du fichier schema.xml ne fonctionnera pas. Le fait de réferencer le ContentType (<ContentTypeRef ID="0x010081DA7661E43E254B8B4F823AA9A3F578"/>) n'est pas suffisant pour faire le lien entre le ContentType et la liste, il faudrait mettre en plus les colonnes de site du ContentType dans les champs de la liste... les dupliquer en quelque sorte...
Et bien, non. Il existe une solution ! J'en parlerai dans le prochain post :)
<Philippe/>