ブログトップ 記事一覧 ログイン 無料ブログ開設

うたらぼ(はてな) このページをアンテナに追加 RSSフィード

2011-11-16

[]XMLデータの書き込みをColdFusionで大文字小文字の区別をつけるには?(大文字小文字の区別なし)

元記事はこちらです。

■Application.cfm

<cfapplication name="#hash(GetDirectoryFromPath(GetCurrentTemplatePath()))#">

■index.cfm

<!---/////////////////////////////////////////////////////////////////
xmlデータのattributes部分の追加
    ※大文字小文字を区別する方法
    url.kbn="":大文字
    url.kbn<>"":大文字小文字
//////////////////////////////////////////////////////////////////--->
<cfparam name="url.kbn" default="">

<!--- 処理 --->
<cfset cst_exec()>
<!---=================================================================
cst_exec
==================================================================--->
<cffunction name="cst_exec" returnType="void" output="no">
    <cfset var local = structNew()>

    <!--- 絶対パス取得 --->
    <cfset local.path = GetDirectoryFromPath(GetCurrentTemplatePath())>
    <cfset local.inF    = local.path & "in.xml">
    <cfset local.outF   = local.path & "out.xml">

    <!--- xml読み込み --->
    <cffile action="read" file = "#local.inF#" variable = "local.data" charset = "utf-8">

    <cfset local.xml = XmlParse(local.data)>
    <cfset arrayPrepend(local.xml.App.XmlChildren, XmlElemNew(local.xml,"Command"))>

    <!--- 大文字 --->
    <cfif url.kbn eq "">
        <cfset local.xml.App.Command.XmlAttributes.Action = "APPEND">

    <!--- 大文字小文字 --->
    <cfelse>
        <cfset local.xml.App.Command.XmlAttributes["Action"] = "APPEND">
    </cfif>

    <cfset arrayAppend(local.xml.App.Command.XmlChildren, XmlElemNew(local.xml,"ID"))>
    <cfset local.xml.App.Command.ID.XmlText = "bbb">
    <cfset arrayAppend(local.xml.App.Command.XmlChildren, XmlElemNew(local.xml,"Name"))>
    <cfset local.xml.App.Command.Name.XmlText = "bbb name">


    <!--- xml書き込み --->
    <cffile action="write" file = "#local.outF#" output="#toString(local.xml)#" charset = "utf-8">
</cffunction>

■in.xml


<App>
    <Command Action="Delete">
        <ID>aaa</ID>
    </Command>
</App>

[]XMLデータの書き込みをColdFusionで大文字小文字の区別をつけるには?(大文字小文字の区別あり)

元記事はこちらです。

■index1.cfm

<!---/////////////////////////////////////////////////////////////////
xmlデータのattributes部分の追加
    ※大文字小文字を厳密にする
//////////////////////////////////////////////////////////////////--->

<!--- 処理 --->
<cfset cst_exec()>
<!---=================================================================
cst_exec
==================================================================--->
<cffunction name="cst_exec" returnType="void" output="no">
    <cfset var local = structNew()>

    <!--- 絶対パス取得 --->
    <cfset local.path = GetDirectoryFromPath(GetCurrentTemplatePath())>
    <cfset local.inF    = local.path & "in.xml">
    <cfset local.outF   = local.path & "out1.xml">

    <!--- xml読み込み --->
    <cffile action="read" file = "#local.inF#" variable = "local.data" charset = "utf-8">

    <cfset local.xml = XmlParse(local.data, true)>
    <cfset arrayPrepend(local.xml["App"].XmlChildren, XmlElemNew(local.xml,"Command"))>
    <cfset local.xml["App"]["Command"].XmlAttributes["Action"] = "APPEND">
    <cfset arrayAppend(local.xml["App"]["Command"].XmlChildren, XmlElemNew(local.xml,"ID"))>
    <cfset local.xml["App"]["Command"].ID.XmlText = "bbb">
    <cfset arrayAppend(local.xml["App"]["Command"].XmlChildren, XmlElemNew(local.xml,"Name"))>
    <cfset local.xml["App"]["Command"]["Name"].XmlText = "bbb name">


    <!--- xml書き込み --->
    <cffile action="write" file = "#local.outF#" output="#toString(local.xml)#" charset = "utf-8">
</cffunction>

2011-11-09

[]ColdFusionで簡単バックアップ

元記事はこちらです。

■Application.cfm

<cfapplication name="#hash(GetDirectoryFromPath(GetCurrentTemplatePath()))#">

<cfset request.mail_from    = "xxx@yyy.com">
<cfset request.mail_to      = "xxx@yyy.com">
<cfset request.subj         = "cf backup test">

■index.cfm

<!---/////////////////////////////////////////////////////////////////
backup
    1.xcopy.xml内のtoに$date$がある場合は、当日に日付でバックアップ
    2.xcopy-excludelist.txtに除外する拡張子など設定
//////////////////////////////////////////////////////////////////--->

