Affichage de la liste getListItemXmlAttributes méthode échoue avec l'enfant de la publication des articles

J'ai créé un JS classe pour remplir SG/affichage liste des Dossiers de données, lorsque les éléments sont modifiés. (Comme par Jaime approche)
Tout fonctionne très bien lorsque j'opère sur les éléments dans la publication de leur création en.

Ex:, j'ai ouvert un composant ou d'une page et de la coutume locked by colonne immédiatement les mises à jour et affiche mon nom d'utilisateur.

Cependant, quand je vais à un enfant de publication et répète le processus, j'obtiens la fenêtre demandant si je veux localiser ou de modifier l'élément parent. Si j'ai choisi de modifier la fenêtre parent, le code ne fonctionne pas. Je n'ai pas tout compris encore avec initiaux de mise au point. Chrome semble avaler l'erreur, Firefox me donne un cryptique:

Timestamp: 6/22/2012 3:42:54 PM

Erreur: uncaught exception: [Exception... "Composant a renvoyé un code de défaillance: 0x80004002
(NS_NOINTERFACE) [nsIWebProgress.DOMWindow]" nsresult: "0x80004002 (NS_NOINTERFACE)"
emplacement: "JS cadre :: chrome://browser/content/tabbrowser.xml :: :: ligne 545"
données: n]

Quelqu'un a une idées de départ? Je vais essayer de poster un peu de code plus tard...

Code de PageEx.js:

Type.registerNamespace("MyCompany.Tridion.RTFExtensions");
/*
* Constructor
*/
MyCompany.Tridion.RTFExtensions.PageEx = function (id) {
Type.enableInterface(this, "MyCompany.Tridion.RTFExtensions.PageEx");
this.addInterface("Tridion.ContentManager.Page", [id]);
var p = this.properties;
p.versionNumberString = undefined;
p.modifiedBy = undefined;
p.lockedBy = undefined;
p.approvalStatus = undefined;
p.publishDate = undefined;
p.previousVersion = undefined;
p.previousApprovalStatus = undefined;
p.customModifiedDate = undefined;
p.initialModifierUserName = undefined;
};
/*
* sends the list xml string for the item 
*/
MyCompany.Tridion.RTFExtensions.PageEx.prototype.getListItemXmlAttributes = function (customAttributes) {
var attribs = {};
$extUtils.getListItemXmlAttributes(customAttributes,this, attribs);
return this.callBase("Tridion.ContentManager.Page", "getListItemXmlAttributes", [attribs]);
};
/*
* This method gets called when an item is opened from list view. node parameter has the information
* displayed in the list view as attributes. We are getting cutom data extender column information 
* from this xml node and storing it in this class member for returning it from getListItemXmlAttributes method
*/
MyCompany.Tridion.RTFExtensions.PageEx.prototype.setDataFromList = function (node, parentId, timeStamp) {
$extUtils.setDataFromList(node,parentId,timeStamp,this);
this.callBase("Tridion.ContentManager.Page", "setDataFromList", [node, parentId, timeStamp]);
};
/* 
* Gets item icon 
*/
MyCompany.Tridion.RTFExtensions.PageEx.prototype.getItemIcon = function () {
var icon = this.callBase(this.defaultBase, "getItemIcon");
return icon;
};

Code de utils.js:

