ethnaモバイル版改良あれこれ -その2-


前の続き(半月も間が空いた。。。orz)

残りはこれだけあります。

  • セッション対応
  • auとsoftbankのキャッシュ無効
  • Ethna_Util::isDuplicatePost()の一時ファイル名にIPアドレスをつけないように修正(IPアドレスがころころ変わるので)
  • smartyプラグイン関数utnをget用とpost用に関数を分ける。同時にセッション有無でのutnタグの有り無しを追加

セッション対応

これはモバイル版を作るときに一番はまった。

これも前回書かせていただいたので割愛させていただきます。

ethnaのメーリングリストにも1年ほど前に質問をさせていただいたりしましてなんとか解決しましたが、普通はこうすれば良いはずです。

auとsoftbankのキャッシュ無効

これは重要ですね。特にauはキャッシュを無効にしないと変な動きをしますので必須ですね。

これも前回書かせていただいたので割愛させていただきます。

ドコモでもキャッシュを無効にしたい場合は同じ事をすればいいだけです。ただ使う側としてはあまりしてほしくないですが、どうしてもしなくては行けないページだけにheader関数を投げるのもいいかもしれませんね。

Ethna_Util::isDuplicatePost()の一時ファイル名にIPアドレスをつけないように修正

POSTの2重登録を防止するためにethnaに元々ある機能です。

詳しい動作はソースを見れば分かると思いますが、これを呼び出すと一時ファイルが生成されます。そのファイル名に乱数とIPアドレスを使うのですが、携帯電話はIPアドレスがころころ変わるのでこのisDuplicatePost()の機能が生かされないのです。

そこでIPアドレスを入れないようにEthna_UtilクラスのisDuplicatePost()メソッドをこんな感じにしました。

/**
*  POSTのユニークチェックを行う
*	携帯電話はIPアドレスがころころ変わるのでIPアドレスはファイル名にしない
*
*  @access public
*  @return bool    true:2回目以降のPOST false:1回目のPOST
*/
function isDuplicatePost()
{
$c =& Ethna_Controller::getInstance();
// use raw post data
if (isset($_POST['uniqid'])) {
$uniqid = $_POST['uniqid'];
} else if (isset($_GET['uniqid'])) {
$uniqid = $_GET['uniqid'];
} else {
return false;
}
// purge old files
Ethna_Util::purgeTmp("uniqid_", 60*60*1);
$filename = sprintf("%s/uniqid_%s",
$c->getDirectory('tmp'),
$uniqid);
if (file_exists($filename) == false) {
touch($filename);
return false;
}
$st = stat($filename);
if ($st[9] + 60*60*1 < time()) {
// too old
return false;
}
return true;
}

もちろんAppID_Utilクラス見たいのを作ってEthna_Utilをオーバーライドはしてください。

smartyプラグイン関数utnをget用とpost用に関数を分ける。同時にセッション有無でのutnタグの有り無しを追加

個人的にはいるのかね?って思うようなsmartyプラグインですが試しに作りました。

セッションの有無で分けているのは一度認識したらいらないだろうという勝手な考えのもとやってますのであしからず。

POST版はこんな感じ

<?php
/**
*	自動UTNリンク(POST)
*
*/
function smarty_function_utn_post($params, &$smarty)
{
$var = $smarty->get_template_vars('app_ne');
$session = $smarty->get_template_vars('session');
$carrier = $var['carrier_data']['carrier'];
$url = $params['url'];
$action_name = $params['action_name'];
if(!$session && $carrier == 'docomo')
{
$utn = "<form action='".$url."' method='post' utn='utn'>";
}
else
{
$utn = "<form action='".$url."' method='post'>";
}
$utn .= "<input type='hidden' name='act' value='".$action_name."' />";
return $utn;
}
?>

GET版はこんな感じ

<?php
/**
*	自動UTNリンク(GET)
*
*/
function smarty_function_utn_get($params, &$smarty)
{
$var = $smarty->get_template_vars('app_ne');
$session = $smarty->get_template_vars('session');
$carrier = $var['carrier_data']['carrier'];
$url = $params['url'];
$string = $params['string'];
if(!$session && $carrier == 'docomo')
{
$utn = "<a href='".$url."' utn='utn'>".$string."</a>";
}
else
{
$utn = "<a href='".$url."'>".$string."</a>";
}
return $utn;
}
?>

ちなみにソース中にある$var[‘carrier_data’][‘carrier]など受け取る変数は個人個人違うと思いますのでそのままは使えないと思います。あくまで私の環境という事ですので。

以上簡単ですが備忘録もかねてご紹介いたしました。

他にこんなのあればいいじゃね?みたいなのがあれば是非実装したいですねー。

eight-tree