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

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

hidedelay 等のプロパティが無視されてしまう。
CF8.01のHOTFIX(1-4)も効かない
 
 
ColdFusion.Tooltip.getToolTip=function(_348,_349){
var _34a=ColdFusion.objectCache[_349.context];
if(!_34a){
if(_349.hidedelay != undefined) _349.hidedelay = Number(_349.hidedelay);
if(_349.autodismissdelay != undefined) _349.autodismissdelay = Number(_349.autodismissdelay);
if(_349.showdelay != undefined) _349.showdelay = Number(_349.showdelay);

_34a=new YAHOO.widget.Tooltip(_349.context+"_cf_tooltip",_349);
 
ここを追加
 
 

PR
緊急地震速報の取材を受けたりしました。
夕刊とはいえ、毎日新聞の1面トップでカラー写真入りだったのにはオドロイタ。
多分、生涯これっきりだろうな。凶悪犯罪でも犯さない限り。

さて、

クエリ結果をCSVでダウンロードさせる方法として、最近このUDF(ユーザー定義関数)を使ってます。

QueryToCSV2 (http://www.cflib.org/udf.cfm?ID=1197)

このUDFと<cffile>を使えば、えらい簡単にできちゃいますね。

特に、queryのフィールドの並び順を任意に変えて落とせるところがいいです。
やったことある人はわかると思いますが、CFQUERYで取得するレコードセットって、フィールドの並び順がアルファベット順になっちゃうので、わかりにくくなってしまいます。(※oracle+jdbcドライバの時だけかも)


使い方のサンプルとしては、こんな感じ。

download.cfm

<!---UDF定義--->
<cfscript>
function QueryToCSV2(query){
 http://www.cflib.org/udf.cfm?ID=1197 のソース
}
</cfscript>

<!--- DownLoadするクエリ --->
<cfquery datasource="ds" name="samplequery">
select NAME,ADDRESS,EMAIL from notice
</cfquery>

<!--- CSVファイルを、指定の場所に作る --->
<cffile action="write" file="d:\cf_wwwroot\download\sample.csv"
output="#QueryToCSV2(samplequery,'氏名,メールアドレス,住所','NAME,EMAIL,ADDRESS')#">

<!--- CSVファイルを落として、消す --->
<CFHEADER NAME="Content-Disposition" VALUE="inline; filename=sample.csv">
<cfcontent type="application/msexcel" file="d:\cf_wwwroot\download\sample.csv" deletefile="yes">

#QueryToCSV2(クエリ名)#
だけでもいいですが、そうするとフィールドがアルファベット順に並んでしまいます。

#QueryToCSV2(クエリ名,'ダウンロードする人がわかるフィールド名','queryの実際のフィールド名')#
と、オプションをつけると、人に優しいcsvファイルになります。

簡単ですね。
去年抽選で当たったDSLiteを売って、Wiiを買ってみた。

するとWi-Fiのルーターが欲しくなり、I/0データのWN-G54/R3を購入・・・・

散財。


さて、サーバーの特定フォルダ以下をツリー表示する方法。
ColdFusionAdministratorのデーターソース設定にあるようなイメージです。

いいコンポーネントが無いかなぁ・・・と探したのですが、英語圏の検索が下手なのか、なかなか使えそうなものが見つかりませんでした。

結局、<CFDIRECTORY>(→LiveDocs) と <CFTREE>(→LiveDocs)の組み合わせでゴリゴリ書いてみたわけです。


--------------------------
<!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">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>CFTREEテスト</title>
</head>

<cfset root = "D:\ColdFusion8\wwwroot\scorpio\root\351083045"><!---表示フォルダの絶対パス--->
<cfset URLroot = "./root/351083045"><!---表示フォルダのURLルートパス--->

<cfdirectory action="list" directory="#root#" name="dir" sort="directory" recurse="yes">

<cffunction name="dirquery" returntype="query">
 <cfargument name="dirname" required="yes" hint="フルパス指定">
  <cfquery dbtype="query" name="dirtemp">
   select NAME,TYPE from dir where directory = '#dirname#' order by name,type
  </cfquery>
 <cfreturn dirtemp>
</cffunction>

<body>


<cfform>
<cftree name="dlist" width="300" height="650" vspace="5" hspace="5" format="applet">
 <cftreeitem value="#root#" display="351083045GH">
 <cfset d1 = dirquery(root)>
 <cfloop query="d1">
  <cftreeitem display="#d1.NAME#" value="#root#\#d1.NAME#" parent="#root#"
   img="#IIF((d1.TYPE is 'Dir'),DE('folder'),DE('document'))#">
  <cfif d1.TYPE is 'Dir'>
  <cfset parent1="#root#\#d1.NAME#">
  <cfset d2 = dirquery(parent1)>
  <cfloop query="d2">
   <cfset path="#parent1#\#d2.NAME#">
   <cftreeitem value="#path#" display="#d2.NAME#" parent="#parent1#"
    img="#IIF((d2.TYPE is 'Dir'),DE('folder'),DE('document'))#"
    href="#IIF((d2.TYPE is 'File'),DE('#URLroot#/#URLEncodedFormat("#replace(path,root,'')#")#'),DE(''))#"
    target="mainFrame">
   <cfif d2.TYPE is 'Dir'>
   <cfset parent2=#path#>
   <cfset d3 = dirquery(parent2)>
   <cfloop query="d3">
    <cfset path="#parent2#\#d3.NAME#">
    <cftreeitem value="#path#" display="#d3.NAME#" parent="#parent2#"
     img="#IIF((d3.TYPE is 'Dir'),DE('folder'),DE('document'))#"
     href="#IIF((d3.TYPE is 'File'),DE('#URLroot#/#URLEncodedFormat("#replace(path,root,'')#")#'),DE(''))#"
     target="mainFrame">
    <cfif d3.TYPE is 'Dir'>
    <cfset parent3=path>
    <cfset d4 = dirquery(parent3)>
    <cfloop query="d4">
     <cfset path="#parent3#\#d4.NAME#">
     <cftreeitem value="#path#" display="#d4.NAME#" parent="#parent3#"
      img="#IIF((d4.TYPE is 'Dir'),DE('folder'),DE('document'))#"
      href="#IIF((d4.TYPE is 'File'), DE('#URLroot#/#URLEncodedFormat("#path#")#'),DE(''))#"
      target="mainFrame">
     <cfif d4.TYPE is 'Dir'>
     <cfset parent4=path>
     <cfset d5 = dirquery(parent4)>
     <cfloop query="d5">
      <cfset path="#parent4#\#d5.NAME#">
      <cftreeitem value="#path#" display="#d5.NAME#" parent="#parent4#"
       img="#IIF((d5.TYPE is 'Dir'),DE('folder'),DE('document'))#"
       href="#IIF((d5.TYPE is 'File'), DE('#URLroot#/#URLEncodedFormat("#path#")#'),DE(''))#"
       target="mainFrame">
      <cfif d5.TYPE is 'Dir'>
      <cfset parent5=path>
      <cfset d6 = dirquery(parent5)>
      <cfloop query="d6">
       <cfset path="#parent5#\#d6.NAME#">
       <cftreeitem value="#path#" display="#d6.NAME#" parent="#parent5#"
        img="#IIF((d6.TYPE is 'Dir'),DE('folder'),DE('document'))#"
        href="#IIF((d6.TYPE is 'File'),DE('#URLroot#/#URLEncodedFormat("#path#")#'),DE(''))#"
        target="mainFrame">
       <cfif d6.TYPE is 'Dir'>
       <cfset parent6=path>
       <cfset d7 = dirquery(parent6)>
       <cfloop query="d7">
        <cfset path="#parent6#\#d7.NAME#">
        <cftreeitem value="#path#" display="#d7.NAME#" parent="#parent6#"
         img="#IIF((d7.TYPE is 'Dir'),DE('folder'),DE('document'))#"
         href="#IIF((d7.TYPE is 'File'),DE('#URLroot#/#URLEncodedFormat("#path#")#'),DE(''))#"
         target="mainFrame">
        <cfset d8 = dirquery(path)>
        <cfif d8.recordcount gt 0>
         <cftreeitem value="7階層以上表示できません" parent="#path#\#d7.NAME#" img="element">
        </cfif>
       </cfloop><!---d7--->
       </cfif>
      </cfloop><!---d6--->
      </cfif>
     </cfloop><!---d5--->
     </cfif>
    </cfloop><!---d4--->
    </cfif>
   </cfloop><!---d3--->
   </cfif>
  </cfloop><!---d2--->
  </cfif>
 </cfloop><!---d1 --->
</cftree>
</cfform>
</body>
</html>
--------------------------

・・・・( ̄~ ̄;)ウーン・・・

美しくないな・・・・・と思う。

回帰的に書きたかった所ですが、<cftree>から<cftreeitem>の部分を抜き出して回帰的に書こうとすると、

「CFTREEが無い!」と怒られてコンパイルできないわけです。

仕方なくネストネスト・・・・
当然階層の上限が出てしまいます。

いい方法ないかなぁ・・・・


と思っていたら、うたらぼさんが助けてくれました。
GeForce8600GTのグラボを積みました。
デュアルディスプレイが快適。
Vistaのナントカスコアも3.3→5.2とアップしてちょっと嬉しい。

さて、

ブラウザからサーバーにファイルをアップロードする方法について。

htmlだけで、どうやってやるのか知りません。実は。
<input type="file">というhtmlタグがあるわけですが、どうやってhtmlで受けるんだろう・・・・
phpやaspなんかを使わなきゃできないのかも。

coldfusionでやる方法。
A.cfmで<input type="file">を使って、B.cfmにpostします。


A.cfm
<form action="B.cfm" method="post" enctype="multipart/form-data">
  <input type="file" name="attach" />
  <input type="submit" />
</form>


B.cfm
<cffile action="upload" filefield="attach"
 destination="/home/sites/heteml/******/" nameconflict="makeunique">

A.cfmは、普通のhtmlファイルでもかまいません。
enctype="multipart/form-data"
を指定するところがポイント。

受け側のB.cfmで、<cffile>(→LiveDocs)タグを使います。
filefield= で、inputで指定したnameと合わせる必要があります。
distination は保存場所です。
フルパスで指定する必要があります。
hetemlの場合はコントロールパネルの「ドメイン・メール設定」を見るとパスが書いてあります。
nameconflict で、ファイル名がかぶった場合、上書きするのか、番号を付けてユニークにするのか、エラーを出すのかを指定します。


そうそう、ヘテムルの場合パーミッションを707に変更しないとアップロードできません
アップロードされたファイルの所有者は、zeusってなってるな。
火曜夜にやってるNHKのバラエティー(?)「サラリーマンNEO」
民放じゃなく、NHKがやってると思いながら見ると、おもしろい。
せくすぃー部長が好き。

さて、

イントラのページでエクセルやワードのファイルを配布する場面はよくありますね。
で、
ふつーに
 <a href ="./配布資料/ナントカ一覧表.xls">ナントカ一覧表</a>
などというリンクにしているページもよくあります。

このリンクをクリックすると、エクセルがブラウザ上で開いちゃいます。

こんな時はファイル名だけでなくフォルダ名までもバリバリ日本語だったりしますね。

イントラ的にはこれでまぁよし とすることが多いかもしれません。
お気楽ですから。

ただ、保存に戸惑うはずです。
イントラなら
「このエクセルどうやって保存するんだ?」
 と質問の電話がかかってきて、
「あぁ、開くときに右クリックして"対象をファイルに保存"してください」
とか、
「ブラウザのファイルメニューから"名前をつけて保存"を選んでください」
とか言えばすみますが。


また、windows+IISの組み合わせだと、ファイル名やフォルダ名に日本語を使ってもそのまま動いてくれますが、Linux + Apache なんかだとダメです。


ということで、リンクをクリックすると 
このファイルを開くか保存しますか? とダイアログが出るようにする方法について。

実例はこんな感じ。

ナントカ一覧表

ソース見ればわかりますが、このリンクは、
<a href="http://cold-fusion.heteml.jp/samples/nantoka.cfm">
となってます。

ColdFusion側(ヘテムルでやってます)のソースは、

<cfheader name="Content-Disposition" value="attachment; filename=#URLEncodedFormat('ナントカ一覧表')#.xls">
<cfcontent type="application/x-download" file="/home/sites/heteml/hoge/fuga/hoge/web/samples/nantoka.xls" deletefile="no">

<cfheader>(→LiveDocs) タグと <cfcontent>(→LiveDocs) タグのみです。

<cfheader>の value属性にユーザーが「保存」するときのファイル名を書いています。
これは、実ファイル名と異なってもかまいません。
なので、
実ファイルは英文字、ダウンロードするときは日本語ファイル名 という風に、日本人ユーザーにやさしくすることができます。
日本語ファイル名にするときは、URLEncodedFormat(→LiveDocs) しないと、文字化けします。
そのとき、拡張子はエンコードしないところがポイント


<cfcontent>のfile属性で、実態ファイルをフルパスで指定します。
windowsならドライブレター(D: とか)で始まります。Linuxなら / で始まります。
hetemlの場合、コントロールパネルのユーザー情報のところでフルパスを確認できますね。


ダウンロードするファイルが固定ならこれでOKですが、DBベースで可変になる場合もあります。
そんなときは、url引数なんかでワンクッション置いてあげる方法もあります。

ナントカ一覧表

<a href="dl.cfm?filename=%E3%83%8A%E3%83%B3%E3%83%88%E3%82%AB%E4%B8%80%E8%A6%A7%E8%A1%A8&kakuchoushi=xls&sourcefilename=nantoka.xls">

受け側のdl.cfmは、

<cfheader name="Content-Disposition" value="attachment; filename=#URLEncodedFormat(URLDecode(url.filename))#.#url.kakuchoushi#">
<cfcontent type="application/x-download" file="/home/sites/heteml/hoge/fuga/mogu/web/samples/#url.sourcefilename#" deletefile="no">

なぜだかわかりませんが、URLEncodされたファイル名を、一度Decodeして、さらにまたEncodeしないとうまくいきませんです。はい。
これで数時間ハマったよ・・・・(T_T) 

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

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

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

FlashRemotingとかもやりますが、Flexには手を出してません。
と、最初の頃書きましたが、ついにFlexに手を出しました。Flex1.5はイマイチわかりませんでしたが、Flex2は別物ですね。これで6万円でイインデスカ?
そしてFlex2とColdFusionの組み合わせなら無敵な気がしますよ。ほんとに。
最新トラックバック
カレンダー
03 2024/04 05
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
なかのひと
忍者ブログ [PR]