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のまま

  1. php_qr-0.3.1のソースを取得して解凍
  2. phpize
  3. ./configure --enable-qr --enable-qr-gd
  4. make
  5. make test (俺の環境だとワーニングがいろいろ出るけど無視)
  6. make install
  7. cd /etc/php.d/ ; echo 'extension = qr.so' > qr.ini … qr.iniを作成
  8. /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なので、環境が変わる(アップデートする)たびに、再度コンパイルが必要になると思うので注意。




また少しずつ、エントリーを書いていきます。頻度は下がるけど。

ネタが無いのは、既存ので満足している裏返しだけど、なんか探す。