忍者ブログ
全くIT系ではない製造業の社員がイントラ上でColdFusionと格闘。システム構築を外部委託するとき「できればColdFusionでお願いします」と頼むのだが・・・・
[1] [2] [3] [4] [5]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

苦い濃いより、甘い濃い。
毎日暑くてふにゃふにゃです。

さて、

<cfset blogList = "satou,suzuki,tanaka,yamaguchi,yamada">

<cfset rssDoc = structnew()>

<!--- ■RSS get --->
<cfloop list="#blogList#" index="blogname">
<cfhttp url="http://blog.hogehoge.co.jp/#blogname#/index.xml" result="#blogname#" />
</cfloop>

<!--- ■xml解析 --->
<cfloop list="#blogList#" index="blogname">
<cfset rssDoc[#blogname#] = XmlParse(Evaluate("#blogname#.filecontent"))>
</cfloop>

<!--- ■内部mt_entry更新 --->
<cfquery name="upd" datasource="mtdb">
UPDATE hogehoge SET hoge WHERE entry_id = '123'
</cfquery>

<!--- ■表示部分 --->
<cfloop list="#blogList#" index="blogername">
<cfoutput>
BlogerName:#blogername#<br />
lastBuildDate:#CreateODBCDateTime(rssDoc[blogername].rss.channel.lastBuildDate.XmlText)#<br />
TITLE:#rssDoc[blogername].rss.channel.item[1].title.XmlText#<br />
description:#REReplace(rssDoc[blogername].rss.channel.item[1].description.XmlText,"<[^>]*>","","All")#
<hr />
</cfoutput>
</cfloop>

コアな部分はこんな感じですね。
ポイントとしては、数人分のxmlオブジェクトをループ処理できるように、rssDoc という構造体にまとめて入れたこと。
で、構造体を扱うときにハマリがちな部分は、
rssDoc.satou.hoge.fuga.ColdFusion.great という風に、直書きなら扱えるけれど、
rssDoc.#blogername#.hoge.fuga.ColdFusion.great という風に変数をドットシンタックスには入れられない点。なんで?と言われてもよくわかりまへん。変数名なのか構造体のキー名なのかわからないからかな?ColdFusionの仕様
その場合は、[連想配列]として扱えばOKです。
rssDoc[blogername].hoge.fuga.ColdFusion.great

あと、わかってるようで実はイマイチわかっていないのが Evaluate 関数。(→LiveDocs
マニュアルには、

説明

1 つ以上の文字列式をダイナミックに左から右へ評価します(左部分の評価結果が右部分に対して意味を持つことがあります)。右端にある式の評価結果が返されます。

とありますが、σ(・・*)ワタシ的には意味不明。
ただ、いろいろやっているうちに、この関数は、「変数で変数名を作る」ときに使える と理解しています。
今回の場合、satou.filecontent や suzuki.filecontent という変数をXmlParseする必要があったのですが、XmlParse(#blogername#.filecontent) とするとエラーになります。
XmlParse(Evaluate("#blogername#.filecontent")) とすると、XmlParse(satou.filecontent) としたときと同じ処理になってくれます。

構造体や配列をループ処理するときによく使いますね。Evaluateは。
PR
(背景)

まずはブログのRSSを<cfhttp>で取り込みます。
 <cfhttp url="http://blog.himitu.co.jp/suzuki/index.xml" result="suzuki" />
以上・・・・(^▽^;)

こんなノリでできるのがColdFusionの大好きなところ。(このURLはデタラメです。念のため)

MovableType(3.2)が自動的に作成するRSSフィードのURLは決まっているので、それを指定して、変数 suzuki に格納です。
するとsuzukiは構造体変数として、HTTPのヘッダやらなにやら、いろんな情報が入ります。(実はよくわかってないが(*´ー`)
で、この中の、suzuki.filecontent がRSSのネタなわけです。
コイツから、新着や更新日を抜きます。

ちなみに、このブログのRSSを取り込んでダンプするとこんな感じ。
<cfhttp url="http://ameblo.jp/cfif/rss.html" result="sample">
<cfdump var="#sample#">
cfdump1


ちなみに、ブログは複数あるので、リストで廻してRSSを全部ひっぱります。
<cfset blogList = "suzuki,satou,tanaka,yamaguchi">
<cfloop list="#blogList#" index="blogname">
 <cfhttp url="http://blog.himitu.co.jp/#blogname#/index.xml" result="#blogname#" />
</cfloop>
これで、鈴木君・佐藤君・田中君・山口君 のRSSゲットです。

参考までに、
<cfhttp url="http://blog.himitu.co.jp/suzuki/index.xml" path="/var/www/blogs/ftp" file="suzuki.xml" />
とすると、こちらのサーバーにファイルとして保存されます。
ファイルとして保存したときはresultを指定しても、FileContentはカラッポなので注意が必要です。
コレ↑ちょっとハマッタのでした。


次に、FileContent をxmlに変換して必要なデータを取り出します。
今日は、リストとクエリをcfloopで廻してみた。
まぁ、特別なことでは無いわけですが、例として。

背景として、このページには結構大きなマトリクス表で、セルの数だけクエリオブクエリを発行しています。
最初に一発DBに対してクエリを発行し、その結果に対してクエリオブクエリを203回発行してます。
構造体でやったほうが良かったかも・・・・

で、その表示部分で使っているロジックです。
<cfset catList = "5000,6005,6003,6004,6014,6017,9999">

<table>
 <tr>
  <td>AAA</td>
   <cfloop list="#catList#" index="i">
   <td>
    <cfloop query="AAA000#i#">
     <a href="edit.cfm?hachucd=#HACHUCD#"title="#HACHUCD#">#RNAME#</a>&nbsp;
    </cfloop>
   </td>
   </cfloop>
 </tr>

 <tr>
  <td>AA</td>
  <cfloop
 ・
 ・
 ・
</table>

クエリの名前が不連続(AAA0005000 , AAA0006005 ,,,,)なため、クエリ名の不連続な部分をリスト(catList)にして外側のループをListで廻しています。
その内側でリストのインデックスを使ってクエリ名を指定し、クエリをループ。

ま、それなりにスッキリしたつもりですが、やっぱり構造体の方がカッコイイかな・・・・・
<cfchart>はグラフを書いてくれるタグ。フォーマットをFlashにすると、にゅ~っと延びるグラフとかが勝手にできたりするので、素人受けがしますね。(´∀`)

ところがこいつの見た目をいろいろいじろうとすると、結構大変。エクセルのようにはなかなかいかないです。
webCharts3D 5.0を使いこなせると怖いもの無しですが、それはまた今度。
chart_bake 結構最初にすぐハマるのは、pieチャートのラベル表示です。
<cfchart format="jpg">
<cfchartseries type="pie" datalabelstyle="pattern" >
<cfchartdata item="北海道" value="501">
<cfchartdata item="沖縄" value="213">
</cfchartseries>
</cfchart>
こいつは右のように化けます。
ちなみに文字コードは全部UTF-8でやってます。

化けるのはpieチャートの時だけです。barやlineの時は問題なく表示されるのですが・・・・・

これは数ヶ月悩んでいて、バグなんだろうとあきらめていたのですが、webCharts3Dでいろいろいじっていたら解決法を発見しました。

<ColdFusionをインストールしたルート>/charting/styles
フォルダに、チャートのデフォルト設定なんかがxmlで保存されています。
default.xml
default_pie.xml
beige.xml
beige_pie.xml


この中の、default_pie.xmlにColdFusionAdministratorでマッピングされている日本語フォントを一言加えると解決します。

<?xml version="1.0" encoding="UTF-8"?>
<pieChart depth="Double" style="Solid" angle="340" is3D="false">
<dataLabels style="Value" placement="Outside" font="MS UI Gothic-12"/>
<legend>
<decoration style="None"/>
</legend>
<elements place="Default" drawOutline="false">
<series index="0">
<paint color="#E48701"/>
</series>
<series index="1">
<paint color="#A5BC4E"/>
</series>
       ・
       ・
       ・
</elements>
<popup background="#C8FFFFFF" foreground="#333333"/>
パイチャート 文字化けなし <paint paint="Plain"/>
<insets left="5" top="5" right="5" bottom="5"/>
</pieChart>

本来は各dataLabelのstyleごとに書かないとダメだと思うのですが、なぜかstyle="Value"に付け加えると、全部のdataLabelstyleに適用されるようです。

表示するとこんな感じですね。

<cfdocument>はwebページをそのまんまPDFやFlashPaperにできてしまうColdFusionMX7から(確か)のタグ。

<cfdocument format="pdf">
<h1>あはは!</h1>
<p>こんにちは世界!</p>
</cfdocument>

とするだけでOK。

ことのきかなり悩んだのはスタイルシート。
日本語版だとデフォルトは明朝なんですが、スタイルシートでフォントファミリをゴシックにしても変わらない。
ボーダーや色の指定も反映されない・・・
CFAdministratorのフォントで登録したりいろいろしたんですが、結局スタイルシートそのものを<cfdocument>内に入れなければいけないと判明しました。

つまり、<link href="hogehoge.css">などの外部リンクだと全部無視されてしまいます。

<cfdocument format="flashpaper" pagetype="custom" pageheight="29.7" pagewidth="42.0" unit="cm" scale="50" margintop="1" marginbottom="1" >

<style type="text/css">
<!--
body {font:"MS UI Gothic";}
TABLE {
/*font-size: 12px;*/
border:1px solid black;
}
h1 {
font-size:large;
margin:5px;padding:0;
}
.footer {
font-size:medium;
margin:0;padding:0;
}

TD {vertical-align:text-top;}
.solidline {border-bottom:1px solid black;border-right:1px solid black;}
.dottedline {border-bottom:1px dashed black;border-right:1px solid black;}
.doubleline {border-bottom:3px double;border-right:1px solid black;}

-->
</style>
<cfoutput>
<h1>建築本部重要顧客(ランクの定義と用途別分類)-- 最終更新日時:#DateFormat(LASTUPD.LASTUPDATE,"yyyy/mm/dd")# #TimeFormat(lastupd.lastupdate,"HH:MM")#</h1>
</cfdocument>

と、こんな感じでスタイルシートをcfdocumentに含めてあげるとOKです。

ちなみに、この場合A3横のフォーマットになります。scaleを自動調整して決めたページ数に自動縮小とかしてくれるといいんですがね。

ブログ内検索
プロフィール
HN:
CFIF
性別:
男性
自己紹介:
もっと日本でもColdFusionが広まって欲しいです。

情報通信を生業としない企業の、システム系でもない普通の社員なので、 ColdFusionは独学。参考書が少ないのがツライです・・・・なんだかんだ、ColdFusion4.xのシリウス時代から7年くらいのおつきあい?リンコムNextのソースが教科書かも。

外注するときはよく「できればColdFusionで・・・・」とお願いするのですが、ほとんどの場合「えっ!?」と驚かれてしまい、「SEのアサインが・・・」などと営業さんが困ってしまうことが多くて悲しいです。
ちょっとしたものなら自分でシステム構築しちゃいますが、一人でやるには時間が足りませんね・・・

FlashRemotingとかもやりますが、Flexには手を出してません。
と、最初の頃書きましたが、ついにFlexに手を出しました。Flex1.5はイマイチわかりませんでしたが、Flex2は別物ですね。これで6万円でイインデスカ?
そしてFlex2とColdFusionの組み合わせなら無敵な気がしますよ。ほんとに。
最新トラックバック
カレンダー
04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
なかのひと
忍者ブログ [PR]