MAMP の MYSQL と FileMaker の連携

作業メモ。取り敢えずこの手順で出来ました。環境は Mac OSX 10.5.5。FileMaker Pro 9 Advanced。MAMP 1.7.1。現在のバージョンでは以下の通り。

まずはここから MYSQL Connector/ODBC 5.1 をダウンロード(x86)。
MySQL :: Download Connector/ODBC

Connector/ODBC をインストールしたら以下の手順で ODBC アドミニストレータ.app を設定。「Connect Options」のポートとソケットの設定も忘れずに。ソケットのパスは MAMP のスタートページに書いてあります。
http://dev.mysql.com/doc/refman/5.1/ja/myodbc-configuration-dsn-macosx.html

ただ。この環境だと ODBC アドミニストレータ.app が頻繁に落ちる。落ちる。まぁ。気にしなくても設定は出来ているので良いのだけれど。どうにかならんものなのか。

さて。いよいよ FileMaker Pro 9 を起動。ファイル > 管理 > 外部データソース から先程作った ODBC を追加する。後はデータベース管理からリレーションシップでテーブルを選択して取り込めば MAMP のデータベースと連携できます。

PHP で日付を扱うカスタム関数

そんな訳でいくつか流用。手なりで作ってしまっているのでご指摘大歓迎です。

date 型の変数を日本の日付表示に変換(曜日付)

function japaneseDate($date)
{
    if (preg_match('/^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})([0-9: ]*)$/', $date, $val) && $date != '1000-01-01' && $date != '9999-12-31') {
        $youbi = array('日', '月', '火', '水', '木', '金', '土');
        $days_show  = date('Y年m月d日', strtotime($date));
        $days_youbi = "(".$youbi[date('w', strtotime($date))].")";
        $days = $days_show.$days_youbi.$val[4];
    } else if (preg_match('/^([0-9]{4})-([0-9]{1,2})$/', $date, $val)) {
        $days = $val[1]."年".$val[2]."月";
    } else {
        $days = "";
    }
    return $days;
}

開始日と終了日から期間に変換

function periodDate($date_start = '0000-00-00', $date_end = '0000-00-00')
{
    if ($date_start == '0000-00-00' && $date_end == '0000-00-00') {
        return;
    } else {
        if ($date_start == $date_end) {
            $date = japaneseDate($date_start);
        } else if ($date_end == '9999-12-31') {
            $date = japaneseDate($date_start) . '〜';
        } else if ($date_start == '0000-00-00') {
            $date = '〜' . japaneseDate($date_end);
        } else {
             $date = japaneseDate($date_start) . '〜' . japaneseDate($date_end);    
        }
        return $date;
    }
}

開始時間と終了時間から期間に変換

function periodTime($time_start = '00:00:00', $time_end = '00:00:00')
{
    if ($time_start = '00:00:00' && $time_end = '00:00:00') {
        return;
    } else {
        if ($time_start == $time_end) {
            $time = date('H:i', strtotime($time_start));
        } else if ($time_end == '00:00:00') {
            $time = date('H:i', strtotime($time_start)) . '〜';
        } else if ($time_end == '00:00:00') {
            $time = '〜' . date('H:i', strtotime($time_end));
        } else {
            $time = date('H:i', strtotime($time_start)) . '〜' . date('H:i', strtotime($time_end));
        }
        return $time;
    }
}

MAMP に Xdebug を入れて Webgrind で確認してみる

Xdebug のログをフロントエンドで確認できる「Webgrind」の紹介記事を読んで実際にやってみる。
Xdebugのフロントエンド·Webgrind MOONGIFT

取り敢えず MAMPXdebug を入れる事から。ここにある「PHP Remote Debugging」の「Mac OS X / x86」をダウンロード(Intel Mac)。
Komodo Remote Debugging Package Downloads « ActiveState Code

PHP のバージョンごとにパッケージが違うので MAMPPHP のバージョン(現時点で 5.2)と同じフォルダにある xdebug.so を以下に入れる。

/Applications/MAMP/bin/php5/lib/php/extensions/no-debug-non-zts-20050922/xdebug.so

php.ini に以下を追記。
/Applications/MAMP/conf/php5/php.ini

[xdebug]
zend_extension = /Applications/MAMP/bin/php5/lib/php/extensions/no-debug-non-zts-20050922/xdebug.so
xdebug.remote_enable = On
xdebug.remote_handler = dbgp
xdebug.remote_mode = req
xdebug.remote_host = 127.0.0.1
xdebug.remote_port = 9000
xdebug.idekey =
xdebug.profiler_enable = On
xdebug.profiler_output_dir = "/Applications/MAMP/tmp/xdebug/"

