J'ai un type de contenu de site utilisé pour une poignée de listes de la collection de mon site. Dans ce type de contenu, je décris un récepteur d'événement pour gérer l'événement ItemAdding. Cela fonctionne bien. Maintenant, je dois mettre à jour le type de contenu de sorte que l'élément d'exécution soit également traité. En haut de ma tête, j'ai essayé de modifier simplement le XML pour mon type de contenu, car cela semblait permettre un suivi de version facile. Cela a fonctionné dans le sens où mes mises à jour ont été appliquées au type de contenu du site, mais pas à mes listes qui utilisaient ce type de contenu. Cela était attendu. Ensuite, j'ai remarqué que le SharePoint SDK prend un Vue Grim de ce:
En aucun cas, vous ne devriez-vous Mettre à jour la définition du type de contenu fichier pour un type de contenu après avoir eu installé et activé ce contenu taper. Windows SharePoint Services fait pas suivre les modifications apportées au contenu fichier de définition de type. Par conséquent, vous n'ont pas de méthode pour pousser Modifications apportées aux types de contenu du site à les types de contenu enfant. P> blockquote>
Le SDK pointe ensuite sur quelques sections décrivant comment utiliser l'interface utilisateur ou le code pour appuyer les modifications. Étant donné que l'interface utilisateur n'offre aucun crochet dans les récepteurs d'événements, je suppose que je choisirai le chemin du code. P>
Je pensais que je pourrais faire quelque chose comme ça et ajouter simplement un nouveau récepteur d'événement à la copie de la liste du type de contenu: p>
SPList list = web.Lists["My list"]; list.EventReceivers.Add(SPEventReceiverType.ItemUpdating, "My assembly name", "My class name");
3 Réponses :
Avez-vous appelé ctype.update (true) après avoir ajouté l'éventuelleReceur? Si vous ne le faites pas, cela ne sera pas persisté. Et n'utilisez pas le type de contenu de la liste, utilisez SPWeb.ContentTypes à la place.
Ce code fonctionne pour moi: p> Le paramètre true signifie qu'il est poussé à tous content de l'enfantTypes aussi. (c'est-à-dire à toutes les listes à l'aide du type de contenu). P> p>
Je suppose que je n'ai même pas descendu cette route après que le SDK impliquait de ne pas toucher la définition du type de contenu. Je vois maintenant que ceci est différent, car vous pouvez explicitement le dire de pousser les modifications vers le bas. Cela semble être le moyen idéal de le faire. Je vais l'essayer. Merci! Maintenant, comment faites-vous cela en termes de gestion de la configuration? :)
C'est vrai que vous ne devriez pas toucher le CTYPE def. Mais cela signifie seulement le CAML qui a été utilisé pour le créer / à travers le modèle d'objet que vous pouvez faire ce que vous voulez. Nous exécutons au-dessus du code via un récepteur de fonctionnalités couplé à la fonctionnalité qui détient les défenseurs de la CTYPE. Le moment ... Supprimer a été ajouté afin que nous puissions désactiver / activer la fonctionnalité autant de fois que nous le voulons et toujours garder 1 éventuelleReceiver par CTYPE (IMHO le moyen le plus propre d'aller). Donc, votre question est répondue?
En ce qui concerne la deuxième partie de votre question, je voulais transmettre ce que nous avons fait pour des situations similaires dans le passé. Dans notre situation, nous avions besoin de quelques scripts différents: un qui nous permettrait de propager le type de contenu mises à jour à toutes les listes de toutes les sites Web et d'une autre réinitialisant la définition des pages / pages principales à la définition du site (formulaire non personnalisé ). p>
Ainsi, nous avons créé des commandes Stsadm personnalisées pour chacune de ces actions. Ce faisant de cette façon, c'est bien car les scripts peuvent être placés dans un contrôle de source et implémente l'interface Stsadm déjà existante. P>
Pour répondre à la deuxième partie de votre question, cela une chose délicate à cause du fait que des modifications apportées aux teneurs de contenu sur la SiteCollection ne sont pas repoussées dans les listes où elle est utilisée. Une "copie" est essentiellement faite des champs de la SiteCollection et il n'y a plus de lien entre eux après avoir ajouté un contenu de contenu à la liste. Je pense que cela est dû au fait que vous êtes censé apporter des modifications aux listes sans qu'il affecte la SiteCollection. Quoi qu'il en soit, ma contribution à ce "problème" et comment je l'ai résolue, implique de rendre le XML le "maître" et dans une portefeuilleeceiver I Sortez sur le XML et trouvez tous les endroits où le contenu est utilisé et à partir de là, mettez à jour les teneurs de contenu (vraiment le niveau de filedfs) sur le niveau de la liste pour correspondre à celui du XML. Le code va quelque chose comme: La prochaine chose suivante consiste à comparer le FieldRefs dans XML XML avec les champs de la liste (effectué par l'attribut ID) et assurez-vous qu'ils sont égaux. Malheureusement, nous ne pouvons pas mettre à jour toutes les choses sur la classe SPFIEDLINK (The FieldRef) et (oui, je sais qu'il n'est pas pris en charge) ici, j'ai réellement utilisé la réflexion pour mettre à jour ces valeurs (F.e. ShowIseditForm). P> P>
Bon code, mais pas complètement lié à l'ajout d'itemEventreceiver, +1 si
@Colin - Nah, il en va de plus en plus de modifier les modifications apportées aux teneurs. L'ajout d'éventuels a déjà été répondu que je pense
Bonne question: j'ai voulu demander quelque chose de similaire.