<!--- 処理 --->
<cfset cst_exec()>
<!---=================================================================
cst_exec
==================================================================--->
<cffunction name="cst_exec" returnType="void" output="no">
    <cfset var local = structNew()>

    <!--- 絶対パス取得 --->
    <cfset local.path   = GetDirectoryFromPath(GetCurrentTemplatePath())>
    <cfset local.bat    = local.path & "xcopy.bat">
    <cfset local.xlist  = "/EXCLUDE:" & local.path & "xcopy-excludelist.txt">

    <!--- xmlデータ抽出 --->
    <cfset local.qry = cst_getData()>

    <cfset local.data = "">
    <cfloop query="local.qry">
        <!--- toに$date$がある場合はyyyymmddに変換する --->
        <cfset local.to = replace(local.qry.to, "$date$", "#dateformat(now(),'yyyymmdd')#")>

        <!--- xcopyを呼び出す --->
        <cfexecute
            name = "#local.bat#"
            arguments = "#local.qry.from# #local.to# #local.xlist#"
            timeout = "5"
            variable = "local.tmp"/>

        <cfset local.data = local.data & local.tmp>
    </cfloop>

    <!--- logをメール送信する --->
    <cfmail from="#request.mail_from#" to="#request.mail_to#" subject="#request.subj#">
    #local.data#
    </cfmail>
</cffunction>
<!---=================================================================
cst_getData
==================================================================--->
<cffunction name="cst_getData" returnType="query" output="no">
    <cfset var local = structNew()>
    <cfset local.qry = QueryNew("from,to","varchar,varchar")>

    <!--- 絶対パス取得 --->
    <cfset local.zPath = GetDirectoryFromPath(GetCurrentTemplatePath()) & "xcopy.xml">

    <!--- xml読み込み --->
    <cffile action="read" file = "#local.zPath#" variable = "local.data" charset = "utf-8">

    <cfset local.xml = XmlParse(local.data)>

    <cfset local.data2 = xmlSearch(local.xml, "/xcopy/data")>

    <cfloop index="local.idx" array="#local.data2#">
        <cfset local.from   = local.idx.from.XmlText>
        <cfset local.to     = local.idx.to.XmlText>

        <cfset QueryAddRow(local.qry)>
        <cfset QuerySetCell(local.qry, "from",  local.from)>
        <cfset QuerySetCell(local.qry, "to",    local.to)>
    </cfloop>

    <cfreturn local.qry>
</cffunction>

xcopy.xml


<xcopy>
    <data>
        <from>d:\pgm\test001</from>
        <to>d:\bak\test001</to>
    </data>
    <data>
        <from>d:\pgm\test002</from>
        <to>d:\bak\test002\$date$</to>
    </data>
</xcopy>



xcopy.bat

xcopy %1 %2\ %3 /D /S /E /H /C /Y /R

xcopy-excludelist.txt

$~
~$
~WRL
.tmp
.temp
IMG00001.DAT
.bkf
.qic
.iso
.img
.mp3
.wmv
.wma
outlook.pst
Thumbs.db
pspbrwse.jbf
pagefile.sys
win386.swp
catalog.wci
.ci
.0
.1
.2
.3
.4
.5
.6
.7
.8
.9
.000
.001
.002
.003
.004
.005
.006
.007
.008
.009
.log
@done
@work
@backup

2011-01-10

[]ClearDBを使ってみた

元記事はこちらです。

■Application.cfm

<cfprocessingdirective pageEncoding = "UTF-8">
<cfsetting enableCFoutputOnly="yes">

<cfapplication name="#hash( getCurrentTemplatePath() )#"
    sessionmanagement="yes"
    sessiontimeout=#CreateTimeSpan(1, 0, 0, 0)# >

<cfset request.proxyServer  = "">
<cfset request.proxyPort    = "80">

<cfset request.username = "xxx">
<cfset request.password = "yyy">
<cfset request.CLR_URL = "http://www.cleardb.com/v1/api.php?action=">

<cfparam name="application.s_id" default="">
<cfif (application.s_id eq "")>
    <cflock scope="application" timeout="60">
        <cfset application.s_id = cmn_login()>
    </cflock>
</cfif>
<!---===============================
cmn_login
    sessionIDを返す
================================--->
<cffunction name="cmn_login" access="public" returnType="string" output="no">
    <cfset var ret = "">

    <cfhttp 
        timeout="60"
        url="#request.CLR_URL#login"
        proxyServer="#request.proxyServer#"
        proxyPort="#request.proxyPort#"
        method = "post">

        <cfhttpparam type="formField" name="username" value="#request.username#">
        <cfhttpparam type="formField" name="password" value="#request.password#">
    </cfhttp>

    <cfif (cfhttp.filecontent eq "")>
        <cfreturn "">
    </cfif>

    <cfset ret = DeserializeJSON(cfhttp.filecontent)>
    <cfreturn ret.response>
</cffunction>

<!---===============================
cmn_sqlQuery
================================--->
<cffunction name="cmn_sqlQuery" access="public" returnType="struct" output="no">
    <cfargument name="s_id" type="string" required="yes">
    <cfargument name="qry"  type="string" required="yes">

    <cfhttp 
        timeout="60"
        url="#request.CLR_URL#sqlQuery"
        proxyServer="#request.proxyServer#"
        proxyPort="#request.proxyPort#"
        method = "post">
        <cfhttpparam type="formField" name="session_id" value="#arguments.s_id#">
        <cfhttpparam type="formField" name="query" value="#arguments.qry#">
    </cfhttp>

    <cfreturn DeserializeJSON(cfhttp.filecontent)>
