logo

サイト内検索
ココログ最強検索 by 暴想

最近のトラックバック

無料ブログはココログ

« VisualForcePDFの改ページについて_1:基本編 | トップページ | VisualForcePDFの改ページについて_3:レコード表示制御編 »

VisualForcePDFの改ページについて_2:ページラッパー制御編

Creating Professional PDF Documents with CSS and Visualforce
※基本的に上記リンクに描いてあることを噛み砕んでいる物です。

前回VisualForceの基本構成について解説しました。
今回はその続きで1ページ当たりの情報を保持するListについてTipsを書いてみます。
同時に最初のページの頭ににヘッダーを付けて、最後のページの最後にフッターをつける方法についてもメモしておきます。




ヘッダー・フッターの表示は基本的にテーブルレイアウトで記述します。
ただしHTMLであるため、特にフッターの位置には気を使う必要があります。

Tips:レコード表示制御によって、データ部では多少Heightがずれる可能性がある。
  理由は後日配信予定のVisualForceの作りで解説

 

Tips:問題なければapex:pageblock内部でDivを三つ切り、
  ヘッダ用・フッタ用・データ用と分けたほうがいいかもしれません。


またヘッダー・フッターの表示制御はDivをApexタグで描けばrenderedで表示制御が可能です。
ちなみにApexタグでのDiv表現は「<apex:outputPanel layout="block">」です。

Tips:layout="inline"にすると、Spanになります。


<apex:repeat value="{(ラッパーのList)}" var="page">
    <div style="page-break-after:always">
        <apex:outputPanel layout="block" rendered="{!XXX}">
            <-- ヘッダー部 -->
        </apex:outputPanel>

        <-- データ部 -->         <apex:pageBlockTable value="{!page.records}" var="SObject" >             ~データ表示~         </apex:pageBlockTable>
        <apex:outputPanel layout="block" rendered="{!XXX}">             <-- フッター部 -->         </apex:outputPanel>     </div> </apex:repeat> ※XXXは真偽値。

ではRenderedのXXX部分をどのように制御し、ヘッダー・フッターの表示/非表示を表現したら良いでしょうか?

「ループカウントをrepeatからとって、制御したら良くない?」

という意見があるかもしれませんが、取れません
apex:repeat等ループ系タグにはループカウントを取得可能な変数やメソッドはありません。


つまり、自分でループカウントを作らないといけません。


なので上↑のテキスト上、「ラッパーのリスト」と書かれていますが、このラッパーとは、
実際は「SObjectリストを格納できる1ページを表現するラッパー」で、このような別クラスが必要です。

同時にこのラッパーに対してカウンタを設定してあげれば、ページカウントも可能となります。

Tips:またラッパーにする利点は最後ページの改ページキャンセルにも使えます。


以下はラッパーの例です。

public class Report {
    private List<SObject> records = new List<SObject>();  //データのリスト
    private Integer pageNumber;                           //ページナンバー
    private Boolean lastPageFlag;                         //最後ページかどうか

    //必ずページナンバーをセットする。     public Report(Integer pageNumber){         this.pageNumber = pageNumber;         this.lastPageFlag = false;     //基本は最後ページでないのでFalse     }
    /* データリストと中継してやり取り。 */     public void add(SObject record){         records.add(record);     }     /* データリストと中継してやり取り。実装によってはあると便利。 */     public void addAll(List<SObject> record){         records.addAll(record);     }
    /* データリストを返す */     public List<SObject> getRecords(){{         return records;     }
    /* ページナンバーを返す */     public Integer getPageNumber(){         return pageNumber;     }
    //最後ページかどうか。     public void setLastPageFlag(Boolean lastPageFlag){         this.lastPageFlag = lastPageFlag;     }     public Boolean getLastPageFlag(){         return lastPageFlag;     }
//--*--*--*--*--*--*--*--*--*--*--*--*--*--*--     //page-break-after:always;設定の例     public String getLastPageStyleSheet(){         if(!lastPageFlag){             return 'page-break-after:always;';             //alwaysかavoidを切り替える形でも良いと思います。         }         return '';     } }



これを加味してヘッダー制御を行うと…

//1ページ目のみヘッダーを表示する
<apex:outputPanel layout="block" rendered="{!XXX}">
  ↓    ↓    ↓    ↓    ↓    ↓    ↓    ↓
<apex:outputPanel layout="block" rendered="{!page.pageNumber == 1}">
//ページNo=1の時だけTrue = 表示する。

という形になります。

ただしこの実装をする場合は2ページ目以降ヘッダー分Heightが大きく開きます。
レコード表示数が拡張されるので、実装上その点に留意してください。

では良きSalesForceライフを。

« VisualForcePDFの改ページについて_1:基本編 | トップページ | VisualForcePDFの改ページについて_3:レコード表示制御編 »

Salesforce」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1482716/40700413

この記事へのトラックバック一覧です: VisualForcePDFの改ページについて_2:ページラッパー制御編:

« VisualForcePDFの改ページについて_1:基本編 | トップページ | VisualForcePDFの改ページについて_3:レコード表示制御編 »