Smarty使用時のダウンロード処理

2008/06/25 | Smarty

ファイルのダウンロード処理をおこないたいときにテンプレートエンジンを使っている場合、どんな具合にプログラムを書けばよいか迷うことがよくある。フレームワークを使っていない場合はプログラム内にダウンロード処理を直書きしてしまうけれど、フレームワーク使用時は直書きするのはなんとなく美しくない。やっぱり通常通りの処理を通過して、テンプレート内だけで処理できればスマートだと思っている。Smartyの場合だが、今回はテンプレートファイルの最初にこんな具合におまじないを記述することでダウンロード処理を実現できた。

{php}
header(“Cache-Control: public”);
header(“Pragma: public”);
header(“Content-Type: application/csv”);
header(“Content-Disposition: inline; filename=data.dat”);
header(“Content-Transfer-Encoding: binary”);
header(“Accept-Ranges: none”);
{/php}

キャッシュ制御系はSSL使用時のIEバグ対策。Content-type、Content-Dispotion、Content-Transfer-Encodingは適宜指定。実際にダウンロードさせたい部分は、この後ろに記述すればよい。

でも、実はヘッダ的には一つ足りないんだと思う。それはダウンロードさせる容量Content-Lengthだ。この記述が必要なら、上記の記述の前に事前にダウンロードデータを以下のように記述して、容量を計算して出力すればいいかもしれない。

{capture name=download}
(ダウンロードさせたいデータを記述)
{/capture}
{header_content_length var=$smarty.capture.download}

いったん出力データを変数に格納して、別途ヘッダ出力用のカスタム関数(header_content_length)を用意しておいてそれに食わせてやればいい。カスタム関数が必要でしたら・・・各自でどうぞ(今回は作らなくても動いてくれたので作らなかった)。

スタイルシートで表示・非表示

2008/06/23 | その他

今更スタイルシートか、とも思うけれど、何せ自分がウェブの世界に入ったときにはスタイルシートなんてなかったので、出会うこと全てが勉強のような気がする。

スタイルシートを使うと、HTML中に記述された文字の表示・非表示を自由に変更できる。特にJavaScriptを組み合わせると、インタラクティブなインターフェースが提供できるので、ついつい使いたくなってしまう(んでもって、大切な開発の時間が少なくなっていく)。
今日新たに一つのことに気がついた。スタイルシートで表示・非表示を制御する属性が二つあることに気がついたのだ。それらは「visibility」と「display」。何の気なしに使っていたのだが、よくよく理解していないと希望通りの動作をしてくれないので、メモしておくことにした。

■visibility
visible(既定値:表示する)、hidden(表示しない)、inherit(継承)の値をとる。基本的にこの属性をvisibility:hiddenとして与えると「HTML上に存在するが(領域は確保されるが)内容そのものは表示されない」という解釈になる。つまり高さ100pxと指定した領域を、上記の属性で囲むと100pxの高さ分のスペースは確保されたままになる。

■display
block(ブロック要素)、inline(インライン要素)、list-item(リスト要素)、none(表示しない) の値をとる。こちらでnoneが指定された場合、ブラウザは、あたかもHTML上にそのスタイルシートで囲まれた部分が記述されていないかのようにレンダリングされる。

この違い、見た目的には結構大きいので使い分けの必要がありそうだ。

クラス内での自分の呼び方

2008/06/20 | PHPの基本

自分でプログラムを作るときは、基本的にはフレームワークでの構築になるので、classを記述して、objectを生成し、そこからメンバ関数にアクセスすることがほとんどだ。だからclassの中のメンバ関数から、他のメンバ関数を呼び出すときは以下のような記述になる。

$this->hoge()
$thisはいうまでもなくオブジェクトそのものを意味する。

ところが、稀にオブジェクトを生成せずに直接class内のメンバ関数にアクセスして使うような記述をすることもある。極力内容には心がけているのだが、簡単な関数を作成したりする場合に、同じ名前空間(クラス名)の中に類似関数(メンバ関数)をとりまとめておいたりするために、やはりclassを使用する。

このとき、同じclass内の別の関数へのアクセスの記述方法がわからなかった(というかべた書きしていた)。例えば、

class hoge
{
  fuga(){}
  piyo(){}
}

みたいなclassがあるとして、メンバ関数piyoをhoge::piyo()みたいに呼び出して使用するわけだが、piyo関数でfuga関数を呼びたいときにどうすればよいのか、それがわからなかった。今まではクラス名をそのまま使って以下のように記述していた。

hoge::fuga()

ただこれだと、命名規則等の関係でクラス名を変更してしまったら動かなくなることは自明だ。どうやって書いておくべきなんだろう、と思ってはいたけれど、必要性にも迫られなかったので(というかその都度修正したりしていたので)放置していたが、今日やっとわかった(たまたま見つけた)。正解は、

self::fuga()

でした。いわれてみれば、「parent::fuga()みたいな書き方するよな」と思うのだが、どうやらselfは完全に見過ごしていたらしい。

ちょっと恥ずかしいが勉強になった次第。

ランダム順で取得

2008/06/19 | MySQL

データをランダムに取得するには、たいていどのような仕組みにでも乱数ジェネレータ(もしくはそれらしきもの)が用意されていて、それを利用するのが便利。MySQLからランダムに値を取得する場合、以下のようにORDER BY句にRAND()関数をかませると、ランダムな順番で取得できる。

SELECT * FROM table ORDER BY RAND();

ランダムに3つ取得したいならLIMIT 0,3とかつけてあげればよい。

Smartyでフォーム(ラジオボタンとチェックボックス)

2008/06/16 | Smarty

以前は「フォーム作成 = QuickForm」なくらいQuickFormを多用したけれど、近頃はめっきりQuickFormを使用しなくなった。QuickFormにはvalidation機能もあるし、なんといってもfreeze機能が便利なのだが、QuickForm2の安定版が出ないことには、多用する勇気が出ない。
QuickFormに変わってフォーム生成はSmartyのカスタム関数と自作のライブラリを使用している。基本的にはSmartyのカスタム関数だけで十分だけど、エラーを出力したり、確認画面を出したり、Smartyだけでは事足りない部分がいくつかあるからだ。
Smartyの便利なカスタム関数でラジオボタンを生成してくれるhtml_radiosとチェックボックスを生成してくれるhtml_checkboxesの使い方をメモしておく。

■html_radios、html_checkboxes共通のオプション(★多用、☆その他)

★name
フォーム要素のname属性に相当。html_checkboxesの場合は名前の後ろに[]を自動で付加して配列形式で受け取ることができるようにしてくれる。

★options(配列で与える)
value値(配列のキー)と表示する値(配列の値)の形式で与える。

★selected
初期で選択されている値(optionsのキーを指定)。html_checkboxesの場合、配列で与えると複数の項目にチェックを入れることができる。

☆separator
それぞれの項目を区切るための文字列を指定できる。<br />を指定すれば改行で区切られる。

☆valuesとoutput
optionsの代用で値と表示をそれぞれ別の配列で指定する。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net