</cffunction>

■insert.cfm

<cfset local = structNew()>

<cfloop index="local.line" file="#expandpath("data.txt")#">
    <cfif listLen(local.line, chr(9)) eq 3>
        <cfset local.asin       = ListGetAt(local.line, 1, chr(9))>
        <cfset local.title      = ListGetAt(local.line, 2, chr(9))>
        <cfset local.kin        = ListGetAt(local.line, 3, chr(9))>

        <cfsavecontent VARIABLE ="local.tmp">
        <cfoutput>
        insert into TEST_001 (
            ASIN,TITLE,KIN
        )values(
            '#local.asin#',
            '#local.title#',
             #local.kin#
        )
        </cfoutput>
        </cfsavecontent>

        <cfset local.data = cmn_sqlQuery(application.s_id, local.tmp)>
    </cfif>
</cfloop>

■view.cfm

<cfprocessingdirective pageEncoding = "UTF-8">
<cfparam name="url.order" default="asin">

<cfset local = structNew()>

<cfsavecontent VARIABLE ="local.tmp">
<cfoutput>
select *
from TEST_001
order by #url.order#
</cfoutput>
</cfsavecontent>

<cfset local.data = cmn_sqlQuery(application.s_id, local.tmp)>

<cfoutput>
<table border="1" cellspacing=0 cellpadding=0>
<cfloop index="local.idx" array="#local.data.response#">
    <tr>
        <td><a href="http://www.amazon.co.jp/exec/obidos/ASIN/#local.idx.asin#/utalab-22/ref=nosim" target="_blank">#local.idx.title#</a></td>
        <td align="right">#numberformat(local.idx.kin)#</td>
    </tr>
</cfloop>
</table>

</cfoutput>

■data.txt(タブくぎりでUTF-8のデータ)

4478015147	Facebookをビジネスに使う本	1500
4797361123	日本でいちばん社員満足度が高い会社の非常識な働き方	1470
4844329685	できるポケット au IS03をスマートに使いこなす基本&活用ワザ150	1344
4820717901	エバーノートとグーグルを使えばすべてのノート・メモ・書類が一元化できる! クラウド情報整理術	1575
4881668625	Twitter×アメブロでビジネスを加速する方法	1554

2010-12-20

[]Google Baseを使ったサンプル(2)

元記事はこちらです。

■Application.cfm

<cfprocessingdirective pageEncoding = "UTF-8">
<cfsetting enableCFoutputOnly="no">

<cfapplication name="#hash( getCurrentTemplatePath() )#"
    sessionmanagement="yes"
    sessiontimeout=#CreateTimeSpan(1, 0, 0, 0)# >

<cfset request.url = thisURL()>
<cfparam name="session.GToken"      default="">
<cfparam name="session.item_type"   default="">

<cfset request.proxyServer  = "">
<cfset request.proxyPort    = "80">
<cfset request.g_key = "xxx">

<cfset request.item=structNew()>
<cfset request.item.recipe  = "レシピ">
<cfset request.item.book    = "書籍">
<cfset request.item.meishi  = "名刺">
<!---==========================================
    thisURL
        実行されたURL。ただしファイル名は削除。
        例)http://hoge.com/
===========================================--->
<cffunction name="thisURL" access="public" returnType="string" output="no">
    <cfset var local = structNew()>

    <cfset local.server_name = cgi.server_name>
    <cfif cgi.server_port neq 80>
        <cfset local.server_name = local.server_name & ":" & cgi.server_port>
    </cfif>

    <cfset local.url = "#lcase(ListFirst(cgi.server_protocol,"/"))#://#local.server_name##cgi.script_name#">
    <cfset local.url = ListDeleteAt(local.url, ListLen(local.url, "/"), "/") & "/">

    <cfreturn local.url>
</cffunction>

■index.cfm

<cfprocessingdirective pageEncoding = "UTF-8">
<cfparam name="url.p"           default="">
<cfparam name="url.token"       default="">
<cfparam name="url.page"        default="1">
<cfparam name="form.item_type"  default="#session.item_type#">

<cfset iObj = "">
<cfif (form.item_type neq "")>
    <cfset iObj = createObject("component", "i_#item_type#").init()>
    <cfset session.item_type = form.item_type>
</cfif>

<!--- session.GToken --->
<cfif (session.GToken eq "")>
    <cfif (url.token neq "")>
        <cfset session.GToken = cst_authSubSessionToken(url.token)>
    </cfif>
</cfif>

<!--- 処理 --->
<cfset content = cst_dspMain()>
<cfswitch expression = "#url.p#">
    <!--- logout --->
    <cfcase value="logout">
        <cfset session.GToken = "">
    </cfcase>

    <!--- 一覧 --->
    <cfcase value="list">
        <cfset data = iObj.getData(url.page,3)>
        <cfset content = content & iObj.dspList(data)>
    </cfcase>

    <!--- add --->
    <cfcase value="add">
        <cfset content = content & iObj.dspAddFm()>
    </cfcase>

    <!--- addEnd --->
    <cfcase value="addEnd">
        <cfset form.id = "http://www.google.com/base/feeds/items/">
        <cfset data = iObj.setXmlForm()>
        <cfset content = content & cst_actionData(form.id, data, "post")>
    </cfcase>

    <!--- upd --->
    <cfcase value="upd">
        <cfset data = iObj.setXmlForm()>
        <cfset content = content & cst_actionData(form.id, data, "put")>
    </cfcase>

    <!--- del --->
    <cfcase value="del">
        <cfset content = content & cst_actionData(form.id, "", "delete")>
    </cfcase>

    <!--- 指定処理以外 --->
    <cfdefaultcase>
    </cfdefaultcase>
