Cognos中是否有可编辑文件用于导入样式表或Javascript?

时间:2011-03-07 14:00:24

标签: reporting report cognos

我最近问过全局样式表在哪里用于编辑Cognos 10样式(Here)。

在与我们的团队进行一些讨论之后,我们希望找到Cognos用来构建它的报告查看器页面和仪表板小部件持有者的CGI或基本导入文件。

我们想要这样做的原因是我们可以将所有自定义样式和javascript包含在一个位置。当/如果我们升级Cognos,我们可以确定报告的一个失败点。这将解决我们必须重新编辑多个样式表(和javascript)的问题。

我通常熟悉ASP.NET而不是CGI-BIN。是否存在类似于Master页面的内容,其中为Cognos页面完成了样式和基本导入?理想情况下,编辑此文件将允许我们继续进行自定义。

可以这样做吗?还是我们只是疯了?我们了解有关升级的风险,但风险是可以接受的(除非有人可以提供一个很好的例子,说明如何通过版本更改来复制此技术)。

3 个答案:

答案 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的各个端点):

  • web内容\ ICD \ BUX \ JS \ BUX \ bux.core.js
  • web内容\ PS \门户\ JS \ cc.js
  • web内容\ RV \ CCognosViewer.js
  • web内容\ RV \ GUtil.js
  • web内容\ RV \ viewer.standalone.core.js

这些文件应涵盖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加载有任何疑问,请发表评论,我会尽力详细说明。