fc2ブログ

price-change:blog

色んな情報テンコモリ

CodeIgniter | URIで日本語を使うのだ

デフォルトで


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 - ジャンル:コンピュータ

CodeIgniter | エラー表示にまつわる方法

show_error('エラー'); だと本文にしかエラーが表示されない...ページタイトルも自分で設定した文字列にしたいわ...と欲求不満に陥ったので調べてみた。

どうやら Exceptioins ライブラリを使って、直接 show_error メソッドを使えばいいみたい。


$this->load->library('exceptions');
echo $this->exceptions->show_error('ほにゃららエラー', 'エラーですYO!');

こんな感じで。

テーマ:PHP - ジャンル:コンピュータ

CodeIgniter | 変数をテンプレートにはめ込んでメールを送信する方法

メールを送信する時、だいたい決まった雛型(テンプレート)があると思います。そんなメール用テンプレートに変数をはめ込む実験です。まずはメール送信用テンプレートをご用意


{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 - ジャンル:コンピュータ

CodeIgniter | sqlite2 で scaffolding を動かすの巻

デフォルト(Version 1.5.4)では「サポートしてないよバーカバーカ」と言われてしまうので自力で何とか動かして見たいと思います。

と言うものの、どこから手を着けて良いのかわからなかったので、取りあえず関係ありそうなところを片っ端らからソースを読んでみた。で、わかりました。system/database/drivers/sqlite/sqlite_driver.php_list_columns()メソッドがノンサポートで system/database/DB_driver.phplist_fields()メソッド内で FALSE を返しているのが原因なようですYO。

通常なら _list_columns()メソッドでカラム名を返すSQLを返すようなのですが、sqliteが対応してないので FALSE を返すようです。そこで DB_driver.phplist_fields()メソッドを sqlite_driver.php 内でオーバーライドしちゃおうと奮起してみました。

*注意* コアライブラリを直接いじるので自己責任&バックアップをお願いプリーズ

とその前に、sqlite_driver.phpcount_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 - ジャンル:コンピュータ

CodeIgniter | miniBBSというか一行掲示板を作ってみた

そろそろそれっぽい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.phptoMobileEncode を追加します。


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/controllersminibbs.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 - ジャンル:コンピュータ

次のページ