【ColdFusion】印刷向けcfsavecontentタグの使い方

一日中雨だったのでテキトーにコードを書いていました。(:3_ヽ)_

cfdocumentタグを利用してPDF出力をする時にそのままHTMLを書いていると保守性に欠けるので、
cfsavecontentタグを利用したテーブルの出力方法を考えてみました。
条件文を利用して10件ずつ帳票に印字するといったことが簡単に実現ができます。

<cfscript>
    // 表示用のデータ
    nameArray  = ["田中", "斎藤", "近藤", "キャサリン"];
    nameArray2 = ["工藤", "佐々木"];
    // 行単位でHTMLを保持する配列
    tableBodyContentArray  = ArrayNew(1);
    tableBodyContentArray2 = ArrayNew(1);

    // Tableテンプレート作成
    sTableStart  =  setTableStart();
    sTableHeader = setTableHeader();
    sTableEnd    = setTableEnd();
    // 行データ取得
    tableBodyContentArray  = setTableBodyContnet(nameArray,  tableBodyContentArray);
    tableBodyContentArray2 = setTableBodyContnet(nameArray2, tableBodyContentArray2);
    // TableBody HTML作成
    sTableBody    = setTableBody(tableBodyContentArray);
    sTableBody2   = setTableBody(tableBodyContentArray2);
    // Table HTML作成
    sHtml  = createTableHtml(sTableStart, sTableHeader, sTableBody,  sTableEnd);
    sHtml2 = createTableHtml(sTableStart, sTableHeader, sTableBody2, sTableEnd);

    // 出力
    WriteOutput(sHtml);
    WriteOutput(sHtml2);
</cfscript>

<cffunction name = "createTableHtml" returnType = "string" access = "private">
    <cfargument name="_sTableStart"  type="string" required="true">
    <cfargument name="_sTableHeader" type="string" required="true">
    <cfargument name="_sTableBody"   type="string" required="true">
    <cfargument name="_sTableEnd"    type="string" required="true">

    <cfoutput>
        <cfsavecontent variable = "table">
            #_sTableStart#
            #_sTableHeader#
            #_sTableBody#
            #_sTableEnd#
        </cfsavecontent>
    </cfoutput>

    <cfreturn table>
</cffunction>

<cffunction name = "setTableStart" returnType = "string" access = "private">
    <cfsavecontent variable = "tableStart">
            <table border="1">
    </cfsavecontent>

    <cfreturn tableStart>
</cffunction>

<cffunction name = "setTableHeader" returnType = "string" access = "private">
    <cfsavecontent variable = "tableHeader">
            <thead>
                <tr>
                    <th>No</th>
                    <th>名前</th>
                </tr>
            </thead>
    </cfsavecontent>

    <cfreturn tableHeader>
</cffunction>

<cffunction name = "setTableBody" returnType = "string" access = "private">
    <cfargument name="_tableBodyContentArray" type="array" required="true">
    <cfset rowNo = 1>

    <cfoutput>
        <cfsavecontent variable = "tableBody">
            <tbody>
                <cfloop array = "#_tableBodyContentArray#" index="idx">
                    #idx#
                </cfloop>
            </tbody>
        </cfsavecontent>
    </cfoutput>

    <cfreturn tableBody>
</cffunction>


<cffunction name = "setTableBodyContnet" returnType = "array" access = "private">
    <cfargument name="_nameArray" type="array" required="true">
    <cfargument name="_tableBodyContentArray" type="array" required="true">

    <cfset rowNo = 1>

    <cfoutput>
        <cfloop array = "#_nameArray#" index="idx">
            <cfsavecontent variable = "tableBodyContent">
                    <tr>
                        <td>#rowNo#</td>
                        <td>#idx#</td>
                    </tr>
            </cfsavecontent>

            <cfscript>
                ArrayAppend(_tableBodyContentArray, tableBodyContent);
                rowNo += 1;
            </cfscript>
        </cfloop>
    </cfoutput>

    <cfreturn _tableBodyContentArray>
</cffunction>

<cffunction name = "setTableEnd" returnType = "string" access = "private">
    <cfsavecontent variable = "tableEnd">
        </table>
    </cfsavecontent>

    <cfreturn tableEnd>
</cffunction>

cfdocumentタグが使いづらくて辛い。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください