我最近问过全局样式表在哪里用于编辑Cognos 10样式(Here)。
在与我们的团队进行一些讨论之后,我们希望找到Cognos用来构建它的报告查看器页面和仪表板小部件持有者的CGI或基本导入文件。
我们想要这样做的原因是我们可以将所有自定义样式和javascript包含在一个位置。当/如果我们升级Cognos,我们可以确定报告的一个失败点。这将解决我们必须重新编辑多个样式表(和javascript)的问题。
我通常熟悉ASP.NET而不是CGI-BIN。是否存在类似于Master页面的内容,其中为Cognos页面完成了样式和基本导入?理想情况下,编辑此文件将允许我们继续进行自定义。
可以这样做吗?还是我们只是疯了?我们了解有关升级的风险,但风险是可以接受的(除非有人可以提供一个很好的例子,说明如何通过版本更改来复制此技术)。
答案 0 :(得分:1)
我认为像我这样拥有更多传统网络开发背景的BI专业人员和你对改变全局CSS文件并引入更多JS没有任何疑虑是相当普遍的。
我已经向你解释过我如何在报告中运行JS - 我很乐意将jQuery添加到我们的全局库中,但我还没有得到足够的支持。我可以帮助CSS部分。
在8.4.1中,报告查看器引用了大量的CSS文件。如果我是你,我会使用默认样式呈现样本报告,并使用Firebug或类似内容来跟踪被调用的CSS文件。你会发现server/cognos8/schemas/GlobalReportStyles.css
经常被引用,在server/cognos8/skins/corporate/viewer/QSRVCommon.css
的帮助下 - 还有一些其他文件被导入。
我想你可以在COGNOS目录中grep -R '<link rel=\"stylesheet\" type=\"text/css\" href=\"../schemas/GlobalReportStyles.css\">
查看文件的调用位置,直接编辑该文件,或者创建一个指向自己JS的链接。就个人而言,我只是备份现有的样式表并修改已经存在的样式表。
我想你可以为JS做类似的事情 - 找到它在模板中调用的地方(使用grep),然后创建一个你想要创建的文件的新引用。在我的情况下,如果我可以在每个报告中加载jQuery,我会做一个后空翻。
答案 1 :(得分:1)
以下是the documentation关于在多个级别自定义Cognos
的信息:
我们使用了替代方法来修改系统文件。我们有一个共享组件“report”,其中包含一个HTML对象,其中包含我们特定的CSS覆盖,和/或指向自定义样式表的链接。然后,我们使用工具箱中的“布局组件参考”在每个报表上添加此项。如果我们想要进行全局更改,只需更改组件报告或自定义样式表中的一个项目即可。这对我们来说非常有效。
答案 2 :(得分:0)
我对这个问题的先前答案进行了投票。我承认我有点忘记这个问题,直到有人对它进行了一些活动。
我们最终结合了上述技术。我能够按照建议找到全局样式表。我最终做的是复制该样式表中的所有样式并创建一个以* _SystemSytles.css *为后缀的新工作表。我创建了第二张表,并以* _Custom.css *为后缀。然后在原始工作表中我放置了两个导入,首先导入系统样式,然后导入自定义样式。
对于某些报告,我们有一个自定义对象,它会引入自己的样式(和JavaScript)。这与第二个问题采用了类似的技术。
但是,我在整个Cognos网站中导入JavaScript以供一般使用所需要做的事情很难。
在核心webcontent文件夹中,我创建了一个 js 文件夹,其中包含jQuery和我们的自定义JavaScript文件。然后在一系列JavaScript文件中,我包含了类似于以下内容的代码:
/************************
JQUERY UTIL INCLUDE
************************/
function loadjscssfile(filename, filetype, id) {
if (filetype == "js") { //if filename is a external JavaScript file
var fileref = document.createElement('script')
fileref.setAttribute("type", "text/javascript")
fileref.setAttribute("src", filename)
if (id)
fileref.setAttribute("OurCompanyNameAsAnID", id)
}
else if (filetype == "css") { //if filename is an external CSS file
var fileref = document.createElement("link")
fileref.setAttribute("rel", "stylesheet")
fileref.setAttribute("type", "text/css")
fileref.setAttribute("href", filename)
}
if (typeof fileref != "undefined") {
var headTag = document.head || document.getElementsByTagName('head')[0];
headTag.appendChild(fileref);
}
}
function _PortalLoadJS() {
if (!window._PortalScriptsLoaded) {
var pathParams = [];
var path = location.href;
(function () {
var e,
r = /([^/]+)[/]?/g,
p = path;
while (e = r.exec(p)) {
pathParams.push(e[1]);
}
})();
var baseURL = location.protocol + '//';
for(var i = 1; i < pathParams.length; i++) {
if(pathParams[i] == 'cgi-bin')
break;
baseURL += pathParams[i] + '/';
}
loadjscssfile(baseURL + "js/jquery-1.6.1.min.js", "js");
loadjscssfile(baseURL + "js/Custom.js?pageType=COGNOS_CONNECTION", "js", "SumTotalUtil");
window._PortalScriptsLoaded = true;
}
}
if(!window.$CustomGlobal) {
window.$CustomGlobal= function(func) {
if (!window.$A) {
if (!window.__CustomExecStack) {
window.__CustomExecStack= new Array();
}
window.__CustomExecStack.push(func);
}
else
$A._executeCustomItem(func);
}
}
try {
// Catch cases where $(document).ready() is called after the
// browser event has already occurred.
if (document.readyState === "complete") {
// Handle it asynchronously to allow scripts the opportunity to delay ready
setTimeout(_PortalLoadJS, 10);
}
// Mozilla, Opera and webkit nightlies currently support this event
if (document.addEventListener) {
// Use the handy event callback
document.addEventListener("DOMContentLoaded", function() { _PortalLoadJS(); }, false);
// A fallback to window.onload, that will always work
window.addEventListener("load", _PortalLoadJS, false);
// If IE event model is used
} else if (document.attachEvent) {
// ensure firing before onload,
// maybe late but safe also for iframes
document.attachEvent("onreadystatechange", function() { _PortalLoadJS(); });
// A fallback to window.onload, that will always work
window.attachEvent("onload", _PortalLoadJS);
}
}
catch (ex) { }
$ A项是我在加载Custom.js文件时创建的项目。
以下是我已包含此代码的文件列表(位于JavaScript的各个端点):
这些文件应涵盖Cognos Connection,Report Viewer和Dashboards区域。如果还有更多,请告诉我,我可以更新此列表。
当链接到Custom.js文件时,我在Custom.js文件选择的外部资源上放置了一个查询字符串:pageType = COGNOS_CONNECTION。这允许我为Cognos Connection,Report Viewer或Dashboards执行特定的加载代码。
以下是Custom.js类中包含$ A对象的代码:
function _CustomUtilInit() {
try {
if (!window.$j) {
window.setTimeout(_CustomUtilInit, 1);
return;
}
var jScriptTags = $j('SCRIPT[' + Analytics.SCRIPT_ATTR_NAME + '= ' + Analytics.SCRIPT_ATTR_VALUE + ']');
jScriptTags.each( function(i, scriptElem) {
var tag = $j(scriptElem);
if(tag.attr(Analytics.LOADED_SCRIPT_KEY))
return;
var scriptURL = new URI(tag.attr('src'));
var analyticsPageType = scriptURL.getQueryStringValue(Analytics.PAGE_TYPE_QUERY_KEY, Analytics.PageType.REPORT_VIEWER);
if(!window.$A) {
window.$A = new Analytics();
}
window.$A.init(analyticsPageType);
tag.attr(Analytics.LOADED_SCRIPT_KEY, 'true');
});
} catch (e) {
}
}
_CustomUtilInit();
当然,这需要jQuery库包含在每个前面提到的JavaScript文件中的Custom.js文件之前。
URI类是我在互联网上找到并调整以供我们使用的东西。如果您对自定义JavaScript加载有任何疑问,请发表评论,我会尽力详细说明。