デフォルトで
http://example.com/hoge/%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF
「こんにちは」をurldecodeしたものをと投げかけると、「The URI you submitted has disallowed characters.」とお叱りの言葉が出て日本語が使えないことが解りがっかりし…たと思ったら大間違い、タダでは起きあがらないテンコモリ夫、またまた調べてみた。
ふふーん、ほうほう、どうやら config ファイルの $config['permitted_uri_chars'] の正規表現部分が影響しているようですわよ。こんな感じで使えるみたい。
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_-';
↓
$config['permitted_uri_chars'] = '一-龠ぁ-んァ-ヴーa-zA-Z0-9a-z 0-9~%.:_-';
ただ、「DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!!(わかんねならいじくんな!)」と書かれてあるので、自己責任でお願いします。
参考記事
スポンサーサイト
テーマ:PHP - ジャンル:コンピュータ
show_error('エラー'); だと本文にしかエラーが表示されない...ページタイトルも自分で設定した文字列にしたいわ...と欲求不満に陥ったので調べてみた。
どうやら Exceptioins ライブラリを使って、直接 show_error メソッドを使えばいいみたい。
$this->load->library('exceptions');
echo $this->exceptions->show_error('ほにゃららエラー', 'エラーですYO!');
こんな感じで。
テーマ:PHP - ジャンル:コンピュータ
メールを送信する時、だいたい決まった雛型(テンプレート)があると思います。そんなメール用テンプレートに変数をはめ込む実験です。まずはメール送信用テンプレートをご用意
{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 - ジャンル:コンピュータ