//reloads the list view for the given id (used in list view data refresh when JS cant get the required data without reloading)
MyCompany.Tridion.RTFExtensions.Utilities.reloadListView = function (listTcmId) {
var registry = $models.getListsRegistry();
for(var key in registry)
{
var entry = $models.getItem(registry[key]);
if (entry && entry.getParentId() == listTcmId)
{
entry.unload();
return true;
}
}
return false;
}
/*
* This method gets called when an item is opened from list view. node parameter has the information
* displayed in the list view as attributes. We are getting cutom data extender column information 
* from this xml node and storing it in this class member for returning it from getListItemXmlAttributes method
*/
MyCompany.Tridion.RTFExtensions.Utilities.setDataFromList = function (node, parentId, timeStamp, itemClicked) {
var p = itemClicked.properties;
if (!timeStamp || timeStamp > itemClicked.getTimeStamp()) {
var tmp;
if (tmp = node.getAttribute('Version')) {
p.versionNumberString = tmp;
p.previousVersion = tmp;
}
if (tmp = node.getAttribute('ModifiedBy')) {
p.modifiedBy = tmp;
p.initialModifierUserName = tmp;
}
if (tmp = node.getAttribute('LockedBy')) {
p.lockedBy = tmp;
}
if (tmp = node.getAttribute('ApprovalStatus')) {
p.approvalStatus = tmp;
p.previousApprovalStatus = tmp;
}
if (tmp = node.getAttribute('PublishDate')) {
p.publishDate = tmp;
}
if (p.customModifiedDate === undefined) {
if (tmp = node.getAttribute('Modified')) {
p.customModifiedDate = tmp;
}
}
}
}
/*
* sends the list xml string for the item in the list view.
*/
MyCompany.Tridion.RTFExtensions.Utilities.getListItemXmlAttributes = function (customAttributes, listViewObject,attribs) {
var p = listViewObject.properties;
$extUtils.getListViewItemLockedByName(p,listViewObject);
if (customAttributes) {
for (var attr in customAttributes) {
attribs[attr] = customAttributes[attr];
}
}
attribs["Version"] = $extUtils.getListViewItemUpdatedVersion(p,listViewObject);
//modified name has to come after the version update...
$extUtils.getListViewItemModifiedByName(p,listViewObject);
attribs["ApprovalStatus"] = $extUtils.getListViewItemApprovalStatus(p,listViewObject);  
attribs["PublishDate"] = $extUtils.getListViewItemPublishDate(p,listViewObject);
//set default values
if (p.versionNumberString != undefined) {
var iResult = p.versionNumberString.localeCompare(p.previousVersion);
if (p.previousVersion === undefined || iResult > 0) {
//it's been updated!
p.previousVersion = p.versionNumberString;
p.previousApprovalStatus = p.approvalStatus;
//also need to update modified date
p.customModifiedDate = $extUtils.getListViewItemUpdatedModifiedDate(p,listViewObject);
p.initialModifierUserName = p.modifiedBy;
}
}
attribs["Modified"] = p.customModifiedDate;
attribs["LockedBy"] = p.lockedBy;
attribs["ModifiedBy"] = p.modifiedBy;
};
/*
* This method sets the property of the Revisor owner on the item in the list view. however, if it's not the current user
* we have no way to look that up in JS so we have to reload the list view.
*/
MyCompany.Tridion.RTFExtensions.Utilities.getListViewItemModifiedByName = function (p,listViewObject) {
var p = listViewObject.properties;
var xmlDoc = listViewObject.getXmlDocument();
if (xmlDoc) {
//modifier should always exist...
var modifierId = $xml.getInnerText(xmlDoc, "/tcm:*/tcm:Info/tcm:VersionInfo/tcm:Revisor/@xlink:title");
if (modifierId != undefined) {
var u = Tridion.UI.UserSettings.getJsonUserSettings(true);
if (modifierId == u.User.Data.Name) {
var strDescription = u.User.Data.Description.split('(');
p.modifiedBy = strDescription[0];
return;
} else {
//we're in trouble...
//let's hope it's the initial modifier we had...
if (p.previousVersion == p.versionNumberString) {
//whew...
p.modifiedBy = p.initialModifierUserName;
return;
}
if (!$extUtils.reloadListView(listViewObject.getOrganizationalItemId())) {
//hrm. something failed on the reload? not sure what else to do:
p.modifiedBy = modifierId;
}
}
} else {
//shouldn't ever happen.
p.modifiedBy = "";
return;
}
}
};
/*
* This method sets the property of the lock owner on the item in the list view. however, if it's not the current user
* we have no way to look that up in JS so we have to reload the list view.
*/
MyCompany.Tridion.RTFExtensions.Utilities.getListViewItemLockedByName = function (p,listViewObject) {
var xmlDoc = listViewObject.getXmlDocument();
if (xmlDoc) {
//this will be user id. no sense getting tcmid... can't look it up without async call
var lockedUserId = $xml.getInnerText(xmlDoc, "/tcm:*/tcm:Info/tcm:VersionInfo/tcm:ItemLock/tcm:User/@xlink:title");
if (lockedUserId != undefined) {
//see if it's the current user. most likely...
var u = Tridion.UI.UserSettings.getJsonUserSettings(true);
if (lockedUserId == u.User.Data.Name) {
var strDescription = u.User.Data.Description.split('(');
p.lockedBy = strDescription[0];
return;
}
//it's not the current user. no synch way to do what we want, plus the JS call doesn't get the workflow version anyway. refresh the parent view
if (!$extUtils.reloadListView(listViewObject.getOrganizationalItemId())) {
//hrm. something failed on the reload? not sure what else to do:
p.lockedBy = lockedUserId;
}
} else {
//clear it out since there's no lock owner
p.lockedBy = "";
}
}
};
/*
* Gets the ApprovalStatus from the item
* This makes absolutely no sense... but for some reason the approval status gets wiped out when this method
* enters. so I had to use a "previous approval status" variable to maintain it. no idea why. I don't see anything
* else that should be touching it... but clearly something clears it out.
*/
MyCompany.Tridion.RTFExtensions.Utilities.getListViewItemApprovalStatus = function (p,listViewObject) {
//check if the item has actually been modified.
if (p.versionNumberString != p.previousVersion) {
var xmlDoc = listViewObject.getXmlDocument();
if (xmlDoc) {
p.approvalStatus = $xml.getInnerText(xmlDoc, "/tcm:*/tcm:Info/tcm:Data/tcm:ApprovalStatus/@xlink:title");
}
} else {
p.approvalStatus = p.previousApprovalStatus;
}
if (p.approvalStatus === undefined || p.approvalStatus.toUpperCase() == 'UNAPPROVED') {
var foo = p.approvalStatus;
p.approvalStatus = 'WIP';
}
return p.approvalStatus;
};
/*
* Gets the PublishDate from the item list view
*/
MyCompany.Tridion.RTFExtensions.Utilities.getListViewItemPublishDate = function (p,listViewObject) {
//modification won't alter publish date.
var p = listViewObject.properties;
return p.publishDate;
};
/*
*   get the modified date for the workflow version, overwrite OOB since that uses last major version
*/
MyCompany.Tridion.RTFExtensions.Utilities.getListViewItemUpdatedModifiedDate = function (p,listViewObject) {
var xmlDoc = listViewObject.getXmlDocument();
var modDate = $xml.getInnerText(xmlDoc, "/tcm:*/tcm:Info/tcm:VersionInfo/tcm:RevisionDate");
return modDate;
}
/*
* Gets the updated Version information from the item
*/
MyCompany.Tridion.RTFExtensions.Utilities.getListViewItemUpdatedVersion = function (p,listViewObject) {
var p = listViewObject.properties;
var xmlDoc = listViewObject.getXmlDocument();
var newVersionString = undefined;
if (xmlDoc) {
newVersionString = String.format("{0}.{1}", $xml.getInnerText(xmlDoc, "/tcm:*/tcm:Info/tcm:VersionInfo/tcm:Version"), $xml.getInnerText(xmlDoc, "/tcm:*/tcm:Info/tcm:VersionInfo/tcm:Revision"));
}
if (newVersionString != undefined) {
//want to ensure we're getting a LATER version than we had (because it will try to load the non-workflow version afterwards...
var iResult = newVersionString.localeCompare(p.previousVersion);
if (p.previousVersion === undefined || iResult > 0) {
p.versionNumberString = newVersionString;
} else {
p.versionNumberString = p.previousVersion;
}
} else {
p.versionNumberString = p.previousVersion;
}
return p.versionNumberString;
};
function launchPopup(winURL, winName, winFeatures, winObj) {
//this will hold our opened window
var theWin;
//first check to see if the window already exists
if (winObj != null) {
//the window has already been created, but did the user close it?
//if so, then reopen it. Otherwise make it the active window.
if (!winObj.closed) {
winObj.focus();
return winObj;
}
//otherwise fall through to the code below to re-open the window
}
//if we get here, then the window hasn't been created yet, or it
//was closed by the user.
theWin = window.open(winURL, winName, winFeatures);
return theWin;
}
var $extUtils = MyCompany.Tridion.RTFExtensions.Utilities;
  • J'obtiens le message d'erreur le plus souvent à partir de l'insertion de quelque chose dans un DOM illégalement une mise à jour sur ce code? Sans cela, il sera assez difficile de donner une réponse concrète.
  • Permettez-moi de voir comment je peux poster le code. il est assez grand. Je vais essayer de couper la pertinence des trucs si je peux. Je ne reçois pas toutes les erreurs dans les logs sur le CME serveur. Firefox est le seul navigateur qui donne l'erreur. les autres montrent pas d'erreur il suffit de ne pas remplir la "coutume" colonnes avec les données.
  • toutes les pensées? Je suis perplexe... essayé de regarder les choses avec la JS débogueur et ne pas voir ce qui se passe ici. toutes les idées seraient appréciés.
  • Hey Warner, désolé j'ai raté que vous avez ajouté le code. Ne débogage-il donner une indication quant à la ligne qui est à l'origine du problème? Il serait vraiment utile si nous pouvions réduire cela à partir de "quelque part dans ces 250+ lignes" pour "quelque part autour de ce ligne".
  • np. c'est ma faute de ne pas vous en avertir. Malheureusement, je n'ai pas trouvé où cette erreur se produit. il ne semble pas être dans ce code, mais le code de produit puis utilise le XML qui est renseigné. J'ai peut-être tort, mais je n'en ai pas vu la cause de l'erreur. Je vais le tester un peu plus et essayer de fournir une mise à jour.
  • ce que je pense que je vais le voir, c'est l'erreur d'afficher dans la console avant même qu'elle appelle mon setDataFromList méthode, ce qui est très bizarre pour moi. peut-être que je ne vois pas ce que je pense voir, que. complètement perplexe en ce moment. 🙁
  • Ainsi pourrait-il être que le message d'erreur de Firefox est sans rapport avec le problème que vous avez vu? Si votre PageEx objet est créé, j'aimerais commencer avec un point d'arrêt et voir d'où il venait et où il mène). Si votre objet n'est pas encore créé, vous pourriez avoir un problème dans la façon dont votre ModelFactory est mis en place. Je voudrais examiner le débogage de là, puis, éventuellement, à partir de quand la liste est demandée (quelque part dans $les modèles.getRegistry()). Rappelez-vous: vous avez tous la source JavaScript dans des fichiers séparés trop, afin de l'utiliser pour trouver de bons endroits pour percer.
  • personne d'autre d'assez courageux pour enquêter): mise à jour. la Mozilla erreur semble faux... j'ai travaillé avec quelqu'un de façon plus expérimentés... et nous avons vu la coutume du code JS fonctionne comme prévu (remplissage des attributs supplémentaires pour l'élément). tout cela montre bien jusqu'à ce que ce transformés: Tridion.Content manager.ListTcmItems.le prototype.itemUpdated cette.setXml($xml.getOuterXml(xmlDoc)); cette.fireEvent("itemupdate", oldId ? {itemId: id,oldId: oldId} : {itemId: id}); Alors il ne fait pas de mise à jour de l'affichage de liste. nous sommes en pensant que c'est du remplissage de l'élément dans le parent de la publication (pas à l'enfant)
  • Laissez-moi savoir si cela a un sens, et comment nous avons pu diagnostiquer plus loin.
  • Salut Warner - avez-vous réussi à fermer ce sujet?
  • nope. n'a jamais été la solution sur ce point. 🙁 merci pour le contrôle, bien 😉
  • C'est actuellement en suspens sur Bugzilla. Pertinentes mozilla code
  • C'est probablement ce qui n'a rien à voir avec ça, mais dans votre classe pour initialiser MyCompany.Tridion.RTFExtensions.PageEx vous êtes à la mise à undefined. Cela peut entraîner un problème de la définition d'un attribut alors en train de dire qu'il n'est pas défini - qui n'a pas de sens. Il est préférable de définir la valeur initiale de null si vous ne voulez pas de valeur. Comme je l'ai dit c'est probablement ce qui n'a pas d'importance, à moins que d'autres de code vérifie les clés définies..
  • Avez-vous d'utiliser Firefox? Je veux dire, vous pouvez utiliser les autres navigateurs. Il pourrait être le navigateur du problème.
  • Hef - en fait, oui... notre auteur du contenu de groupe "normalisé" sur Firefox.
  • Cela pourrait peut-être aider : w3schools.com/js/js_strict.asp en outre, il ne peut pas résoudre votre problème, mais la seule undefined vérifie que j'ai vu à l'œuvre sont typeof something === 'undefined' avec ===, ==, !=, ou !== Aussi, vous pouvez essayer d'utiliser setTimeout pour exécuter setXml après getOuterXml
  • est-il d'un bug ou quelque chose qui bloque l'accès à Firefox? Vous pouvez également voir les Inspecter les Éléments et voir si il n'y a aucune différence. Mais ce serait trop long et parfois il n'y a pas de différence.
  • Ajouter console.log(...) consolidés. Même lorsque vous exécutez le JS débogueur en Chrome/Firefox, la console.journal des états de me donner visual affirmations. Comme un autre commentaire dit, je recommande de changer tous les undefined affectations à null. Habituellement, il ya quelque chose dans les journaux de la console qu'il a été un échec. N'importe où que vous tentez d'évaluer et de manipuler le DOM (ou jQuery) objet, faire un journal de la console de l'entrée de la valeur actuelle et la valeur de l'évaluation/de manipulation. Cela peut vous aider à déterminer si le code est d'essayer d'évaluer un empyt (undefined) l'objet ou la propriété.
  • Il vous manque des points-virgules à la fin de la partie de votre fonction delcarations. Vous pourriez corriger cela et voir si cela aide à tous. chaque fois que la déclaration d'une fonction avec quelque chose var = function () {}; <-- vous avez besoin d'un point-virgule après l' }