メールを送信する時、だいたい決まった雛型(テンプレート)があると思います。そんなメール用テンプレートに変数をはめ込む実験です。まずはメール送信用テンプレートをご用意
{m1}
下記のURLを開いて{m2}
{url}
{time}時間以内に手続きを完了されない場合は
上記URLが無効になりますのでご注意ください。
無効になった場合はもう一度やり直しをお願いします。
{signature}
んで、それをコントローラ側でパーサーライブラリを使用してはめ込む!$this->parser->parse() メソッドの第三引数にTRUE を指定しないと結果が出力されちゃうから注意!
$this->load->library('parser');
$data = array(
'm1'=> 'ユーザー登録の申請を受け付けました。',
'm2'=> 'ユーザー登録が完了します。',
'url' => 'http://example.com/1djie784ud563eq9n12j4',
'time'=> '6',
'signature' => 'example.com'."n".'http://example.com'
);
$body = $this->parser->parse('テンプレート名', $data, TRUE);
そして結果
ユーザー登録の申請を受け付けました。
下記のURLを開いてユーザー登録が完了します。
http://example.com/1djie784ud563eq9n12j4
5時間以内に手続きを完了されない場合は
上記URLが無効になりますのでご注意ください。
無効になった場合はもう一度やり直しをお願いします。
example.com
http://example.com
スポンサーサイト
テーマ:PHP - ジャンル:コンピュータ
デフォルト(Version 1.5.4)では「サポートしてないよバーカバーカ」と言われてしまうので自力で何とか動かして見たいと思います。
と言うものの、どこから手を着けて良いのかわからなかったので、取りあえず関係ありそうなところを片っ端らからソースを読んでみた。で、わかりました。system/database/drivers/sqlite /sqlite _driver.php の _list_columns() メソッドがノンサポートで system/database/DB_driver.php の list_fields() メソッド内で FALSE を返しているのが原因なようですYO。
通常なら _list_columns() メソッドでカラム名を返すSQLを返すようなのですが、sqlite が対応してないので FALSE を返すようです。そこで DB_driver.php の list_fields() メソッドを sqlite _driver.php 内でオーバーライドしちゃおうと奮起してみました。
*注意* コアライブラリを直接いじるので自己責任&バックアップをお願いプリーズ
とその前に、sqlite _driver.php の count_all() メソッドをいじっておきましょう。いじっておかないとエラーがでてしまうのでね。でも、これいじって大丈夫なのかな?誰かおせーて。
$query = $this->query("SELECT COUNT(*) AS numrows FROM `".$this->dbprefix.$table."`");
の部分を
$query = $this->query("SELECT COUNT(*) AS numrows FROM '".$this->dbprefix.$table."'");
に変更(「`」→「'」)
んでもって、list_fields() メソッドを追加。力業で困難をこんなん風に乗り切る。
function list_fields($table = '')
{
// Is there a cached result?
if (isset($this->data_cache['field_names'][$table]))
{
return $this->data_cache['field_names'][$table];
}
if ($table == '')
{
if ($this->db_debug)
{
return $this->display_error('db_field_param_missing');
}
return FALSE;
}
$sql = "SELECT * FROM ".$this->escape($table)." LIMIT 1";
$query = $this->query($sql);
$retval = array();
if ($query->num_rows() > 0)
{
$row = $query->row_array();
$keys = array_keys($row);
foreach ($keys as $val)
{
if (!is_int($val))
$retval[] = $val;
}
}
$this->data_cache['field_names'][$table] = $retval;
return $this->data_cache['field_names'][$table];
}
で、終了と思ったら大間違い。viewでエラー出ずっぱりになるから、もひとつ修正。
system/scaffolding /Scaffolding.php 76-77行目
$this->lang = $this->CI->load->language('scaffolding ', '', TRUE);
$this->CI->load->vars($this->lang);
を
$this->CI->load->language('scaffolding ', '', TRUE);
$this->CI->load->vars($this->CI->lang->language);
に変更
これで取りあえず動くはずだ。2日間ぐらい悩んだ自分乙!
テーマ:PHP - ジャンル:コンピュータ
そろそろそれっぽいWebアプリを作ってみようと思って、一行掲示板 にチャレンジしてみた。
ちなみに、前回のエントリー CodeIgniter | PCとモバイルのview切り替え では、_output メソッドで携帯 用に文字コード を変更してたけど、面倒くさいのでフックさせる方向で行きます。
まずは application/config/hooks.php に $hook['display_override'] を追加します。これは、処理されたデータ(ページ)がブラウザに送信する時に呼び出されます。参考エントリー CodeIgniter リクエスト値を内部文字コードに変換処理
クラス名、ファイル名が変わっているので注意してください。
$hook['display_override'] = array(
'class' => 'ConvertEncoder',
'function' => 'toMobileEncode',
'filename' => 'ConvertEncoder.php',
'filepath' => 'hooks'
);
で、application/hooks/ConvertEncoder.php に toMobileEncode を追加します。
function toMobileEncode()
{
$CI =& get_instance();
$CI->load->library('user_agent');
$output = '';
if ($CI->agent->is_mobile())
{
$output = mb_convert_encoding($CI->output->get_output(), 'SJIS', $CI->config->item('charset'));
// モバイル用viewを用意してない時を考えて念のためmeta変換
$patt = "/(<meta http\-equiv=\"content\-type\" content=\"text\/html; charset=).*?\"(\s\/)*>/i";
$rep = "$1shift-jis\"$2>";
$output = preg_replace($patt, $rep, $output);
}
$CI->output->_display($output);
}
application/controllers に minibbs.php を追加。
<?php
class Minibbs extends Controller
{
private $log_file = 'Youのフォルダ名にしちゃいなYO!';
private $log_count = 10;
function index()
{
$this->load->helper(array('file', 'html', 'url', 'form'));
$this->load->library('validation');
// バリデーション設定
$rules['message'] = "trim|required|max_length[20]";
$this->validation->set_rules($rules);
$fields['message'] = 'メッセージ';
$this->validation->set_fields($fields);
$this->validation->set_error_delimiters('<div class="err">', '</div>');
// bbsデータ
$bbs_data = $this->_read();
// 検証エラーまたは初回アクセス時
if ($this->validation->run() == FALSE)
{
$bbs_data = $this->input->xss_clean(htmlspecialchars($bbs_data, ENT_QUOTES));
$bbs_data = explode("\n", $bbs_data);
$data = array();
$data['bbs'] = $bbs_data;
$this->load->view('common');
$this->load->view('minibbs', $data);
}
else
{
$date = date("H:i:s |", time());
$bbs_data = explode("\n", $bbs_data);
$bbs_data[] = $date ." ". $this->input->post('message');
if ($this->log_count < count($bbs_data))
{
array_shift($bbs_data);
}
$this->_write($bbs_data);
header('Location: '.$this->config->site_url().'minibbs.html');
}
}
function _read()
{
return trim(read_file($this->log_file));
}
function _write($str = null)
{
$str = (is_array($str)) ? implode("\n", $str) : null;
if(!write_file($this->log_file, $str))
{
show_error('データを書き込めませんでした。');
}
}
}
?>
そして、view。されど、view。面倒くさいからPC、携帯 共用で。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="<?=site_url()?>css/minibbs.css" />
<title>一行掲示板 </title>
</head>
<body>
<h1>一行掲示板 </h1>
<p>CodeIgniter で作った一行掲示板 </p>
<?php if ($this->validation->error_string):?>
<div id="err-box">
<?=$this->validation->error_string; ?>
</div>
<?php endif;?>
<div id="bbs">
<?=ol($bbs)?>
</div>
<?=form_open('minibbs')?>
<input type="text" name="message" value="<?=$this->validation->message?>" class="ipt-bg" /></dd>
<input type="submit" value="書き込み" />
<?=form_close()?>
<?=Common::menu()?>
</body>
</html>
テーマ:PHP - ジャンル:コンピュータ
同じURLでPC用のviewとモバイル用viewをユーザーエージェント で切り替えられたらいいなー、と思って今回も頑張ってみた。
ユーザーエージェント を判別するためにPEAR::Net_UserAgent_Mobile を使う手もあるけど、ここはあえてCodeIgniter の user_agent ライブラリを使ってやってみるのだ。
まずは、application/config/user_agents.php 内で $mobiles 配列にユーザーエージェント を定義しなくてはなんねだ。どう定義したらいいかよく分からなねから、ライブラリを覗いてみたら、どうやら配列のキーで判別しているようだわさ。配列のキーは小文字にしなきゃいけねだよ。んで、値にユーザーエージェント 名を書くだ。古い機種のは面倒臭いから現行のに統一しただ。au は ezweb の方がいいだべか?
'docomo' => 'DoCoMo',
'vodafone' => 'SoftBank',
'j-phone' => 'SoftBank',
'softbank' => 'SoftBank',
'kddi-' => 'au',
'up.browser' => 'au',
'willcom' => 'WILLCOM',
'ddipocket' => 'WILLCOM'
んで、コントローラを書いてみただ。_outputメソッドで携帯 用に文字コード をSJISに変換してるけど、これはフックしたほうがいいら?わからんわぁ。
<?php
class SwitchView extends Controller
{
function index()
{
$data = array();
$data['message'] = 'こんちくわ!';
$this->load->helper('url');
$this->load->library('user_agent');
if ($this->agent->is_mobile())
{
$this->load->view('switch_view/mobile', $data);
}
else
{
$this->load->view('switch_view/pc', $data);
}
}
function _output($output)
{
if ($this->agent->is_mobile())
{
$output = mb_convert_encoding($output, 'SJIS', $this->config->item('charset'));
header('Content-Type: text/html; charset=shift-jis;');
}
echo $output;
}
}
?>
んで、PC用View 。
<html>
<head>
<link rel="stylesheet" type="text/css" href="<?=site_url()?>css/contact.css" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>CodeIgniter で表示切り替え</title>
</head>
<body>
<h1>PC版</h1>
<?=$message?>
</body>
</html>
そいで、モバイル用View 。文字コード は UTF-8。Shift_JIS で書いたり、meta にshift_jis を指定したりすると文字化けする。
<html>
<head>
<title>CodeIgniter で表示切り替え</title>
</head>
<body>
<h1>モバイル版</h1>
<?=$message?>
</body>
</html>
実行結果が見たい方は、Firefox の拡張機能 User Agent Switcher なんかを使って、ユーザーエージェントで View 切り替え ページにれっつアクセス!
テーマ:PHP - ジャンル:コンピュータ
PCサイトと携帯サイトを同じURLで運営してると、フォームで送信した場合、データの文字コード の問題が出てくると思います。それなら、統一してしましょうと頑張ってみた。
やり方は2通りあると思います。一つは、Inputライブラリの CI_Inputクラスを拡張する方法。もう一つは、コアファイルをいじることなくフレームワーク の内部動作を変更する方法(フック)です。個人的には CI_Inputクラスをいじりたくないので、フックする方法で文字コード 変換処理を実現させてみたいと思います。
まずは、application/config/config.php の設定値を変更。
$config['enable_hooks'] = TRUE;
続いて、application/config/hooks.php に以下のコードを追加。$hook['post_controller_constructor'] はコントローラがインスタンス化された直後で、メソッドの呼び出しが起こる前に呼ばれます。詳しくはフック - フレームワークコアの拡張 で。
$hook['post_controller_constructor'] = array(
'class' => 'ConvertEncode',
'function' => 'execute',
'filename' => 'ConvertEncode.php',
'filepath' => 'hooks'
);
んで、フックさせるクラスをapplication/hooks 内に設置します。
<?php
class ConvertEncode
{
function execute()
{
$CI =& get_instance();
$charset = $CI->config->item('charset');
if ($CI->config->item('enable_query_strings')) $this->convert($_GET, $charset);
$this->convert($_POST, $charset);
$this->convert($_COOKIE, $charset);
}
function convert(&$data, $charset)
{
if (is_array($data))
{
foreach ($data as $key => $val)
{
if (is_array($val))
{
$this->convert($val, $charset);
}
else
{
$enc = mb_detect_encoding($val, "ASCII,JIS,UTF-8,EUC-JP,SJIS");
$data[$key] = mb_convert_encoding($val, $charset, $enc);
}
}
}
}
}
?>
これでリクエスト値は application/config/config.php で設定された文字コード に変換されるはずです。多分。処理速度が気になる場合は、CI_Input クラスを拡張した方が良いかもしれません。
【“CodeIgniter リクエスト値を内部文字コードに変換処理”の続きを読む】
テーマ:PHP - ジャンル:コンピュータ
デフォルトではマルチバイト対応してないので、自分で対応させてみた。やり方は簡単。Validation クラスを継承してマルチバイト対応に書き換える(オーバーライド)だけよん。
ただ、継承する場合は決まり事があるので注意してね。継承する自クラス名の頭に MY_ 、継承元の親クラス名の頭に CI_ を付けなきゃだめよ。あと、自クラスでコンストラクタを呼ぶ場合は、コンストラクタの中で親クラスのコンストラクタを呼び出しましょう。
<?php
class MY_Validation extends CI_Validation
{
function min_length($str, $val)
{
$CI =& get_instance();
if (preg_match("/[^0-9]/", $val))
{
return FALSE;
}
return (mb_strlen($str, $CI->config->item('charset')) < $val) ? FALSE : TRUE;
}
function max_length($str, $val)
{
$CI =& get_instance();
if (preg_match("/[^0-9]/", $val))
{
return FALSE;
}
return (mb_strlen($str, $CI->config->item('charset')) > $val) ? FALSE : TRUE;
}
}
?>
作成した継承クラス MY_Validation.php は、application/libraries フォルダ内に 放り込めば自動で読み込んでくれますわ。
テーマ:PHP - ジャンル:コンピュータ
色々試行錯誤してスマートにやる方法を見つけた。でもこれが正解かはわからないに。
まずは共通のヘッダーやらフッターやらを書いたクラス CommonView (common_view.php)を用意。
<?php
class CommonView
{
function html_open($title)
{
echo '<html><head><title>'.$title.'</title></head><body>';
}
function html_close()
{
echo '</body></html>';
}
}
?>
んで、コントローラーの中でメインのビューと共に呼び出す。
$this->load->view('common_view');
$this->load->view('index');
そして index ビューの中で、静的クラスとして呼び出す。
<?=CommonView ::html_open('テスト')?>
<h1>テスト</h1>
<p>てすてす。てすてす。</p>
<?=CommonView ::html_close()?>
こんな感じでしょうか。これで良いのかしらー。
テーマ:PHP - ジャンル:コンピュータ