デフォルト値の設定

2008/04/24 | HTML_QuickForm2

HTML_QuickForm2は、基本的には前バージョン(HTML_QuickForm)をPHP5のE_STRICTに対応させてリライトしてあるとのことであったが、メソッドで変更とかもあるようだ。まぁ「まだアルファ版だから」なのかもしれないけれど。

新バージョンで、フォーム要素にデフォルト値を設定する際、前バージョンで使っていたsetDefaultsメソッドは使えない(というか、このメソッドは新バージョンでは存在していない)。HTML_QuickForm2での記述はこうだ。

$myForm=& new HTML_QuickForm2(‘myForm’);
$myForm->addElement(‘text’,’q1′);
$myForm->addDataSource(
    new HTML_QuickForm2_DataSource_Array(
        array(
            ‘q1’=>’php’,
          )
      )
  );

q1という名前のテキストボックスを作成して、デフォルト値として「php」と表示させる例だ。以前であれば、このように記述していた。

$myForm->>setDefaults(array(‘q1’=>’php’));

お手軽でよかった。
新バージョンでの記述を見るとsetDefaultsメソッドから
addDataSourceメソッドに変更になっている。その引数はHTML_QuickForm2_DataSource_Arrayオブジェクトになり、さらにそのオブジェクトのコンストラクタに引数としてデフォルト値を渡す、という具合になっている。

別にこれはこれでいいのだが、「PHP5対応のためのリライト」という観点で提供されるのであれば、非推奨でいい(将来的になくなってもいい)のでsetDefaultsメソッドが用意されるべきだと思う。

まぁ「他人の土俵で相撲を取っている」ようなものだから理想論だけ言ってみた。

call_user_func関数とcall_user_func_array関数の違い

2008/04/23 | PHPの基本

call_user_func関数とcall_user_func_array関数の違いについて調べてみた。根本的な機能の違いを見つけることはできなかった。両者の違いは以下の点。

○call_user_func関数の引数は一つ以上(可変)
一つ目はコールバックする関数名。二つ目以降はその関数に引数として渡される。

○call_user_func_array関数の引数は二つ(固定)
一つ目はコールバックする関数名。二つ目は配列で指定し、コールバックする関数への引数として渡される。

根本的な問題ではないが、引数の渡し方だけが違うようだ。しかし、ある意味call_user_func_array関数のほうが便利に使えるかもしれないと思った。引数の数が固定だから、扱いやすいような気がする(なんとなくcall_user_funcのほうが軽そうだが、おそらく差はほとんどないだろう)。

テンプレート内での文字列の連結

2008/04/22 | Smarty

Smartyテンプレート内で、変数に格納された文字列の結合をしたい場合がある(つまり「変数を結合したい」のだが)。

単に文字列を結合するだけならcat修飾子でいい。
{$str1|cat:’_add’}とか{$str1|cat:$str2}とか