</cfswitch>
<cfif (session.GToken eq "")>
    <!--- 初期画面表示 --->
    <cfset content = "Please <a href='https://www.google.com/accounts/AuthSubRequest?next=#request.url#index.cfm&scope=http%3A%2F%2Fwww.google.com%2Fbase%2Ffeeds%2F&session=1&secure=0'>click here</A> to authorize.">
</cfif>
<cfset cst_dspLayout(content)>
<!---===============================
cst_authSubSessionToken
================================--->
<cffunction name="cst_authSubSessionToken" access="public" returnType="string" output="no">
    <cfargument name="token" type="string" required="yes">

    <cfhttp method="get" url="http://www.google.com/accounts/AuthSubSessionToken"
            proxyServer ="#request.proxyServer#"
            proxyPort   ="#request.proxyPort#"
    >
        <cfhttpparam type="header" name="Content-Type" value="application/atom+xml"> 
        <cfhttpparam type="header" name="Authorization" value="AuthSub token=#arguments.token#">
        <cfhttpparam name="X-Google-Key" type="Header" value="key=#request.g_key#">
    </cfhttp>

    <cfreturn ListLast(cfhttp.filecontent, "=")>
</cffunction>
<!---===============================
cst_dspMain
================================--->
<cffunction name="cst_dspMain" access="public" returnType="string" output="no">
    <cfset var local = structNew()>

    <cfsavecontent variable = "local.ret">
    <cfoutput>
    <form name="srch" method="post">
    <select name="item_type">
    <option value=""></option>
    <cfloop item="local.itm" collection="#request.item#">
    <option value="#local.itm#" <cfif (form.item_type eq local.itm)>selected</cfif>>#request.item[local.itm]#</option>
    </cfloop>
    </select>
    <input type="button" value="一覧" onClick="js_list()">
    <input type="button" value="登録" onClick="js_add()">
    <input type="button" value="LOGOUT" onClick="js_logout()">
    </form>
    <script language="JavaScript">
    <!--
    function js_chkSrch(){
        with(document.srch){
            if(item_type.value ==""){
                alert("select item_type");
                return false;
            }
            return true;
        }
    }
    function js_list(){
        if(!js_chkSrch()) return;
        with(document.srch){
            action = "index.cfm?p=list";
            submit();
        }
    }
    function js_add(){
        if(!js_chkSrch()) return;
        with(document.srch){
            action = "index.cfm?p=add";
            submit();
        }
    }
    function js_logout(){
        with(document.srch){
            action = "index.cfm?p=logout";
            submit();
        }
    }
    //-->
    </script>
    </cfoutput>
    </cfsavecontent>

    <cfreturn local.ret>
</cffunction>
<!---===============================
cst_actionData
================================--->
<cffunction name="cst_actionData" access="public" returnType="string" output="no">
    <cfargument name="id"       type="string" required="yes">
    <cfargument name="data"     type="string" required="yes">
    <cfargument name="action"   type="string" required="yes">

    <cfhttp url="#arguments.id#" method="#arguments.action#" redirect="no"
        proxyServer ="#request.proxyServer#"
        proxyPort   ="#request.proxyPort#"
        >
        <cfhttpparam type="header" name="Content-Type" value="application/atom+xml"> 
        <cfhttpparam type="header" name="Authorization" value="AuthSub token=#session.GToken#">
        <cfhttpparam name="X-Google-Key" type="Header" value="key=#request.g_key#">
        <cfhttpparam type="Body" value="#arguments.data#">
    </cfhttp>

    <cfif (left(cfhttp.Responseheader.status_code,2) neq "20")>
        <cfreturn HTMLEditFormat(cfhttp.filecontent)>
    </cfif>

    <cfreturn "">
</cffunction>
<!---===============================
cst_dspLayout
================================--->
<cffunction name="cst_dspLayout" access="public" returnType="void" output="yes">
    <cfargument name="content" type="string" required="yes">

    <cfcontent type="text/html; charset=utf-8">
    <cfoutput>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <meta http-equiv="content-style-type" content="text/css; charset=utf-8" />
        <title>test</title>
    </head>
    <body>
    #arguments.content#
    </body>
    </html>
    </cfoutput>
</cffunction>

■item.cfc

<cfcomponent>
    <cfset variables.listFld = ""><!--- id,title,item_type以外(継承したcfcでセット) --->
