none
[MOSS 2007] Maj d'une liste basée sur un content type RRS feed

  • Question

  • Bonjour,

    J'ai défini un nouveau content-type à l'aide d'une feature.
    Je peux maj mon content type en redéployant la feature.

    Cependant, si une liste basée sur ce content-type été créée, les colonnes de la liste ne sont pas mises à jour si le content-type change.

    J'ai essayé en implémentant une FeatureReceiver  
    web.ContentTypes[NOM_TYPE_CONTENU].Update(true);
    
    

     


    Est-ce possible de mettre à jour les colonnes d'une liste basée sur un content-type qui change?

    Merci d'avance !

    lundi 6 avril 2009 15:19

Réponses

Toutes les réponses

  • Bonjour,

    Est-ce que vous ajoutez/supprimez les colonnes ou est-ce que vous modifiez leurs caractéristiques ?
    http://blogs.developpeur.org/anouvel
    lundi 6 avril 2009 15:58
  • Je modifie les propriétés (Name, DisplayName) des Field qui composent le ContentType.

    Ces modifications sont déployés par desinstall/réinstall de la Feature. Le ContentType modifié est bien déployé.

    Dans l'interface MOSS, il y'a un bouton qui permet de propager les modifications aux colonnes de site. C'est cette action que je voudrai refaire par code, automatiquement, lors du déploiement de la Feature.

    lundi 6 avril 2009 16:10
  • Après avoir modifié l'objet SPField, appellez vous la méthode field.Update(true) ?


    http://blogs.developpeur.org/anouvel
    lundi 6 avril 2009 16:11
  • Non, en fait, je modifie le fichier elements.xml de la Feature.

    Ce fichier est composé d'une suite de définition de Field, et d'un ContentType qui référence ces fields.

    Lors du déploiement de la Feature, le ContentType et les colonnes de site sont bien mises à jours. Seules les colonnes des librairies documentaires qui référencent le ContentType ne sont pas mises à jour.  

    Mon seul code est celui indiqué plus haut, dans la méthode FeatureActivited
    lundi 6 avril 2009 17:33
  • Il faut dissocier les définitions XML du code correspondant au FeatureActivated.

    L'utilisation de la méthode Update devrait pourtant impacter les listes. Lorsque vous associez un ContentType à une liste, le ContentType que vous ciblez n'est pas réellement associé. Pourquoi ? Parce que lors de l'association, un nouveau ContentType est créé par SharePoint. Ce ContentType nouvellement créé hérité du ContentType d'origine que vous aviez sélectionné. Autrement dit, lorsque vous mettez à jour votre ContentType au niveau du site et que vous utilisez la méthode Update(true), les ContentTypes de liste sont également mis à jour, ce qui entraine la modification des colonnes des listes. Pour vous en persuader, regardez le ContentType au niveau d'une liste et au niveau du site. Dans chaque cas, l'URL contient l'identifiant du ContentType. Vous pourrez constater que l'ID du ContentType de liste est plus long que celui du site, mais qu'il a sa première partie en commun avec celui du site.

    Bref, puisque dans votre cas vos listes ne sont pas mises à jour, je suppose que votre Update(true) ne fonctionne pas. Si vous vous demandez pourquoi votre ContentType est mis à jour au niveau site, j'aurais tendance à dire que celà provient plutôt de vos définitons XML. Bref, il faut dissocier les deux pour ne pas s'emmeler :-)

    Interessons nous à la méthode Update :

    // Cas 1
    // web.ContentTypes[NOM_TYPE_CONTENU].Fields[...]
    web.ContentTypes[NOM_TYPE_CONTENU].Update(true);

    Je vous déconseille d'utiliser les objets SharePoint de cette façon mais plutôt comme suit :

    // Cas 2
    SPContentType ct = web.ContentTypes[NOM_TYPE_CONTENU];
    // ct.Fields[...]
    ct.Update(true);


    La raison est simple : lorsque vous accédez à vos objets au travers de collections, l'instance sur laquelle vous faites un Update n'est pas nécessairement celle que vous avez modifié (Cas 1 : vous modifiez une instance de votre ContentType, vous mettez à jour une autre instance de votre contentType). Reccupérez d'abord votre objet dans une variable (le cas 2 utilise la variable ct dans ce but), modifiez là puis mettez le à jour.


    Votre erreur ne vient pas nécessairement de là, mais c'est une possibilité à surveiller (tout dépend de votre solution complète en fait, l'intéraction XML + FeatureReceiver).

    Bon courage.
     


    http://blogs.developpeur.org/gribouillon/
    lundi 6 avril 2009 21:04
    Modérateur
  • Merci pour vos réponses.

    Je ne modifie pas les champs par code.
    Toutes les maj se font par modification du fichier elements.xml, structuré comme ci dessous

    <Elements xmlns="http://schemas.microsoft.com/sharepoint/">
      <Field ID="{7BB69EF6-2FBD-4938-B4C4-4E74405F569F}"
             Name="test01"
             Type="Text"
             DisplayName="test01"/>
      <Field ID="{12639B0F-26C3-44c6-8317-8939E08A3EE8}"
             Name="test02"
             Type="Text"
             DisplayName="test02"/>
    
      <ContentType
       ID="0x0101005AE73FA3822D45FEB1B0E0DCDAC59BBE"
       Name="monType"
       Group="monGroupe"
       Description="madescription"
       Version="1">
        <FieldRefs>
          <FieldRef ID="{7BB69EF6-2FBD-4938-B4C4-4E74405F569F}"
                    Required="TRUE" />
          <FieldRef ID="{12639B0F-26C3-44c6-8317-8939E08A3EE8}"
                    Required="TRUE" />
        </FieldRefs>
      </ContentType>
        
    </Elements>
    Le seul code est dans la méthode FeatureActivated

    SPContentType ct = web.ContentTypes[NOM_TYPE_CONTENU];
    ct.Update(true);
    Il n'a pas d'autres code. (L'évènement est bien appelé, j'arrive bien à récuperer le content-type)

    En fait, si je reinstalle ma feature :
    - Le content-type à la racine de la collection de site est mis à jour
    - Les colonnes de site à la racine de la collection de site sont mises à jour
    - Le content-type du sous-site qui contient la librairie documentaire n'est pas mis à jour,
    - Les colonnes de la librairie ne sont pas mis à jour.

    Est-ce parce que les modfications ne sont pas faites par code (c'est à dire juste avant le update), que le update ne s'applique pas?
    J'avais pensé à la featureReceiver pour forcer le pushdown, car je n'ai pas vu d'autre moyen (option de stsadm, tag dans le fichier feature.xml...).

    mardi 7 avril 2009 08:58
  • Bonjour,

    la méthode Update ne met à jour que les champs ajoutés via code. Les modifications faites sur le ContentType via XML n'ont aucun lien avec la méthode Update.
    http://blogs.developpeur.org/gribouillon/
    mardi 7 avril 2009 12:36
    Modérateur
  • Merci,

    Savez vous s'il est possible de forcer la mise à jour des types de contenu enfant dans le cas de modifications faites via XML?
    mardi 7 avril 2009 13:54
  • Je peux vous confirmer que la mise à jour via XML n'est pas envisageable. Pour qu'elle soit prise en compte, votre solution doit être retirée, supprimée, ajoutée, déployée (avec feature activée). Dans ce cas, votre ContentType est perçu comme un nouveau ContentType et n'affecte pas vos listes qui s'appuyaient sur l'ancien ContentType.

    La seule solution à ce jour est via code.

    Vous trouverez quelques témoignages similaires en faisant des recherches sur Internet. Un exemple parmi d'autres : http://brandonpotter.wordpress.com/2009/02/07/propagating-content-type-changes-in-moss-2007/
    http://blogs.developpeur.org/gribouillon/
    mardi 7 avril 2009 22:57
    Modérateur