1

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

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

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

我通常熟悉 ASP.NET 而不是 CGI-BIN。是否有类似于母版页的东西,其中为 Cognos 页面完成了样式和基本导入?理想情况下,编辑此文件将使我们能够继续进行自定义。

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

4

3 回答 3

1

我认为像我这样具有更传统 Web 开发背景的 BI 专业人士很常见,而您对更改全局 CSS 文件并引入更多 JS 毫不犹豫。

我已经在报告中向您解释了我是如何运行 JS 的——我很想将 jQuery 添加到我们的全局库中,但我还没有为它提供足够的支持。我可以帮助 CSS 部分。

在 8.4.1 中,报表查看器引用了大量的 CSS 文件。如果我是你,我会使用默认样式呈现一个示例报告,并使用 Firebug 或类似工具来跟踪被调用的 CSS 文件。您会发现这server/cognos8/schemas/GlobalReportStyles.css是经常被引用的,在一些帮助下server/cognos8/skins/corporate/viewer/QSRVCommon.css- 那里还有一些其他文件被导入。

我想您可以grep -R '<link rel=\"stylesheet\" type=\"text/css\" href=\"../schemas/GlobalReportStyles.css\">在 COGNOS 目录中查看文件被调用的位置,然后直接编辑该文件,或者创建指向您自己的 JS 的链接。就个人而言,我只是备份现有的样式表并修改已经存在的样式表。

我想你可以为 JS 做类似的事情——找到它在模板中被调用的位置(使用 grep),然后创建一个对你想要创建的文件的新引用。就我而言,如果我可以将 jQuery 加载到每个报告中,我会做一个后空翻。

于 2011-03-07T16:42:33.850 回答
1

才发现这是一岁了。:-( 抱歉,第一次来这里。如果有人仍然对该主题感兴趣,我会留下它。

以下是有关在多个级别上进行自定义的文档:Cognos

我们使用了修改系统文件的替代方法。我们有一个共享组件“报告”,其中包含一个带有特定 CSS 覆盖的 HTML 对象,和/或自定义样式表的链接。然后,我们使用工具箱中的“布局组件参考”将其添加到每个报告中。如果我们想要全局更改,只需更改组件报告或自定义样式表中的一项。这对我们非常有效。

于 2012-04-17T18:47:52.130 回答
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 的不同端):

  • 网页内容\icd\bux\js\bux\bux.core.js
  • 网页内容\ps\portal\js\cc.js
  • 网页内容\rv\CCognosViewer.js
  • 网页内容\rv\GUtil.js
  • webcontent\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();

当然,这需要在前面提到的每个 JavaScript 文件中的 Custom.js 文件之前包含 jQuery 库。

URI 类是我在 Internet 上找到的并针对我们的使用进行了调整。如果您对自定义 JavaScript 加载有任何疑问,请发表评论,我会尽力详细说明。

于 2012-04-19T12:13:19.587 回答