<!---/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/
public
/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=--->
    <!---===============================
    init
    ================================--->
    <cffunction name="init" access="public" returnType="item" output="no">
        <cfreturn this>
    </cffunction>
    <!---===============================
    getData
    ================================--->
    <cffunction name="getData" access="public" returnType="struct" output="no">
        <cfargument name="page"     type="string" required="yes">
        <cfargument name="maxRow"   type="string" default="15">

        <cfset var local    = structNew()>
        <cfset var ret      = structNew()>

        <cfset local.start = 1 + (arguments.page - 1) * arguments.maxRow>

        <!--- Initial query string setup --->
        <cfset local.queryString="http://www.google.com/base/feeds/items?start-index=#local.start#&max-results=#arguments.maxRow#&bq=[itemtype:#urlencodedformat('#request.item[form.item_type]#')#]">

        <cfhttp method="Get" url="#local.queryString#"
            proxyServer ="#request.proxyServer#"
            proxyPort   ="#request.proxyPort#"
        >
            <cfhttpparam type="header" name="Authorization" value="AuthSub token=#session.GToken#">
            <cfhttpparam name="X-Google-Key" type="Header" value="key=#request.g_key#">
        </cfhttp>

        <cfset local.data = xmlparse(cfhttp.filecontent)>

        <cfset ret.totalResults = local.data.feed["openSearch:totalResults"].XmlText>
        <cfset ret.maxPage      = Ceiling(ret.totalResults / arguments.maxRow)>
        <cfif (ret.totalResults neq 0)>
            <cfset local.listFld = "id,title,#variables.listFld#">  <!--- id,titleを追加 --->
            <cfset ret.qry = QueryNew(local.listFld)>

            <cfloop index="local.idx" from="1" to="#arrayLen(local.data.feed.entry)#">
                <cfset local.currentData = local.data.feed.entry[local.idx]>

                <cfset QueryAddRow(ret.qry)>
                <cfloop index="local.idx" list="#local.listFld#">
                    <cfif isDefined("local.currentData.#local.idx#")>
                        <cfset local.tmp = "">
                        <!--- 同じ項目が複数ある場合は、カンマ区切り --->
                        <cfloop index="local.idx2" from="1" to="#arrayLen(local.currentData[local.idx])#">
                            <cfset local.cdata = local.currentData[local.idx][local.idx2]>
                            <cfset local.tmp = ListAppend(local.tmp,local.cdata.XmlText)>
                        </cfloop>
                        <cfset QuerySetCell(ret.qry, "#local.idx#", local.tmp)>
                    </cfif>
                </cfloop>
            </cfloop>
        </cfif>

        <cfreturn ret>
    </cffunction>
    <!---===============================
    setXmlForm
        id,title,item_typeと
        その他text項目だけの分
    ================================--->
    <cffunction name="setXmlForm" access="public" returnType="string" output="no">
        <cfset var local = structNew()>
        <cfset var ret = "">

        <!---xml --->
        <cfxml variable="ret">
        <cfoutput>
        <?xml version='1.0'?>
        <entry  xmlns='http://www.w3.org/2005/Atom'
                xmlns:g='http://base.google.com/ns/1.0'>
        <title type="text">#form.title#</title>
        <g:item_type type="text">#request.item[form.item_type]#</g:item_type>
        <cfloop index="local.idx" list="#variables.listFld#">
            <g:#local.idx# type="text">#form[local.idx]#</g:#local.idx#>
        </cfloop>
        </entry>
        </cfoutput>
        </cfxml>

        <cfreturn toString(ret)>
    </cffunction>
    <!---===============================
    dspList
    ================================--->
    <cffunction name="dspList" access="public" returnType="string" output="no">
        <cfargument name="data" type="struct" required="yes">

        <cfset var local    = structNew()>
        <cfset var qry      = "">
        <cfset var ret      = "">

        <cfset local.listFld = "title,#variables.listFld#"> <!--- titleを追加 --->

        <cfsavecontent variable = "ret">
        <cfoutput>
        <cfif (arguments.data.totalResults eq 0)>
        no data
        <cfelse>
            <cfset qry = arguments.data.qry>

            <table>
                <tr>
                    <cfloop index="local.idx" list="#local.listFld#">
                        <td>#local.idx#</td>
                    </cfloop>
                </tr>

                <cfloop query="qry">
                    <form name="frm_#qry.currentRow#" method="post">
                    <input type="hidden" name="id" value="#qry.id#">
                    <input type="hidden" name="item_type" value="#form.item_type#">

                    <tr>
                        <cfloop index="local.idx" list="#local.listFld#">
                            <cfset local.tmp = "">
                            <cfif isDefined("qry.#local.idx#")>
                                <cfset local.tmp = qry[local.idx]>
                            </cfif>
                            <td><input type="text" name="#local.idx#" value="#local.tmp#"></td>
                        </cfloop>
                        <td><input type="button" value="upd" onClick="js_upd(#qry.currentRow#)"></td>
                        <td><input type="button" value="del" onClick="js_del(#qry.currentRow#)"></td>
                    </tr>
                    </form>
                </cfloop>
            </table>
            <cfif (url.page gt 1)>
                <cfset local.page = url.page - 1>
                <a href="index.cfm?p=list&page=#local.page#">prev</a>&nbsp;
            </cfif>
            <cfif (url.page lt arguments.data.maxPage)>
                <cfset local.page = url.page + 1>
                <a href="index.cfm?p=list&page=#local.page#">next</a>
            </cfif>
        </cfif>

        <script language="JavaScript">
        <!--
        function js_upd(pID){
            with(eval("document.frm_"+pID)){
                action = "index.cfm?p=upd";
                submit();
            }
        }
        function js_del(pID){
            with(eval("document.frm_"+pID)){
                action = "index.cfm?p=del";
                submit();
            }
        }
        //-->
        </script>

        </cfoutput>
        </cfsavecontent>

        <cfreturn ret>
    </cffunction>
    <!---===============================
    dspAddFm
    ================================--->
    <cffunction name="dspAddFm" access="public" returnType="string" output="no">
        <cfset var local = structNew()>
        <cfset var ret = "">

        <cfset local.listFld = "title,#variables.listFld#"> <!--- titleを追加 --->

        <cfsavecontent variable = "ret">
        <cfoutput>
        <form name="frm" action="index.cfm?p=addEnd" method="post">
        <input type="hidden" name="item_type" value="#form.item_type#">
        <table>
            <cfloop index="local.idx" list="#local.listFld#">
                <tr>
                    <td>#local.idx#</td>
                    <td><input type="text" name="#local.idx#"></td>
                </tr>
            </cfloop>
        </table>
        <input type="button" value="add" onClick="js_addEnd()">
        </form>

        <script language="JavaScript">
        <!--
        function js_addEnd(){
            with(document.frm){
                <cfloop index="local.idx" list="#local.listFld#">
                    if(#local.idx#.value==""){
                        alert("please input #local.idx#");
                        return;
                    }
                </cfloop>
                submit();
            }
        }
        //-->
        </script>
        </cfoutput>
        </cfsavecontent>

        <cfreturn ret>
    </cffunction>