Xdebug を有効にするには Zend Optimizer を無効にしなくてはいけないので php.ini の以下の部分をコメントアウトする(MAMP のコンパネでも on/off の設定があるけど何故か反映されない…)。

[Zend]
; zend_optimizer.optimization_level=15
; zend_extension_manager.optimizer=/Applications/MAMP/bin/php5/zend/lib/Optimizer-3.2.2
; zend_optimizer.version=3.2.2

いよいよ Webgrind を入れる。と云っても落としてログファイルのパスを設定するだけ。ここで公開されているものをダウンロード。
webgrind - Xdebug Profiling Web Frontend in PHP - Google Project Hosting

落としたファイルを MAMP の htdocs に入れて config.php を以下の様に変更しました。

static $xdebugOutputDir = '/Applications/MAMP/tmp/xdebug/';
static $storageDir = '/Applications/MAMP/tmp/webgrind/';

後は MAMP を起動して webgrind にアクセスするだけ。簡単ですね。ただファイルサイズが大きいプロファイルを読み込むと流石に動作が重いかな。

Smarty のプラグイン小ネタ集

Smartyプラグインの追加はちょっとした関数を書いて Smarty の plugins フォルダに入れるだけ。あると便利なちょっとしたプラグイン。私の場合。Smarty のデリミタを {{ と }} に変更しているので「使い方」の部分のソースは適切に変更して下さい。

modifier.mbtruncate.php

truncate をマルチバイト文字列に対応。

使い方
{{$string|mbtruncate:80}}
ソース
<?php
function smarty_modifier_mbtruncate($string, $length = 80, $etc = '...')
{
    if ($length == 0) { return '';}
    if (strlen($string) > $length) {
        $length -= strlen($etc);
        return mb_strcut($string, 0, $length).$etc;
    } else {
        return $string;
    }
}
?>

modifier.mbconvert.php

マルチバイト文字コード変換。

使い方
{{$string|mbconvert:'urf-8':'euc-jp'}}
ソース
<?php
function smarty_modifier_mbconvert($string, $charset, $source_charset = 'auto')
{
    return mb_convert_encoding($string, $charset, $source_charset);
}
?>

modifier.mbkana.php

全角半角変換。

使い方
{{$string|mbkana}}
ソース
<?php
function smarty_modifier_mbkana($string, $option = 'KV')
{
    return mb_convert_kana($string, $option);
}
?>

compiler.append.php

変数を配列に追加。assign では配列を扱えないので。

使い方
{{* prepare the array *}}
{{append var='arr' value=$var1}}
{{append var='arr' value=$var2}}
{{append var='arr' value=$var3}}

html_table と一緒にこんな感じでも使える。

{{foreach from=$list key='key' item='val' name='listLoop'}}
{{capture name='row'}}
<h4><a href="{{$val.URL}}">{{$val.name}}</a></h4>
<p>{{$val.text}}</p>
{{/capture}}
{{append var='colAry' value=$smarty.capture.row}}
{{/foreach}}
{{html_table loop=$colAry cols=2 table_attr='class="table"'}}

同一テンプレート内で何回か使用する際は変数の初期化を忘れずに。

{{php}}$this->clear_assign('calAry');{{/php}}
ソース
<?php
function smarty_compiler_append($tag_attrs, &$compiler)
{
    $_params = $compiler->_parse_attrs($tag_attrs);
    if (!isset($_params['var'])) {
        $compiler->_syntax_error("assign: missing 'var' parameter", E_USER_WARNING);
        return;
    }
    if (!isset($_params['value'])) {
        $compiler->_syntax_error("assign: missing 'value' parameter", E_USER_WARNING);
        return;
    }
    return "\$this->append({$_params['var']}, {$_params['value']});";
}
?>

modifier.urllink.php

テキスト内に URL が含まれている場合に aタグで囲む。

使い方
{{$text|escape|urllink}}
{{$text|escape|urllink:"_blank"}}
ソース
<?php
function smarty_modifier_urllink($value, $target = null)
{
    $options = '';
    if (!empty($target)) {
        $options = sprintf(" target=\"%s\"", $target);
    }
    $value = ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]", "<a href=\"\\0\"" . $options . ">\\0</a>", $value);
    return $value;
}