Thursday, April 10, 2008 - 文章

TIPS-使用CSS客製Reporting Service匯出選項

很久很久以前,我寫了一篇KB介紹停用特定Reporting Service報表匯出格式的做法,除了修改config外,我還提出了可以透過指定Stylesheet遮蔽部分匯出選項的做法。

使用Stylesheet的做法,使用者可以透過去除URL rs:stylesheet參數讓防護手法破功,因此我在原先的KB裡只稍稍帶過,並未再花時間再深入研究。不過,日前網友草莓妹問到如何利用第二種方法,以CSS引進Javascript去更動內容。

雖然我覺得用Stylesheet去卡Reporting Service匯出選項的實用性不高,但這一招在某些只允許你改變CSS,不准變動網頁內容的場合有些用處,所以花了點時間,還是研究了一下CSS綁Javascript的做法,以備未來不時之需。

回到先前所提,我們可以用rs:stylesheet=yourCustCSS的方式套上自己寫的樣式。其中要設法將Export中不要的選項移除,我的想法是掛事件在body.onload上,在載入時觸發一段Code對下拉選單動手腳。

不幸的是,CSS加掛Javascript的做法,IE與Firefox提供的支援並不相同。IE可以很簡便的用behavior:expression(...javascript code...);表示法直接寫在CSS中(當然,要寫成HTC也OK);Firefox則必須使用XBL的做法,繞的圈子大一點,而且Reporting Service上不好直接放XBL檔案,因此得更外找地方放檔案。

CSS的寫法如下:

BODY 
{
    /* For IE */
    behavior:expression(this.onload = function() {
        var sels = document.getElementsByTagName("select");
        for (var i=0; i<sels.length; i++)
        {
            if (sels[i].title != "匯出格式") continue;
            var opts = sels[i].options;
            for (var j=0; j<opts.length; j++) 
                //Remove PDF option
                if (opts[j].value == "PDF") opts[j]=null;
        }
    });
    /* For FireFox */
    -moz-binding:url(http://another.web.server/LimitedExport.xbl#bodyEvent);
}

XBL寫起來比較囉嗦... 我試不出掛onload(也許本來就不允許),只好用onmoseover+限執行一次代替。

<?xml version="1.0"?>
<bindings xmlns="http://www.mozilla.org/xbl" xmlns:html="http://www.w3.org/1999/xhtml">
    <binding id="bodyEvent" styleexplicitcontent="true">
    <handlers>
        <handler event="mouseover">
        var flagDone = this.getAttribute("FlagDone");
        if (flagDone == null)
        {
            this.setAttribute("FlagDone", "Y");
            var sels = document.getElementsByTagName("select");
            for (var i=0; i &lt; sels.length; i++)
            {
                if (sels[i].title != "匯出格式") continue;
                var opts = sels[i].options;
                for (var j=0; j &lt; opts.length; j++) 
                    //Remove PDF option
                    if (opts[j].value == "PDF") opts[j]=null;
            }
        }
        </handler>
    </handlers>
    </binding>
</bindings>

試了一下,這樣搞下來,在IE及FireFox中都不會看到PDF選項。不過,如果User不是用加了rs:stylesheet參數的URL連起來,這些額外花的功夫頓成廢柴,規劃應用時時要留意。

PS: CSS加Javascript真是讓人又愛又恨的功能,可以用來突破某些網站不給寫Javascript的限制,但換作網站管理者的角度,這無疑又是個掛馬下毒的好後門,不可不慎。

搜尋

Go

<April 2008>
SunMonTueWedThuFriSat
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910
 
RSS
【工商服務】
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


BlogLook Score and Rank

Syndication