<!---/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/
private
/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=--->
</cfcomponent>

■i_book.cfc

<cfcomponent extends="item">
    <cfset variables.listFld = "asin,author,price"><!--- id,title,item_type以外 --->
</cfcomponent>

■i_meishi.cfc

<cfcomponent extends="item">
    <cfset variables.listFld = "sei,sei_yomi,mei,mei_yomi,company,tel,fax"><!--- id,title,item_type以外 --->
</cfcomponent>

■i_recipe.cfc

<cfcomponent extends="item">
    <cfprocessingdirective pageEncoding = "UTF-8">  <!--- ソース内に画面など書く場合、component内ではここで指定(cfcomponentの上ではエラーとなる) --->
    <cfset variables.listFld = "content,cuisine,cooking_time,main_ingredient"><!--- id,title,item_type以外 --->
<!---/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/
public
/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=--->
    <!---===============================
    setXmlForm
    ================================--->
    <cffunction name="setXmlForm" access="public" returnType="string" output="no">
        <cfset var local = structNew()>
        <cfset var ret = "">

        <!---xml --->
        <cfxml variable="ret">
        <cfoutput>
        <?xml version='1.0'?>
        <entry  xmlns='http://www.w3.org/2005/Atom'
                xmlns:g='http://base.google.com/ns/1.0'>
        <title type="text">#form.title#</title>
        <g:item_type type="text">#request.item[form.item_type]#</g:item_type>
        <content type="xhtml">#form.content#</content>
        <g:cuisine type="text">#form.cuisine#</g:cuisine>
        <g:cooking_time type="intUnit">#form.cooking_time#</g:cooking_time>

        <!--- 複数あり --->
        <cfloop index="local.idx" list="#form.main_ingredient#">
            <g:main_ingredient type="text">#local.idx#</g:main_ingredient>
        </cfloop>
        </entry>
        </cfoutput>
        </cfxml>

        <cfreturn toString(ret)>
    </cffunction>

    <!---===============================
    dspAddFm
    ================================--->
    <cffunction name="dspAddFm" access="public" returnType="string" output="no">
        <cfset var local = structNew()>
        <cfset var ret = "">

        <cfset local.listFld = "title,#variables.listFld#"> <!--- titleを追加 --->

        <cfsavecontent variable = "ret">
        <cfoutput>
        <form name="frm" action="index.cfm?p=addEnd" method="post">
        <input type="hidden" name="item_type" value="#form.item_type#">
        <table>
            <tr>
                <td>title</td>
                <td><input type="text" name="title"></td>
                <td>タイトル</td>
            </tr>
            <tr>
                <td>content</td>
                <td valign="top"><textarea cols="30" rows="5" name="content"></textarea></td>
                <td>コンテンツ(htmlタグを使う)</td>
            </tr>
            <tr>
                <td>cuisine</td>
                <td><input type="text" name="cuisine"></td>
            </tr>
            <tr>
                <td>cooking_time</td>
                <td><input type="text" name="cooking_time"></td>
                <td>料理時間(半角数字)</td>
            </tr>
            <tr>
                <td>main_ingredient</td>
                <td><input type="text" name="main_ingredient"></td>
                <td>メインとなる材料(複数の場合半角カンマ区切り)</td>
            </tr>
        </table>
        <input type="button" value="add" onClick="js_addEnd()">
        </form>

        <script language="JavaScript">
        <!--
        function js_addEnd(){
            with(document.frm){
                <cfloop index="local.idx" list="#local.listFld#">
                    if(#local.idx#.value==""){
                        alert("please input #local.idx#");
                        return;
                    }
                </cfloop>
                submit();
            }
        }
        //-->
        </script>
        </cfoutput>
        </cfsavecontent>

        <cfreturn ret>
    </cffunction>
