Contact Form 7の文面をfilterでいじる

WordPressを使ってお問合せフォームといえばContact Form 7というぐらいに定番になっているかと思いますが,単純なお問合せフォームでも色々と条件分岐したり,置換してみたりしたいことが出てきます。
条件分岐や置換の部分をPHPで書けば良いのですが,さてそのフィルタをどこに入れようかと,ソースを追いかけると,ちゃんと用意されておりました。

contact-form-7/includes/class.php 内の compose_mail 内で

$components = compact(
  'subject', 'sender', 'body', 'recipient', 'additional_headers', 'attachments' );
$components = apply_filters_ref_array( 'wpcf7_mail_components',
  array( $components, &$this ) );
extract( $components );

というのがありましたので,テーマ内のfunctions.phpにこんな感じで追加

add_filter('wpcf7_mail_components', 'my_mail_filter',10,2);
function my_mail_filter( $components, $cf7) {
  $lines=explode("\n",$components['body']);
  $newbody='';
  foreach($lines as $l){
    //行毎に分解して処理する感じのコード
    //例えば半角カナを全角に変換とか
    $newbody.=mb_convert_kana($l,'aKV')."\n";
  }
  $components['body']=$newbody;
  return $components;
}

あとは自分の関数内で書き放題ということで。

php_browscap.iniのエラーをなくす(php53,CLI)

PHP5.3.xのCLI版を起動すると/etc/php.d/php_browscap.iniにエラーがあると出る。

$ php -v
PHP: syntax error, unexpected $end, expecting ‘]’ in /etc/php.d/php_browscap.ini on line 57
PHP 5.3.3 (cli) (built: Jun 27 2012 12:25:37)

こんな具合。
php_browscap.ini自体はマニュアル通り下記サイトから持ってきて設置,/etc/php.iniのbrowscapにも場所を指定。

Downloads (Temporary) – Browser Capabilities Project

php_browscap.iniの該当行を見ると

[Mozilla/?.0 (compatible; Ask Jeeves/Teoma*)]

みたいな感じであり,文中のセミコロン移行がコメント扱いされてしまうため,[]が合わなくてエラーになるようで。

ということでここからは力業。
文中の ; を全て \; に変換。

これでエラーにならなくなった。
CLIでなくhttpdを通した場合の挙動にも変化なし?とりあえず通って判別もできた。

根本問題はPHP5.3からparse_ini_fileの挙動が変わったことにあるようで。

Issue 11 – phpbrowscap – parse_ini_file in PHP 5.3 – Browscap PHP Project – Google Project Hosting

PHP4でPEARがコケる対策

何で今更PHP4なのよ…と言われましてもね,そういう環境もあるのよ…

で,適当にPEAR upgradeしていたらある時点から

PHP Parse error: parse error, unexpected ‘(‘, expecting ‘}’ in /usr/share/pear/PEAR/Installer.php on line 811

などと言われて失敗します.
PEAR/Installer.phpなんだからこれが更新された時点でしょうなー.

該当行を見ると

$this->log(3, “file $data[0] was scheduled for removal from {$this->pkginfo->getName()} but is owned by {$new->getChannel()}/{$new->getName()}, removal has been cancelled.”);

となっています.

PHP4だとダブルクォートの中にオブジェクト->メソッドが書けないんでしたっけ(?).そのへんでひっかかってるように見えます.
個人的にもダブルクォート内に変数をそのまま書くのはあんまり好きじゃないですし,今回はエラー回避のためにもこれを書き換えちゃいます.

$this->log(3, “file “.$data[0].” was scheduled for removal from “.$this->pkginfo->getName().” but is owned by “.$new->getChannel().”/”.$new->getName().”, removal has been cancelled.”);

ダブルクォートが入り乱れて読みにくくはなりますが,これでエラーは出なくなります.

他にもあったらエンドレス修正かー?と思いましたが,とりあえず今回の環境ではこれ以上はありませんでした.

AndroidのブラウザでHTTP_REFERERが送られてこない?

webプログラムでHTTP_REFERERを取得したいという話があったんですが,Androidの標準ブラウザからREFERERが送られてこないという現象がありました.
いわゆるガラケー時代にはREFERERが送られてこない端末なんて普通だったんで,まぁAndroidでもそういうのがあるのかしら?なんて思いましたが,どうやら違うようです.

「デフォルトで使用するブラウザ」が決まっていないとHTTP_REFERERが送られてきません.
原因についてははっきりとした資料を当たってないのですが,下記のように推測.

Android端末に標準以外にFirefoxやらOperaやらのブラウザを入れると,webサイトでページを移動する度に「アプリケーションを選択」という画面が出てきます.

おそらく内部的には毎回「URLを開く」というインテントが動くので,通常のブラウザ内での移動とは異なり,毎度毎度新規にURLを開いている扱いになるのだろうなぁと思います.
「常にこの操作で使用する」をチェックしてデフォルトのブラウザを決めてあげると,ちゃんとHTTP_REFERERが送られてきます.

まぁそうでなくてもHTTP_REFERERなんて偽装できちゃうもんだしアテにできないのですけどね.

書いてて思ったけど,cookieでセッション情報を保持している場合,途中でブラウザを変えちゃったらセッションの継続ができないよなぁ.
一般的な他のwebサービスとかだとそのへんは保証外にしてるんだろうなぁ.もしくはガラケーよろしくGETパラメータで引渡か…

Smartyでescapeができなくなる

PHP+Smarty環境のこと.

通常通りSmartyで {$hoge|escape} を書いたらwarningが出るように.

PHP Warning: htmlspecialchars() expects at most 3 parameters, 4 given

おそらくエラーを表示しないようにしてる場合はescape修飾子がついたところで文字が出力されなくなるはず.

Smartyは3.1.7,PHPは…あれこのサーバ5.1じゃないの.
SmartyのほうでPHP5.2以降対応って書いてあるし,htmlspecialcharsのパラメータが4つになったのは5.2.3からみたいです.

PHP: htmlspecialchars – Manual

そんなわけでPHPの入れ替えをして解決.
まだPHP5.1.xのサーバは多いですからね…要注意.