結合した文字列を他の処理で使いまわしたいということはないだろうか。たとえば上記の処理で得られる文字列をキーとした配列中の値を取得したいとか・・・。
そんなときにはassign関数が使えるのだが、たいていの場合は期待通りの動作をしてくれない。しかし記述方法ひとつで、しっかりと動作してくれる。それは「バッククォート(`)」だ。

例えば変数$str1と$str2を結合した$strを作りたいときはこんな具合に記述する。

{assign var=str value=”`$str1“$str2`”}

仮に$str1=’abc’、$str2=’def’だとしたら、$strは’abcdef’になる。
こういうの、マニュアルに書いてあればいいのに。

テンプレート内での分割処理

2008/04/21 | Smarty

テンプレートエンジンSmartyで、割り当てられた変数(配列)を分割するための関数を作ったのでメモ。

例えばリンク集(バナーで表示)を作るって表形式で表示したい場合、表の列数によってテンプレート内で「行の開始かどうか(<tr>タグを出力するかどうか)」「行の終了かどうか(</tr>タグを出力するかどうか)」といったロジックを書くことになる。テンプレート内でのロジックは減らしたいので、上記のように書くのはあまり好きではない。

PHPには便利な関数array_chunkというのがある。配列を指定した個数の配列に分割してくれるというものだ。さらに便利な関数でarray_padというのがある。指定個数に満たない配列を、指定した値で満たしてくれる関数だ。

一番簡単なのはコントローラ(もしくはメイン処理)で、上記の処理を入れることだが、表示を変更したい(例えば表の列数を増減したい)場合は、コントローラのプログラムを変更しなければならず、本来表示側だけで対応したいのに、本末転倒となるわけだ。

んで、Smartyの関数を作って、テンプレート内で分割できるようにした。関数はfunction.array_split.phpという名前で、以下の内容で、しかるべき場所に保存。

<?php
  function smarty_function_array_split($params, &$smarty)
  {
    $paramKey  =$params[‘var’];
    $paramValue  =$params[‘value’];
    if(is_null($paramValue)){
      $paramValue=array();
    }
    $paramSplit  =$params[‘split’];
    
    if($paramValue){
      $paramSplitted=array_chunk($paramValue,$paramSplit,true);
      $lastValue=array_pop($paramSplitted);
      $lastValue=array_pad($lastValue,$paramSplit,NULL);
      array_push($paramSplitted,$lastValue);
    }else{
      $paramSplitted=array();
    }
    $smarty->assign($paramKey,$paramSplitted);
  }

もうちょっとエラー処理を入れなくてはいけないけれど・・・。
もっと早くに関数作ればよかったな。

SECOMのSSLはかなりイタダケナイ

2008/04/20 | その他

PHPとは関係ないお話。
先日ウェブサーバにSSL証明書をインストールしたのだが、えらく時間がかかってしまったのでメモ。

今までは、基本的に自社でSSLを使用する際はThawte社を使っていた。いちおうベリサインの子会社だし、証明書の発行数はベリサインについで2位だし、何より安いし、販売代理店にもなったし・・・。難点なのは「南アフリカ」の会社、というところなのだが、現地に日本人スタッフがいてメールは日本語でのやり取りもできるので問題はない(Thawteの証明書がほしい人は連絡くれれば手伝う・・・かもしれない)。
今回とある仕事で、携帯からの使用を想定し、携帯でもOKなSSL証明書を使うことになった。日本で携帯SSLといえばベリサインかセコムか、といったところ(ボルチモアも大丈夫だったっけか)。んで、セコムを使うことになった。実はこれがそもそもの間違いで、証明書の費用はクライアントが負担するのだから、「ベリサインにしておけばよかった」と後悔している。

今回使用したのは「セコムパスポート for Web」。で、導入手順はこんな感じ。

(1) キー作成、CSR作成(これはどこでも同じ)
(2) 申請(セコムは証明書発行後の請求書払い、とこの点は評価できる)
(3) 電話連絡後、証明書発行
(4) インストール

このインストールでつまずいた。というのもセコムの証明書をインストールするときは「中間CA証明書」をインストールしないといけないのだ(ベリサインやThawteでは不要だった)。そして、そのインストール作業にもしっかりとお約束事があった。
で、作業はこんな感じだった(失敗も含めて書いてみる)。

(1) 証明書をダウンロードして、証明書をインストール(apache設定)
(2) apache再起動
(3) 「この証明書は信頼できる機関から発行されていません」(ふざけるな!)
(4) 原因を調べると中間CA証明書のインストールが必要(トップページに書いておいてくれ!)
(5) 中間CA証明書を取得してインストール(apache設定)
(6) 「この証明書は信頼・・・」(なめてんのか)
(7) apacheのコメントアウト欄にない設定項目が必要だった(設定するところを間違えていた)
(8) 再設定してapache再起動(SSLCACertificatePath)
(9) 「この証明書は信頼・・・」(し・・・しばく・・・)
(10) 設定したディレクトリにおくファイル名が決まっていた(赤太字でかけ!)
(11) 中間CA証明書のファイル名をfe686ec0.0に変更して再設定
(12) apache再起動
(13) やっと動いたよ(数万円が無駄にならずに済んだ・・・)

所詮「セコム」。そういえばベリサインの電話確認と比べればいい加減だった。ベリサインなら、作成する証明書のホスト名を、必ずアルファベットを順番に読んで確認したけど、セコムの場合は「○○.jp」ですね、だったし(微妙にスペルが違ってたらどうするつもりなんだろ)。

お約束事は赤太文字で書いてよ。
ま、動いてよかったよ。


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