</cfcomponent>

2010-12-19

[]Google Baseを使ったサンプル(1)

元記事はこちらです。

■Application.cfm

<cfprocessingdirective pageEncoding = "UTF-8">
<cfsetting enableCFoutputOnly="no">

<cfapplication name="#hash( getCurrentTemplatePath() )#"
    sessionmanagement="yes"
    sessiontimeout=#CreateTimeSpan(1, 0, 0, 0)# >

<cfset request.url = thisURL()>
<cfparam name="session.GToken" default="">

<cfset request.proxyServer  = "">
<cfset request.proxyPort    = "80">
<cfset request.g_key = "xxx">
<!---==========================================
    thisURL
        実行されたURL。ただしファイル名は削除。
        例)http://hoge.com/
===========================================--->
<cffunction name="thisURL" access="public" returnType="string" output="no">
    <cfset var local = structNew()>

    <cfset local.server_name = cgi.server_name>
    <cfif cgi.server_port neq 80>
        <cfset local.server_name = local.server_name & ":" & cgi.server_port>
    </cfif>

    <cfset local.url = "#lcase(ListFirst(cgi.server_protocol,"/"))#://#local.server_name##cgi.script_name#">
    <cfset local.url = ListDeleteAt(local.url, ListLen(local.url, "/"), "/") & "/">

    <cfreturn local.url>
</cffunction>

■index.cfm

<cfprocessingdirective pageEncoding = "UTF-8">
<cfparam name="url.p"       default="">
<cfparam name="url.token"   default="">
<cfparam name="url.page"    default="0">

<!--- session.GToken --->
<cfif (session.GToken eq "")>
    <cfif (url.token neq "")>
        <cfset session.GToken = cst_authSubSessionToken(url.token)>
    </cfif>
<cfelse>
    <cfif (url.p eq "init")>
        <cfset session.GToken = "">
    </cfif>
</cfif>

<!--- 処理 --->
<cfset content = "<a href='index.cfm?p=list'>一覧</a> <a href='index.cfm?p=add'>登録</a><br><br>">
<cfswitch expression = "#url.p#">
    <!--- 一覧 --->
    <cfcase value="list">
        <cfset data = cst_getData(url.page)>
        <cfset content = content & cst_dspList(data)>
    </cfcase>

    <!--- add --->
    <cfcase value="add">
        <cfset content = content & cst_dspAddFm()>
    </cfcase>

    <!--- addEnd --->
    <cfcase value="addEnd">
        <cfset form.id = "http://www.google.com/base/feeds/items/">
        <cfset data = cst_setXmlForm()>
        <cfset content = content & cst_actionData(form.id, data, "post")>
    </cfcase>

    <!--- upd --->
    <cfcase value="upd">
        <cfset data = cst_setXmlForm()>
        <cfset content = content & cst_actionData(form.id, data, "put")>
    </cfcase>

    <!--- del --->
    <cfcase value="del">
        <cfset content = content & cst_actionData(form.id, "", "delete")>
    </cfcase>

    <!--- 指定処理以外 --->
    <cfdefaultcase>
        <cfif (session.GToken eq "")>
            <!--- 初期画面表示 --->
            <cfset content = "Please <a href='https://www.google.com/accounts/AuthSubRequest?next=#request.url#index.cfm&scope=http%3A%2F%2Fwww.google.com%2Fbase%2Ffeeds%2F&session=1&secure=0'>click here</A> to authorize.">
        </cfif>
    </cfdefaultcase>
</cfswitch>
<cfoutput>#content#</cfoutput>
<!---===============================
cst_authSubSessionToken
================================--->
<cffunction name="cst_authSubSessionToken" access="public" returnType="string" output="no">
    <cfargument name="token" type="string" required="yes">

    <cfhttp method="get" url="http://www.google.com/accounts/AuthSubSessionToken"
            proxyServer ="#request.proxyServer#"
            proxyPort   ="#request.proxyPort#"
    >
        <cfhttpparam type="header" name="Content-Type" value="application/atom+xml"> 
        <cfhttpparam type="header" name="Authorization" value="AuthSub token=#arguments.token#">
        <cfhttpparam name="X-Google-Key" type="Header" value="key=#request.g_key#">
    </cfhttp>

    <cfreturn ListLast(cfhttp.filecontent, "=")>
