CodeIgniterの学習 64 - php_qr-0.3.1を使ってQRコードを簡単に生成・表示するヘルパを作ってみる(取りあえず版)
こんにちは。最近忙しい+特に新しく書くネタがないので放置気味のブログです。
今日は
http://d.hatena.ne.jp/rsky/20070918/1190041651 さんの所の
php_qr-0.3.1(要コンパイル)を使って、PECL経由でQRコードを簡単に生成・表示するヘルパを作ってみる。(ソース公開に感謝)
まだCodeIgniter用のヘルパのコードが綺麗じゃないので、貼るのも恥ずかしいアレだけど、
このブログの存在確認の意味も込めて貼っておく。
PECLを使用しない例は、CodeIgniterのWikiにもあったと思うが、俺はあまのじゃくなので、PECLの例を書く。
コンパイル+インストール
俺のやった手順を記憶からメモしておく。(Fedora10,各種コンパイル環境導入済,GD導入済)
環境によっては、すんなりいかないかもね。レンサバな人は残念ながら無理でしょう。
安直にREADMEのまま
- php_qr-0.3.1のソースを取得して解凍
- phpize
- ./configure --enable-qr --enable-qr-gd
- make
- make test (俺の環境だとワーニングがいろいろ出るけど無視)
- make install
- cd /etc/php.d/ ; echo 'extension = qr.so' > qr.ini … qr.iniを作成
- /etc/init.d/httpd graceful
殴り書きコード
適当。何やっているかは解読してね。
とりあえずqrコードを簡単に生成出来るように、
application/helpers/MY_html_helper.php に2つラッパー関数を追加。(まだ整理してないので汚い。)
ちなみにファイルとして生成する方式。(gif,jpg,pngとかいろいろ生成出来る。)
application/helpers/MY_html_helper.php (追加分)
<?php //上略 if ( ! function_exists( 'img_qr' ) ) { // qrコード生成+qrコード用imgタグ生成ヘルパ、TODO:殴り書きレベルなので整理する function img_qr( $str_in , $local_url = '' , $file_full_path_in = '' , $magnify = 2, $file_format = 'gif', $cache_use_flg = false, $options = array() ) { if ( is_array( $str_in ) ) { // 引数が配列で来た場合 $str = isset( $str_in['str'] ) ? $str_in['str'] : ''; $local_url = isset( $str_in['local_url'] ) ? $str_in['local_url'] : ''; $file_full_path_in = isset( $str_in['file_full_path_in'] ) ? $str_in['file_full_path_in'] : ''; $magnify = isset( $str_in['magnify'] ) ? $str_in['magnify'] : 2; $file_format = isset( $str_in['file_format'] ) ? $str_in['file_format'] : 'gif'; $cache_use_flg = isset( $str_in['cache_use_flg'] ) ? $str_in['cache_use_flg'] : false; $options = ( isset( $str_in['options'] ) && is_array( $options ) ) ? $str_in['options'] : array(); }elseif ( is_string( $str_in ) ) { $str = $str_in; }else { return ''; } if ( !$str ) { return ''; } if ( !$local_url ) { return ''; } if ( !$file_full_path_in ) { return ''; } $index_page_flg = ( isset( $options['index_page_flg'] ) )?$options['index_page_flg']:false; $out_file_full_path_ret = qr_src( $str, $file_full_path_in, $magnify, $file_format, $cache_use_flg, $options ); if ( !$out_file_full_path_ret ) { return false; } $param_arr = array( 'src' => $local_url, ); $param_arr = $param_arr + $options; if ( isset( $param_arr['file_flg'] ) ) { unset( $param_arr['file_flg'] ); } if ( isset( $param_arr['encode_format'] ) ) { unset( $param_arr['encode_format'] ); } if ( isset( $param_arr['index_page_flg'] ) ) { unset( $param_arr['index_page_flg'] ); } return img( $param_arr, $index_page_flg ); } } if ( ! function_exists( 'qr_src' ) ) { // qrコードの画像ファイルをファイルパスとして生成、TODO:殴り書きレベルなので整理する function qr_src( $str = '', $save_path = '' , $magnify = 2, $file_format = 'gif', $cache_use_flg = false, $options = array() ) { if ( !extension_loaded( 'qr' ) ) { // qr.soが有効でないときは何もしない return ''; } if ( !$str ) { return ''; } $file_flg = ( isset( $options['file_flg'] ) )?$options['file_flg'] : true; $encode_format = ( isset( $options['encode_format'] ) )?$options['encode_format']:'SJIS'; //通常QRコードはSJIS一択 if ( $file_flg ) { if ( !$save_path ) { return ''; } $base_path = realpath( dirname( $save_path ) ); if ( !$base_path ) { return ''; } $save_file_name = basename( $save_path ); $save_file_full_path = $base_path . '/' . $save_file_name; if ( $cache_use_flg ) { // 無駄に負荷をかけないようにキャッシュを使用するとき if ( realpath( $save_file_full_path ) && is_file( $save_file_full_path ) ) { return $save_file_full_path; } } $data = mb_convert_encoding( $str, $encode_format, 'UTF-8' ); // いろんな対応フォーマットが有るみたいなので列挙しておくがimgタグを生成するヘルパなのでasciiとかjsonとかは無理 switch ( strtolower( $file_format ) ) { case 'ascii': $fmt = (defined("QR_FMT_ASCII")) ? QR_FMT_ASCII : 0 ; // アスキーアート break; case 'json': $fmt = (defined("QR_FMT_JSON")) ? QR_FMT_JSON : 0 ; // JSON break; case 'bmp': $fmt = (defined("QR_FMT_BMP")) ? QR_FMT_BMP : 0 ; // BMP break; case 'svg': $fmt = (defined("QR_FMT_SVG")) ? QR_FMT_SVG : 0 ; // SVG break; //case 'tiff': // $fmt = (defined("QR_FMT_TIFF")) ? QR_FMT_TIFF : 0 ; // TIFF (zlib) // break; case 'gif': $fmt = (defined("QR_FMT_GIF")) ? QR_FMT_GIF : 0 ; // GIF (GD) break; case 'jpeg': $fmt = (defined("QR_FMT_JPEG")) ? QR_FMT_JPEG : 0 ; // JPEG (GD) break; case 'jpg': $fmt = (defined("QR_FMT_JPEG")) ? QR_FMT_JPEG : 0 ; // JPEG (GD) break; case 'png': $fmt = (defined("QR_FMT_PNG")) ? QR_FMT_PNG : 0 ; // PNG (GD) break; default: $fmt = (defined("QR_FMT_BMP")) ? QR_FMT_BMP : 0 ; // BMP break; } $op = array( 'format' => $fmt , 'magnify' => $magnify, ); if ( qr_output_symbol( $save_file_full_path, $data, $op ) ) { return $save_file_full_path; } }else { return ''; } } } //下略 ?>
動作確認用コード
確認用コードを適当なビューに貼ってみる。(htmlヘルパは有効にしておく)
(本当は引数のarrayの内容はコントローラとかモデルとかで作って渡す)
(動作確認用の適当なビューファイル)
<h2>QRコードの生成テスト(php_qr-0.3.1 ,PECLを使ってみる)</h2> <div> <?php echo img_qr(array('str'=>'QRコードの生成テスト★ヌル日記に接続。俺はここにいるぞ! http://d.hatena.ne.jp/dix3',//QRコードの中身 'local_url'=>'img/indextanha_orenoyome.gif', //生成した画像ファイル自身のlocal_url (http://example.com/img/indextanha_orenoyome.gifとして作成 'file_full_path_in'=>realpath('img').'/indextanha_orenoyome.gif',//画像ファイルの保存パス(安全のため実際はフルパスで渡す。ここでは便宜上こういう渡し方なだけ。ドキュメントルート/img/以下に生成) //'magnify'=>2, //画像のサイズ 無くても動く //'file_format'=>'gif',//ファイルの形式 デフォルトGIF画像 //'cache_use_flg'=>true,//既に同名の画像ファイルが有る場合には再生成しない時true 無くても動く ) ); ?> </div>
画面
dix3はQRコードをつかいこなせるようになった!
ただPECLなので、環境が変わる(アップデートする)たびに、再度コンパイルが必要になると思うので注意。
また少しずつ、エントリーを書いていきます。頻度は下がるけど。
ネタが無いのは、既存ので満足している裏返しだけど、なんか探す。