목록 뷰 getList하위 게시 항목에서 ItemXmlAttributes 메서드가 실패함
항목 수정 시 SG/Folder 목록 보기 데이터를 채우는 JS 클래스를 만들었습니다.(Jaime의 어프로치대로)작성된 출판물의 아이템을 조작하면 모든 것이 잘 동작합니다.
예: 컴포넌트 또는 페이지를 열고 커스텀을 엽니다.locked by
컬럼이 즉시 갱신되고 내 사용자 이름이 표시됩니다.
그러나 하위 게시물에 가서 해당 프로세스를 반복하면 상위 항목을 현지화할지 편집할지 묻는 창이 나타납니다.상위 창을 편집하도록 선택하면 코드가 작동하지 않습니다.초기 디버깅에서는 아직 파악하지 못했습니다.Chrome은 오류를 삼키는 것 같습니다. Firefox는 다음과 같은 난해한 정보를 제공합니다.
타임스탬프: 2012년 6월 22일 오후 3:42:54
오류: 탐지되지 않은 예외: [예외...컴포넌트가 반환한 장애 코드: 0x80004002(NS_NOINTERFACE) [ns]IWeb Progress (IWeb Progress 。DOMWindow]" nsresult: "0x80004002 (NS_NOINTERFACE)" 위치: "JS 프레임:: chrome://browser/content/tabbrowser.xml::::: line 545" 데이터: no]
처음 생각나는 사람 있나요?나중에 코드를 올리도록 하겠습니다.
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;
};
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;
[예외...]컴포넌트가 반환한 장애 코드: 0x80004002(NS_NOINTERFACE) [ns]IWeb Progress (IWeb Progress 。DOMWindow]
이는 ns에 할당된 창이 없음을 의미합니다.IWebProgress 오브젝트그래서 데이터를 표시할 곳이 없습니다.
nsresult: "0x80004002 (NS_NOINTERFACE)" 위치: "JS frame :: chrome://browser/content/tabbrowser.xml :::::: line 545" 데이터: no]
이 에러와 관련지어져 있는 파일과 에러가 발생한 행이 표시됩니다.
그러나 실제 키는 NS_NOINTERFACE 오류입니다.즉, 인터페이스가 등록되어 있지 않습니다.
사용하고 있습니다.Type.enableInterface()
다른 곳에서 선언하고 있는 것이 커스텀 방식입니까?난 그렇게 안 보이는데.그것을 로 변경하는 것이 좋을지도 모른다..registerInterface()
Type Class 및 Type.register 링크를 참조하십시오.인터페이스()
언급URL : https://stackoverflow.com/questions/11165200/list-view-getlistitemxmlattributes-method-fails-with-child-publication-items
'source' 카테고리의 다른 글
자바에서 패키지 이름을 포함한 현재 클래스 이름을 가져오려면 어떻게 해야 합니까? (0) | 2022.10.25 |
---|---|
MariaDB 30일 이내에 만료되는 계정의 모든 레코드를 선택합니다. (0) | 2022.10.25 |
마리아 DB가 시작을 거부 (0) | 2022.10.25 |
DB에 연결하지 않고 mysql_real_escape_string 대신 사용할 수 있습니다. (0) | 2022.10.25 |
키보드 이벤트키 코드가 사용되지 않습니다.이것은 실제로 무엇을 의미합니까? (0) | 2022.10.25 |