</cffunction>
<!---===============================
cst_getData
================================--->
<cffunction name="cst_getData" access="public" returnType="struct" output="no">
    <cfargument name="page"     type="string" required="yes">
    <cfargument name="maxRow"   type="string" default="15">

    <cfset var local    = structNew()>
    <cfset var ret      = structNew()>

    <cfset local.start = 1 + arguments.page * arguments.maxRow>

    <!--- Initial query string setup --->
    <cfset local.queryString="http://www.google.com/base/feeds/items?start-index=#local.start#&max-results=#arguments.maxRow#">

    <cfhttp method="Get" url="#local.queryString#"
        proxyServer ="#request.proxyServer#"
        proxyPort   ="#request.proxyPort#"
    >
        <cfhttpparam type="header" name="Authorization" value="AuthSub token=#session.GToken#">
        <cfhttpparam name="X-Google-Key" type="Header" value="key=#request.g_key#">
    </cfhttp>

    <cfset local.data = xmlparse(cfhttp.filecontent)>

    <cfset ret.totalResults = local.data.feed["openSearch:totalResults"].XmlText>
    <cfif (ret.totalResults neq 0)>
        <cfset ret.qry = QueryNew("id,title,item_type","varchar,varchar,varchar")>

        <cfloop index="local.idx" from="1" to="#arrayLen(local.data.feed.entry)#">
            <cfset local.currentData = local.data.feed.entry[local.idx]>

            <cfset QueryAddRow(ret.qry)>
            <cfset QuerySetCell(ret.qry, "id",          local.currentData.id.XmlText)>
            <cfset QuerySetCell(ret.qry, "title",       local.currentData.title.XmlText)>
            <cfset QuerySetCell(ret.qry, "item_type",   local.currentData.item_type.XmlText)>
        </cfloop>
    </cfif>

    <cfreturn ret>
</cffunction>
<!---===============================
cst_dspList
================================--->
<cffunction name="cst_dspList" access="public" returnType="string" output="no">
    <cfargument name="data" type="struct" required="yes">

    <cfset var local    = structNew()>
    <cfset var qry      = "">
    <cfset var ret      = "">

    <cfsavecontent variable = "ret">
    <cfoutput>
    <cfif (arguments.data.totalResults eq 0)>
    no data
    <cfelse>
        <cfset qry = arguments.data.qry>

        <table>
            <tr>
                <td>title</td>
                <td>item_type</td>
            </tr>

            <cfloop query="qry">
                <form name="frm_#qry.currentRow#" method="post">
                <input type="hidden" name="id" value="#qry.id#">

                <tr>
                    <td><input type="text" name="title"     value="#qry.title#"></td>
                    <td>#qry.item_type#</td>
                    <input type="hidden" name="item_type"   value="#qry.item_type#">
                    <td><input type="button" value="upd" onClick="js_upd(#qry.currentRow#)"></td>
                    <td><input type="button" value="del" onClick="js_del(#qry.currentRow#)"></td>
                </tr>
                </form>
            </cfloop>
        </table>
    </cfif>

    <script language="JavaScript">
    <!--
    function js_upd(pID){
        with(eval("document.frm_"+pID)){
            action = "index.cfm?p=upd";
            submit();
        }
    }
    function js_del(pID){
        with(eval("document.frm_"+pID)){
            action = "index.cfm?p=del";
            submit();
        }
    }
    //-->
    </script>

    </cfoutput>
    </cfsavecontent>

    <cfreturn ret>
</cffunction>
<!---===============================
cst_dspAddFm
================================--->
<cffunction name="cst_dspAddFm" access="public" returnType="string" output="no">
    <cfset var ret = "">

    <cfsavecontent variable = "ret">
    <cfoutput>
    <form name="frm" action="index.cfm?p=addEnd" method="post">
    <table>
    <tr>
        <td>title</td>
        <td>item_type</td>
    </tr>
    <tr>
        <td><input type="text" name="title"></td>
        <td><input type="text" name="item_type"></td>
    </tr>
    </table>
    <input type="button" value="add" onClick="js_add()">
    </form>

    <script language="JavaScript">
    <!--
    function js_add(){
        with(document.frm){
            if((title.value=="")||(item_type=="")){
                alert("please input all data");
                return;
            }
            submit();
        }
    }
    //-->
    </script>

    </cfoutput>
    </cfsavecontent>

    <cfreturn ret>
</cffunction>
<!---===============================
cst_setXmlForm
================================--->
<cffunction name="cst_setXmlForm" access="public" returnType="string" output="no">
    <cfset var ret = "">

    <!---xml --->
    <cfxml variable="ret">
    <cfoutput>
    <?xml version='1.0'?>
    <entry  xmlns='http://www.w3.org/2005/Atom'
            xmlns:g='http://base.google.com/ns/1.0'>
    <title type="text">#form.title#</title>
    <g:item_type type="text">#form.item_type#</g:item_type>
    </entry>
    </cfoutput>
    </cfxml>

    <cfreturn toString(ret)>
</cffunction>
<!---===============================
cst_actionData
================================--->
<cffunction name="cst_actionData" access="public" returnType="string" output="no">
    <cfargument name="id"       type="string" required="yes">
    <cfargument name="data"     type="string" required="yes">
    <cfargument name="action"   type="string" required="yes">

    <cfhttp url="#arguments.id#" method="#arguments.action#" redirect="no"
        proxyServer ="#request.proxyServer#"
        proxyPort   ="#request.proxyPort#"
        >
        <cfhttpparam type="header" name="Content-Type" value="application/atom+xml"> 
        <cfhttpparam type="header" name="Authorization" value="AuthSub token=#session.GToken#">
        <cfhttpparam name="X-Google-Key" type="Header" value="key=#request.g_key#">
        <cfhttpparam type="Body" value="#arguments.data#">
    </cfhttp>

    <cfif (left(cfhttp.Responseheader.status_code,2) neq "20")>
        <cfreturn HTMLEditFormat(cfhttp.filecontent)>
    </cfif>

    <cfreturn "">
</cffunction>