ソース全体像 : 2011/12/07-01

>Homeに戻る

ここではコンタクトフォーム機能に近い部分のソースのみを載っけています。
フレームワーク全体の設定ファイル等の細かいソースはダウンロードしてみてください。

  1. コントローラー
  2. モデル
  3. 設定ファイル
  4. 言語ファイル
  5. STEP1のビュー
  6. STEP2のビュー
  7. STEP3のビュー
  8. 404ページのビュー
  9. NGページのビュー
  10. 外枠テンプレートビュー
  11. ソースコード展開画面(このファイル)のビュー
  12. debugクラス拡張
  13. formクラス拡張
  14. validationクラス拡張
  15. cssファイル
  16. dump.sql
  17. (appの)bootstrap.php ,Autoloader::add_classes + 俺俺汎用function(暫定)を呼び出す改
  18. vendor/common/appcommon.php ,汎用ヘルパー的なファンクションのソース置き場に困ったので暫定的に設置

1) コントローラー : modules/contact/classes/controller/contact.php

<?php
/**
 * Contact Form Example (in Japanese)
 * お問い合わせフォームを作ってFuelPHPを使いこなす練習中
 * (コメントはブログ記事用に冗長にしています。)
 *
 * @package
 * @version 0.01
 * @author mataga
 * @license MIT License
 * @copyright 2011 mataga
 * @link http://twitter.com/mataga
 */
 
namespace Contact;
// see http://docs.fuelphp.com/general/models.html
// (このコントローラのモデルをContact::で呼び出す為に指定、
// とりあえずFuelのマニュアルの流儀に沿ってやってみる)
//use \Model\Contact;
use Contact\Model\Contact;
 
class Controller_Contact extends \Controller_Template
{
	/**
	 * 各コントローラー呼び出し前の共通処理は before
	 *
	 * @access public
	 * @return void
	 */
	public function before()
	{
		parent::before();
		// app/config/contact.php を contactとして読み込みConfig::get('contact.配列キー') で値取得が可能になる
		// see: http://docs.fuelphp.com/general/controllers/base.html
		// 今回はミニミニシステムなのでapp/config/config.php内のautoloadで常にロードするように設定してもいいんだが、コントローラー内に閉じ込めておく。
		\Config::load('contact', true);
		// 日本語部分はhttp://docs.fuelphp.com/classes/lang.html を使ってマルチランゲージ対応してみた。
		\Lang::load('contact'); //Langファイルのロード
 
		# var_dump(Uri::string());exit;//UriクラスでUri周りの情報は取れる http://docs.fuelphp.com/classes/uri.html
		if ($this->_count_params())
		{// URLに不必要なパラメータ付けて来たらわざとリダイレクトする
			\Response::redirect('contact/step1');
		}
	}
	/**
	 * STEP0:indexはstep1にリダイレクト
	 *
	 * @access public
	 * @return void
	 */
	public function action_index()
	{
		// http://example.com/contact 呼び出し時はhttp://example.com/contact/step1へリダイレクト
		// 今回はThickBoxのモーダル呼び出しで使うので直接呼び出されることはあまりない。
		// preview: http://twitpic.com/7nfkv3
		\Response::redirect('contact/step1');
	}
 
	/**
	 * STEP1:フォーム入力画面
	 *
	 * @access public
	 * @return void
	 */
	public function action_step1()
	{
		$v_data=null;
		// バリデーションルールのセット(ここではモデル内(app/classes/model/contact.php)にルールを記述している)
		$val = Contact::validate('contact');
		if (\Input::post())
		{
			if(0)
			{//尚ここでトークンチェックをすると STEP2からブラウザのBackボタンで戻って再入力した時も弾かれる。
				//action_step2のみでトークンチェックするに留め、ここでのチェックは緩めにするのも一考
				$this->_check_token(); // CSRFトークンチェック、不正POSTを弾く。
			}
 
			if (\Input::post('submitstep1'))
			{// フォームデータにPOSTがあった場合の処理(「確認画面へ進む」ボタン押下時)
				// バリデーション実行
				if ($val->run())
				{// バリデーション実行OKならセッションにバリデーション済みのPOSTデータ格納して確認画面STEP2にリダイレクト
					\Session::set_flash('now_step', 'step2'); //即消しセッションに現在のステップをセット
					\Session::set_flash('v_data', \Validation::instance('contact'));//pointA:後述
					\Response::redirect('contact/step2');
				}
			}
		}else{
			// フォームデータにPOST無しの場合
			if ('backtostep1' === \Session::get_flash('now_step'))
			{
				//STEP2「入力画面に戻る」ボタン押下経由でリダイレクトされて来た時の処理
				//pointCで保持し続けたデータをここで展開
				$v_data = \Session::get_flash('v_data');
			}
		}
		$this->template->title = 'Contact &raquo; Step1';//titleのセット(template.phpで展開される)
		//外枠ビューtemplate.phpの$contentに内側ビューcontact/step1.phpと内側ビューで展開する変数$valをセット
		//バリデーション済データをview側で$valで呼べるようにセットする
		//ここでは自動Htmlエンコードは行わない(第三引数false)see http://docs.fuelphp.com/classes/view.html
		$this->template->content = \View::forge('step1')
					-> set('val', is_null($v_data)? \Validation::instance('contact'):$v_data, false);
	}
 
	/**
	 * STEP2:フォーム送信内容確認画面
	 *
	 * @access public
	 * @return void
	 */
	public function action_step2()
	{
		if (\Input::post())
		{
			$this->_check_token();
			if (\Input::post('backtostep1'))
			{// 「入力画面に戻る」ボタン押下時
				\Session::set_flash('now_step', 'backtostep1'); //即消しセッションに現在のステップをセット
				\Session::keep_flash('v_data');//pointC:リダイレクトしても(pointB)で再度セットしたvalid_contact_dataをそのまま保持しておく。
				\Response::redirect('contact/step1');
			}
			elseif(\Input::post('submitstep2'))
			{	// 「この内容で送信する」ボタン押下時
				$v_data = \Session::get_flash('v_data');
				if(is_null($v_data)){//nullならSTEP1に戻す。(check_step通過済なので必ず(pointA)からデータが渡ってきてるはずだが一応)
					\Response::redirect('contact/step1');
				}
				$contact = new Contact(array(
					'title' => \Config::get('contact.formname.ptn1'),//フォームの種類を格納(ソースを拡張して複数フォーム対応する予定のためとりあえず
					'body' => \Format::forge($v_data->validated())->to_serialized(),//POSTされてきたバリデーション済データはほぼ再利用しないのでserialize化して保存しとく適当仕様
				));
				// 問い合わせデータを保存する、管理画面は作らないけど保存だけ
				if ($contact->save())
				{
					\Session::set_flash('now_step', 'step3');
					\Response::redirect('contact/step3');
				}
				else
				{
					\Session::set_flash('now_step', 'stepng');
					\Response::redirect('contact/stepng');
				}
			}else{
				\Response::redirect('contact/step1');//想定外のPOSTはstep1に差し戻す
			}
		}else{
			$this->_check_step('step2'); //URL直呼び防止。STEP1の画面からSTEP2の画面にリダイレクトされてきた場合「以外」はSTEP1に戻す。
			//POST無しでSTEP1からリダイレクトされてきた時セッションにセットしたv_dataを画面表示用に取り出す
			$v_data = \Session::get_flash('v_data');
			if(is_null($v_data))
			{
					\Response::redirect('contact/step1');
			}
			\Session::set_flash('v_data',$v_data);//pointB:次の画面に渡す用に再度set_flashしておく
			$this->template->title = 'Contact &raquo; Step2';
			$this->template->content = \View::forge('step2')->set('val', $v_data, false);
		}
	}
 
	/**
	 * STEP3:フォーム送信完了画面
	 *
	 * @access public
	 * @return void
	 */
	public function action_step3()
	{
		$this->_check_step('step3');
		\Session::destroy();
		/**
		 *  ○  >>セッション乙 おまいにはもう用は無い。明示的にセッションのゴミは消しとく
		 *  く|)へ
		 *   〉   ヽ○ノ
		 *  ̄ ̄7  ヘ/
		 *   /   ノ
		 *   |
		 *  /
		 *  |
		 * /
		 */
		$this->template->title = 'Contact &raquo; Step3';
		$this->template->content = \View::forge('step3');
	}
	/**
	 * STEPNG:NGリダイレクト画面
	 *
	 * @access public
	 * @return void
	 */
	public function action_stepng()
	{
		$this->_check_step('stepng'); //URL直呼び防止
		\Session::destroy(); //NG画面でも明示的にセッションのゴミは消しとく
		$this->template->title = 'Contact &raquo; StepNG';
		$this->template->content = \View::forge('stepng');
	}
 
	/**
	 * STEPNG:そんなページネーヨ画面
	 *
	 * @access public
	 * @return void
	 */
	public function action_step404()
	{
 
		$this->template->title = 'Contact &raquo; StepNG';
		$this->template->content = \View::forge('step404');
 
	}
	/**
	 * SRCWINDOW:ソース全体像
	 *
	 * @access public
	 * @return void
	 */
	public function action_srcwindow()
	{
 
		$this->template->title = 'Contact &raquo;';
		$this->template->content_cssid = 'container_l';
		$this->template->content = \View::forge('srcwindow');
	}
 
  /**
   * SRCDBG:Debugクラスの拡張実験
   *
   * @access public
   * @return void
   */
  public function action_srcdbg()
  {
 
    $this->template->title = 'Contact &raquo;';
    $this->template->content_cssid = 'container_l';
 
    $hoge = array(
        array(
            "name" => "Jack",
            "age" => 21,
            "hobby"=>array("anime","game","golf"),
 
        ),
        array(
            "name" => "Jill",
            "age" => 23,
            "hobby"=>array("pc","manga","tennis"),
        )
    );
 
    $this->template->content = \View::forge('srcdbg')->set('hoge',$hoge,false);
  }
 
	/**
	 * CSRFトークンチェック不正POSTを弾く see http://docs.fuelphp.com/classes/security.html
	 *
	 * @access private
	 * @return void
	 */
	private function _check_token()
	{
		if (! \Security::check_token())
		{
			// CSRF attack or expired CSRF token
			\Session::set_flash('now_step', 'stepng'); //即消しセッションに現在のステップをセット
			\Response::redirect('contact/stepng'); //トークンNGの場合はNGページに行ってしまえ
		}
	}
 
	/**
	 * ステップすっ飛ばし防止対策 この辺の共通処理はコントローラのベースを作ってそっちに突っ込んで継承する方がいいか。
	 *
	 * @access private
	 * @return void
	 */
	private function _check_step($step_name)
	{
		if ($step_name !== \Session::get_flash('now_step'))
		{
			// $step_nameがセットされていない場合はstep1に強制リダイレクト
			// セッションのget_flashについては see http://docs.fuelphp.com/classes/session/usage.html
			\Response::redirect('contact/step1');
		}
	}
	/**
	 * URLに不必要なパラメータ付けて来たらわざとリダイレクトする。 OK:/contact/step1 NG:/contact/step1/aa/bb/cc、但し/contact/step1?hoge=fugaはOK
	 * 後で調べる、URIで渡ってきたパラメータの数を取得する最も正しい方法ってFuelでは何を使えば良いのか?
	 *
	 * @access private
	 * @return number
	 */
	private function _count_params()
	{
		return count($this->request->method_params);
	}
 
}
 
/* End of file contact.php */
 

2) モデル : modules/contact/classes/model/contact.php

<?php
/**
 * Contact Form Example (in Japanese)
 * お問い合わせフォームを作ってFuelPHPを使いこなす練習中 -モデルファイル
 * (コメントはブログ記事用に冗長にしています。)
 *
 * @package
 * @version 0.01
 * @author mataga
 * @license MIT License
 * @copyright 2011 mataga
 * @link http://twitter.com/mataga
 */
namespace Contact\Model;
//namespace Model;//see http://docs.fuelphp.com/general/models.html
 
class Contact extends \Orm\Model {//see http://docs.fuelphp.com/packages/orm/intro.html
	protected static $_observers = array(
		'Orm\Observer_CreatedAt' => array('before_insert'),
		'Orm\Observer_UpdatedAt' => array('before_save'),
	);
 
	//see http://docs.fuelphp.com/packages/orm/creating_models.html#/propperties
	//型・長さ・バリデーション・フォームに表示するしないなど細かく設定できるが列名列挙だけでもまあ動く
	//(バリデーション済データを渡すのでとりあえずいいか…後で検証)
	protected static $_properties = array(
		'id',
		'title',
		'body',
		'created_at',
		'updated_at',
	);
	/**
	 *
	 * バリデーションルールのセット
	 *
	 * @access public
	 * @return object
	 */
	//see http://docs.fuelphp.com/classes/validation/validation.html
	public static function validate($fieldset)
	{
		$val = \Validation::forge($fieldset);
		$val->add('name1', __('label.name1'))
				->add_rule('required')
				->add_rule('max_length', 60)
				->add_rule('valid_string', array('utf8'));
		$val->add('zipcode', __('label.zipcodename'))
				->add_rule('max_length', 8)
				->add_rule('valid_string', array('utf8','numeric','dashes'));
		$val->add('address', __('label.address'))
				->add_rule('required')
				->add_rule('max_length', 256)
				->add_rule('valid_string', array('utf8'));
		$val->add('tel', __('label.tel'))
				->add_rule('required')
				->add_rule('max_length', 32)
				->add_rule('valid_string', array('utf8','numeric','dashes'));
		$val->add('email', __('label.email'))
				->add_rule('required')
				->add_rule('max_length', 256)
				->add_rule('valid_email');
		$val->add('body', __('label.body'))
				->add_rule('required')
				->add_rule('max_length', 8192);
				//->add_rule('valid_string', array('all',''));
		return $val;
	}
}
 

3) このモジュール用設定ファイル : modules/contact/config/contact.php

<?php
/**
 * Contact Form Example (in Japanese)
 * お問い合わせフォームを作ってFuelPHPを使いこなす練習中
 * (コメントはブログ記事用に冗長にしています。)
 *
 * @package
 * @version		0.01
 * @author		mataga
 * @license		MIT License
 * @copyright	2011 mataga
 * @link		http://twitter.com/mataga
 */
 
// php oil g config contact hoge:fuga で自動生成した。
// see: http://docs.fuelphp.com/packages/oil/generate.html
 
// fuel/packages/oil/classes/generate.php あたりに自動生成のキモがあるようだ。
return array (
	'formname'=>array(//フォームの種類
		'ptn1'=>'contact_form',
		'ptn2'=>'enquete_form',
		),
	'cfe_version'=>'2011/12/07-01',//ソースコード記載用バージョン
);
 
/* End of file contact.php */
 

4) 言語ファイル : modules/contact/lang/ja/contact.php

<?php
/**
 * Contact Form Example (in Japanese)
 *
 * @package
 * @version		0.01
 * @author		mataga
 * @license		MIT License
 * @copyright	2011 mataga
 * @link		http://twitter.com/mataga
 */
 
//お問い合わせフォーム Langファイル
// see: http://docs.fuelphp.com/classes/lang.html
// preview: http://twitpic.com/7nihhl
return array(
		'label' => array( // Form Labels
			'name1' => 'お名前・企業名',
			'zipcode' => '〒',
			'zipcodename' => '郵便番号',
			'address' => '住所',
			'tel' => '電話番号',
			'email' => 'メールアドレス',
			'body' => 'お問い合わせ内容',
			'req' => '(※)',
			'req_num' => '(半角数字)',
			'req_alnum' => '(半角英数)',
			),
	'info_msg' => array( // Notice-Messages
			'head' => 'お問合せの前に下記の内容をご確認ください。',
			'errhead' => '記入内容に不備があります。内容修正後、確認画面へ進むボタンを押してください。',
			'msg_arr' => array( // Notice-Messages array , STEP1 and STEP2 Messages
				'<font color="red">このデモではメールは送信していません。<del>代わりに最後に管理者宛メールのダンプを表示します。</del></font>',
				'<font color="red">DBにはデータを記録しています。email欄には適当にhoge@example.comでも入れといてください。</font>',
				'上記の通りメール送信していないのでこのフォームでの問い合わせ内容に返事することはありません。',
				'何か質問があるなら' . Html :: anchor( 'http://twitter.com/mataga', 'こちらまで', array( 'target' => '_blank' ) ).'。面倒なのは嫌ずら',
				),
			'submit_attention' => '上記の内容で送信します。<br>よろしければ送信ボタンを押してください。', //STEP2 Message
			'submit_ok' => 'お問い合わせを承りました', //STEP3 Messages
			'submit_ok_attention' => 'メールおよびお問い合わせフォームからのお問い合わせは、<br>お返事が翌営業日以降となる場合もございます。<br>あらかじめご了承ください。',
			'submit_ng' => 'エラー', //STEPNG Messages
			'submit_ng_attention' => '処理中にエラーが発生しました。(フォーム送信有効期限切れ)<br>一度送信済の場合はお手数ですが<br>' . Html::anchor('contact/step1', 'こちらのページから再度入力しなおしてください。'), //STEPNG Link
			'submit_404' => 'ページが見つかりません', //STEP404 Messages
			'submit_404_attention' => 'ページが見つかりません<br>' . Html::anchor('contact/step1', 'こちらのページからやり直してください。'), //STEP404 Link
		),
	'img_contact' => array( //Header IMG
		'alt' => 'お問い合わせフォーム',
		'filename' => 'jp_contact.gif',
		),
	'btn' => array( //Submit Button
		'reset' => 'リセット',
		'submitstep1' => '確認画面へ進む',
		'backtostep1' => '入力画面へ戻る',
		'submitstep2' => 'この内容で送信する',
		),
	);
 

5) ビューファイル(step1) : modules/contact/views/step1.php

<?php
/**
 * Contact Form Example (in Japanese)
 *
 * @package
 * @version		0.01
 * @author		mataga
 * @license		MIT License
 * @copyright	2011 mataga
 * @link		http://twitter.com/mataga
 */
 
//お問い合わせフォーム STEP1:フォーム入力画面 Asset::  Html:: Form:: の練習
//(コメントはブログ記事用に冗長にしています。)
 
// (決め事)
// 今回はテンプレートエンジンは利用しない
// 慣れるために無駄にHTML::とか Asset:: とか Form::を使っています。別に普通にタグを書いても良いんだけど。
// see: http://docs.fuelphp.com/classes/html.html
// preview: http://twitpic.com/7ja9pq
 
// Form::input()系を使う場合、
//内部でprep_value()(htmlspecialchars)が自動で呼ばれるので、e()でエンティティ化するとエスケープしてるつもりが二重エスケープみたいになってしまうので注意)
//(dont_prepのパラメータを引数で渡したり、config/form.phpで prep_valueをfalseに設定した場合はこの限りではない)
 
?>
<!-- Header IMG -->
<?php echo Asset::img(__('img_contact.filename'),array('alt'=>__('img_contact.alt'),'id'=>'img_contact')); ?>
<p style="clear:both;" />
 
<!-- Notice-Messages -->
<div id="infoarea">
    <b><?php echo __('info_msg.head'); ?></b>
    <?php echo Html::ul(__('info_msg.msg_arr')); ?>
</div>
<div id="formarea">
  <?php echo Form::open('contact/step1'); ?>
    <?php
      //CSRFのトークンをセット see http://docs.fuelphp.com/classes/security.html
      echo \Form::hidden(\Config::get('security.csrf_token_key'), \Security::fetch_token());
    ?>
    <table class="c_tbl" cellspacing="1" border="0" >
    <tbody>
      <tr>
        <td class="c_tdl">
          <!-- name -->
          <?php echo __('label.name1'); ?>
          <span class="red"><?php echo __('label.req'); ?></span>
        </td>
        <td class="c_tdr">
        <?php echo Form::input('name1', $val->input('name1'), array('size' => '45','class'=>$val->css('name1'))); ?><?php echo $val->err('name1');?>
        </td>
      </tr>
      <tr>
        <td class="c_tdl">
          <!-- address -->
          <?php echo __('label.address'); ?>
          <span class="red"><?php echo __('label.req'); ?></span>
        </td>
        <td class="c_tdr">
          <?php echo __('label.zipcode'); ?>
          <?php echo Form::input('zipcode', $val->input('zipcode'), array('size' => '9','style'=>'max-width:80px;','class'=>$val->css('zipcode'))); ?> <?php echo Form::input('address', $val->input('address'), array('size' => '30','class'=>$val->css('address'))); ?><?php echo $val->err('zipcode');?><?php echo $val->err('address');?>
        </td>
      </tr>
      <tr>
        <td class="c_tdl">
          <!-- tel -->
          <?php echo __('label.tel'); ?>
          <span class="red"><?php echo __('label.req'); ?></span>
        </td>
        <td class="c_tdr">
          <?php echo Form::input('tel', $val->input('tel'), array('size' => '30','class'=>$val->css('tel'))); ?>
          <?php echo __('label.req_num'); ?><?php echo $val->err('tel');?>
        </td>
      </tr>
      <tr>
        <td class="c_tdl">
          <!-- email -->
          <?php echo __('label.email'); ?>
          <span class="red"><?php echo __('label.req'); ?></span>
        </td>
        <td class="c_tdr">
          <?php echo Form::input('email', $val->input('email'), array('size' => '30','class'=>$val->css('email'))); ?>
          <?php echo __('label.req_alnum'); ?><?php echo $val->err('email');?>
        </td>
      </tr>
      <tr>
        <!-- body -->
        <td class="c_tdl">
            <?php echo __('label.body'); ?>
            <span class="red"><?php echo __('label.req'); ?></span>
        </td>
        <td class="c_tdr">
          <?php echo Form::textarea('body', $val->input('body'), array('rows' => 8, 'cols' => 45,'class'=>$val->css('body'))); ?><?php echo $val->err('body');?>
        </td>
      </tr>
    </tbody>
    </table>
    <!-- Submit Button -->
    <p align="center">
      <?php echo Form::reset('reset', __('btn.reset'), array('class'=>'c_btn')); ?>
      <?php echo Form::submit('submitstep1', __('btn.submitstep1'), array('class'=>'c_btn')); ?>
    </p>
  <?php echo Form::close(); ?>
 
 
 
<?php
//Debugクラスの拡張実験 GeSHi
//echo '<div class=\'debugarea\'><h2>debug</h2>';
//echo Debug::vdbg($val->validated());
//echo Debug::vhighlight('modules/contact/classes/controller/contact.php','app');
//Debugクラスの拡張実験 dBug
//echo Debug::openheart('ジブンヲ','トキハナツ!');
/*
// Debugクラスを使ってみる http://docs.fuelphp.com/classes/debug.html
echo Debug::inspect(__('img_contact'));
echo Debug::phpini();
echo Debug::headers();
echo Debug::extensions();
echo Debug::constants();
echo Debug::functions();
echo Debug::includes();
echo Debug::interfaces();
echo Debug::classes();
echo Debug::backtrace();
echo Debug::dump($this, 'junk', array('whatever'));
*/
//echo '</div>';
?>
 
</div>
 

6) ビューファイル(step2) : modules/contact/views/step2.php

<?php
/**
 * Contact Form Example (in Japanese)
 *
 * @package
 * @version		0.01
 * @author		mataga
 * @license		MIT License
 * @copyright	2011 mataga
 * @link		http://twitter.com/mataga
 */
 
//お問い合わせフォーム STEP2:フォーム入力内容確認画面 Asset::  Html:: Form:: の練習
//(コメントはブログ記事用に冗長にしています。)
 
// (決め事)
// 今回はテンプレートエンジンは利用しない
// 慣れるために無駄にHTML::とか Asset:: とか Form::を使っています。別に普通にタグを書いても良いんだけど。
// see: http://docs.fuelphp.com/classes/html.html
// preview: http://twitpic.com/7jaa2x
 
?>
<!-- Header IMG -->
<?php echo Asset::img(__('img_contact.filename'),array('alt'=>__('img_contact.alt'),'id'=>'img_contact')); ?>
<p style="clear:both;" />
 
<!-- Notice-Messages -->
<div id="infoarea">
  <b><?php echo __('info_msg.head'); ?></b>
  <?php echo Html::ul(__('info_msg.msg_arr')); ?>
</div>
<div id="formarea">
  <?php echo Form::open('contact/step2'); ?>
    <?php echo \Form::hidden(\Config::get('security.csrf_token_key'), \Security::fetch_token());?>
    <table class="c_tbl" cellspacing="1"  border="0" >
    <tbody>
      <tr>
        <td class="c_tdl">
          <!-- name -->
          <?php echo __('label.name1'); ?>
        </td>
        <td class="c_tdr"class="c_tdr">
          <?php echo e($val->input('name1')); ?>
        </td>
      </tr>
      <tr>
        <td class="c_tdl">
          <!-- address -->
          <?php echo __('label.address'); ?>
        </td>
        <td class="c_tdr">
          <?php echo __('label.zipcode'); ?><?php echo e($val->input('zipcode')); ?><br><?php echo e($val->input('address')); ?>
        </td>
      </tr>
      <tr>
        <td class="c_tdl">
          <!-- tel -->
          <?php echo __('label.tel'); ?>
        </td>
        <td class="c_tdr">
          <?php echo e($val->input('tel')); ?>
        </td>
      </tr>
      <tr>
        <td class="c_tdl">
          <!-- email -->
          <?php echo __('label.email'); ?>
        </td>
        <td class="c_tdr">
          <?php echo e($val->input('email')); ?>
        </td>
      </tr>
      <tr>
        <td class="c_tdl">
          <!-- body -->
          <?php echo __('label.body'); ?>
        </td>
        <td class="c_tdr">
          <?php echo e($val->input('body')); ?>
        </td>
      </tr>
    </tbody>
    </table>
    <div class="c_send1" align="center">
      <span class="attention"><?php echo __('info_msg.submit_attention'); ?></span>
    </div>
    <!-- Submit Button -->
    <div class="c_send2">
      <?php echo Form::submit('backtostep1', __('btn.backtostep1'), array('class'=>'c_btn')); ?>
      <?php echo Form::submit('submitstep2', __('btn.submitstep2'), array('class'=>'c_btn')); ?>
    </div>
  <?php echo Form::close(); ?>
</div>

7) ビューファイル(step3) : modules/contact/views/step3.php

<?php
/**
 * Contact Form Example (in Japanese)
 *
 * @package
 * @version		0.01
 * @author		mataga
 * @license		MIT License
 * @copyright	2011 mataga
 * @link		http://twitter.com/mataga
 */
 
//お問い合わせフォーム STEP3:フォーム送信完了画面 Asset::  Html:: Form:: の練習
//(コメントはブログ記事用に冗長にしています。)
 
// (決め事)
// 今回はテンプレートエンジンは利用しない
// 慣れるために無駄にHTML::とか Asset:: とか Form::を使っています。別に普通にタグを書いても良いんだけど。
// see: http://docs.fuelphp.com/classes/html.html
// preview: http://twitpic.com/7jaauf
 
?>
<!-- Header IMG -->
<?php echo Asset::img(__('img_contact.filename'),array('alt'=>__('img_contact.alt'),'id'=>'img_contact')); ?>
<p style="clear:both;" />
<div class="c_send3" align="center">
  <p class="c_m1"><?php echo __('info_msg.submit_ok'); ?></p>
  <p><?php echo __('info_msg.submit_ok_attention'); ?></p>
</div>

8) ビューファイル(step404) : modules/contact/views/step404.php

<?php
/**
 * Contact Form Example (in Japanese)
 *
 * @package
 * @version		0.01
 * @author		mataga
 * @license		MIT License
 * @copyright	2011 mataga
 * @link		http://twitter.com/mataga
 */
 
//お問い合わせフォーム STEP404:そんなページネーヨ画面
//(コメントはブログ記事用に冗長にしています。)
 
// (決め事)
// 今回はテンプレートエンジンは利用しない
// 慣れるために無駄にHTML::とか Asset:: とか Form::を使っています。別に普通にタグを書いても良いんだけど。
// see: http://docs.fuelphp.com/classes/html.html
// preview: http://twitpic.com/7jaauf
 
?>
<!-- Header IMG -->
<?php echo Asset::img(__('img_contact.filename'),array('alt'=>__('img_contact.alt'),'id'=>'img_contact')); ?>
<p style="clear:both;" />
<div class="c_send3" align="center">
  <p class="c_m1"><?php echo __('info_msg.submit_404'); ?></p>
  <p><?php echo __('info_msg.submit_404_attention'); ?></p>
</div>
 

9) ビューファイル(stepng) : modules/contact/views/stepng.php

<?php
/**
 * Contact Form Example (in Japanese)
 *
 * @package
 * @version		0.01
 * @author		mataga
 * @license		MIT License
 * @copyright	2011 mataga
 * @link		http://twitter.com/mataga
 */
 
//お問い合わせフォーム STEPNG:NGリダイレクト画面 Asset::  Html:: Form:: の練習
//(コメントはブログ記事用に冗長にしています。)
 
// (決め事)
// 今回はテンプレートエンジンは利用しない
// 日本語部分はhttp://docs.fuelphp.com/classes/lang.html を使ってマルチランゲージ対応するのが理想だが、今回は省略
// 慣れるために無駄にHTML::とか Asset:: とか Form::を使っています。別に普通にタグを書いても良いんだけど。
// see: http://docs.fuelphp.com/classes/html.html
// preview: http://twitpic.com/7jaauf
 
?>
<!-- Header IMG -->
<?php echo Asset::img(__('img_contact.filename'),array('alt'=>__('img_contact.alt'),'id'=>'img_contact')); ?>
<p style="clear:both;" />
<div class="c_send3" align="center">
  <p class="c_m1"><?php echo __('info_msg.submit_ng'); ?></p>
  <p><?php echo __('info_msg.submit_ng_attention'); ?></p>
</div>
 

10) ビューファイル(外枠template) : views/template.php

<?php
/**
 * Contact Form Example (in Japanese)
 *
 * @package
 * @version		0.01
 * @author		mataga
 * @license		MIT License
 * @copyright	2011 mataga
 * @link		http://twitter.com/mataga
 */
 
// 共通テンプレート(テンプレートの外枠部分)
//(コメントはブログ記事用に冗長にしています。)
 
// (決め事)
// 今回はテンプレートエンジンは利用しない
// 慣れるために無駄にHTML::とか Asset:: とか Form::を使っています。別に普通にタグを書いても良いんだけど。
// see: http://docs.fuelphp.com/classes/html.html
// see: core/classes/html.php
 
?>
<?php echo Html::doctype('xhtml1-trans'); ?>
 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<?php
// Html::meta()はarrayでも渡せる。第三引数で http-equiv を設定
$meta = array(
  array('name' => 'Content-Type', 'content' => 'text/html; charset=UTF-8', 'http-equiv'),
  array('name' => 'Content-Style-Type', 'content' => 'text/css', 'http-equiv'),
  array('name' => 'Content-Script-Type', 'content' => 'text/javascript', 'http-equiv'),
);
echo Html::meta($meta);
?>
 
<?php echo Html::meta('robots', 'no-cache');?>
 
<?php
//see: http://docs.fuelphp.com/classes/asset.html
//preview: http://twitpic.com/7jp9r9
?>
<?php echo Asset::css('style.css'); ?>
<?php echo Asset::js('common.js'); ?>
<title><?php if(isset($title)){ echo $title; }else{ echo ''; } ?></title>
</head>
<body>
<div <?php if(isset($content_cssid)){ echo "id='$content_cssid' "; }else{ echo "id='container' "; } ?>>
  <div id="contents">
  <?php if(isset($content)){ echo $content; }else{ echo ''; } ?>
  </div>
</div>
</body>
</html>
 

11) ビューファイル(このファイル) : modules/contact/views/srcwindow.php

<?php
/**
 * Contact Form Example (in Japanese)
 *
 * @package
 * @version		0.01
 * @author		mataga
 * @license		MIT License
 * @copyright	2011 mataga
 * @link		http://twitter.com/mataga
 */
?>
<!-- Header IMG -->
<p style="clear:both;" />
<h2>ソース全体像 : <?php echo Config::get('contact.cfe_version') ;?></h2>
<?php echo Html::anchor('/', '&gt;Homeに戻る' ,array('style'=>'color:#0000ff;','target'=>'_blank')); ?>
 
<p id="infoarea" class="green">ここではコンタクトフォーム機能に近い部分のソースのみを載っけています。<br>フレームワーク全体の設定ファイル等の細かいソースはダウンロードしてみてください。</p>
<a name="top"></a>
 
<?php
$nm_arr=array(
Html::anchor('#t1', 'コントローラー'),
Html::anchor('#t2', 'モデル'),
Html::anchor('#t3', '設定ファイル'),
Html::anchor('#t4', '言語ファイル'),
Html::anchor('#t5', 'STEP1のビュー'),
Html::anchor('#t6', 'STEP2のビュー'),
Html::anchor('#t7', 'STEP3のビュー'),
Html::anchor('#t8', '404ページのビュー'),
Html::anchor('#t9', 'NGページのビュー'),
Html::anchor('#t10', '外枠テンプレートビュー'),
Html::anchor('#t11', 'ソースコード展開画面(このファイル)のビュー'),
Html::anchor('#t12', 'debugクラス拡張'),
Html::anchor('#t13', 'formクラス拡張'),
Html::anchor('#t14', 'validationクラス拡張'),
Html::anchor('#t15', 'cssファイル'),
Html::anchor('#t16', 'dump.sql'),
Html::anchor('#t17', '(appの)bootstrap.php ,Autoloader::add_classes + 俺俺汎用function(暫定)を呼び出す改'),
Html::anchor('#t18', 'vendor/common/appcommon.php ,汎用ヘルパー的なファンクションのソース置き場に困ったので暫定的に設置'),
);
echo Html::ol($nm_arr);
?>
 
 
 
<a name="t1"></a>
<h3 class="dh3">1) コントローラー : modules/contact/classes/controller/contact.php</h3>
<div class='debugarea_l'>
<?php
//Debugクラスの拡張実験 GeSHi
echo Debug::vhighlight('modules/contact/classes/controller/contact.php','app');
?>
</div>
<div class="dbgtop"><?php echo Html::anchor('#top', '↑に戻る'); ?></div>
<a name="t2"></a>
<h3 class="dh3">2) モデル : modules/contact/classes/model/contact.php</h3>
<div class='debugarea_l'>
<?php echo Debug::vhighlight('modules/contact/classes/model/contact.php','app'); ?>
</div>
<div class="dbgtop"><?php echo Html::anchor('#top', '↑に戻る'); ?></div>
<a name="t3"></a>
<h3 class="dh3">3) このモジュール用設定ファイル : modules/contact/config/contact.php</h3>
<div class='debugarea_l'>
<?php echo Debug::vhighlight('modules/contact/config/contact.php','app'); ?>
</div>
<div class="dbgtop"><?php echo Html::anchor('#top', '↑に戻る'); ?></div>
<a name="t4"></a>
<h3 class="dh3">4) 言語ファイル : modules/contact/lang/ja/contact.php</h3>
<div class='debugarea_l'>
<?php echo Debug::vhighlight('modules/contact/lang/ja/contact.php','app'); ?>
</div>
<div class="dbgtop"><?php echo Html::anchor('#top', '↑に戻る'); ?></div>
<a name="t5"></a>
<h3 class="dh3">5) ビューファイル(step1) : modules/contact/views/step1.php</h3>
<div class='debugarea_l'>
<?php echo Debug::vhighlight('modules/contact/views/step1.php','app'); ?>
</div>
<div class="dbgtop"><?php echo Html::anchor('#top', '↑に戻る'); ?></div>
<a name="t6"></a>
<h3 class="dh3">6) ビューファイル(step2) : modules/contact/views/step2.php</h3>
<div class='debugarea_l'>
<?php echo Debug::vhighlight('modules/contact/views/step2.php','app'); ?>
</div>
<div class="dbgtop"><?php echo Html::anchor('#top', '↑に戻る'); ?></div>
<a name="t7"></a>
<h3 class="dh3">7) ビューファイル(step3) : modules/contact/views/step3.php</h3>
<div class='debugarea_l'>
<?php echo Debug::vhighlight('modules/contact/views/step3.php','app'); ?>
</div>
<div class="dbgtop"><?php echo Html::anchor('#top', '↑に戻る'); ?></div>
<a name="t8"></a>
<h3 class="dh3">8) ビューファイル(step404) : modules/contact/views/step404.php</h3>
<div class='debugarea_l'>
<?php echo Debug::vhighlight('modules/contact/views/step404.php','app'); ?>
</div>
<div class="dbgtop"><?php echo Html::anchor('#top', '↑に戻る'); ?></div>
<a name="t9"></a>
<h3 class="dh3">9) ビューファイル(stepng) : modules/contact/views/stepng.php</h3>
<div class='debugarea_l'>
<?php echo Debug::vhighlight('modules/contact/views/stepng.php','app'); ?>
</div>
<div class="dbgtop"><?php echo Html::anchor('#top', '↑に戻る'); ?></div>
<a name="t10"></a>
<h3 class="dh3">10) ビューファイル(外枠template) : views/template.php</h3>
<div class='debugarea_l'>
<?php echo Debug::vhighlight('views/template.php','app'); ?>
</div>
<div class="dbgtop"><?php echo Html::anchor('#top', '↑に戻る'); ?></div>
<a name="t11"></a>
<h3 class="dh3">11) ビューファイル(このファイル) : modules/contact/views/srcwindow.php</h3>
<div class='debugarea_l'>
<?php echo Debug::vhighlight('modules/contact/views/srcwindow.php','app'); ?>
</div>
<div class="dbgtop"><?php echo Html::anchor('#top', '↑に戻る'); ?></div>
<a name="t12"></a>
<h3 class="dh3">12) コアクラス俺俺拡張ファイル(debugクラス app以下に設置): classes/debug.php</h3>
<div class='debugarea_l'>
<?php echo Debug::vhighlight('classes/debug.php','app'); ?>
</div>
<div class="dbgtop"><?php echo Html::anchor('#top', '↑に戻る'); ?></div>
<a name="t13"></a>
<h3 class="dh3">13) コアクラス俺俺拡張ファイル(formクラス app以下に設置): classes/form.php</h3>
<div class='debugarea_l'>
<?php echo Debug::vhighlight('classes/form.php','app'); ?>
</div>
<a name="t14"></a>
<div class="dbgtop"><?php echo Html::anchor('#top', '↑に戻る'); ?></div>
<h3 class="dh3">14) コアクラス俺俺拡張ファイル(validationクラス app以下に設置): classes/validation.php</h3>
<div class='debugarea_l'>
<?php echo Debug::vhighlight('classes/validation.php','app'); ?>
</div>
<a name="t15"></a>
<div class="dbgtop"><?php echo Html::anchor('#top', '↑に戻る'); ?></div>
<h3 class="dh3">15) CSS:(DOCROOT/assets/css/style.css)</h3>
<div class='debugarea_l'>
<?php echo Debug::vhighlight('assets/css/style.css','docroot','css'); ?>
</div>
<div class="dbgtop"><?php echo Html::anchor('#top', '↑に戻る'); ?></div>
<a name="t16"></a>
<h3 class="dh3">16) dump.sql:</h3>
<div class='debugarea_l'>
<?php echo Debug::vhighlight('dump.sql','docroot','sql'); ?>
</div>
<div class="dbgtop"><?php echo Html::anchor('#top', '↑に戻る'); ?></div>
<a name="t17"></a>
<h3 class="dh3">17) (appの)bootstrap.php:</h3>
<div class='debugarea_l'>
<?php echo Debug::vhighlight('bootstrap.php','app'); ?>
</div>
<div class="dbgtop"><?php echo Html::anchor('#top', '↑に戻る'); ?></div>
<a name="t18"></a>
<h3 class="dh3">18) vendor/common/appcommon.php:</h3>
<div class='debugarea_l'>
<?php echo Debug::vhighlight('vendor/common/appcommon.php','app'); ?>
</div>
Page rendered in 0.009s using 0.653mb of memory.
 

12) コアクラス俺俺拡張ファイル(debugクラス app以下に設置): classes/debug.php

<?php
/**
 * Core Class Extends Example (debug.php)
 * @package
 * @version 0.01
 * @author mataga
 * @license MIT License
 * @copyright 2011 mataga
 * @link http://twitter.com/mataga
 */
 
class Debug extends Fuel\Core\Debug
{
 
	/**
	 * Debug::vdbg()
	 * dBug - PHP version of ColdFusion’s cfdump.
	 * http://dbug.ospinto.com/
	 * ColdFusionのcfdump風美麗なデバッグ、ソースは自分で取ってきて app/vendor/dBug/dBug.php に要設置
	 * @param   mixed
	 * @return  string
	 */
	public static function vdbg($data=null)
	{
		$output='';
		if(import_app('dBug/dBug', 'vendor')){
			ob_start();
			new dBug($data);
			$output = ob_get_contents();
			ob_end_clean();
		}
		return $output;
	}
	/**
	 * Debug::vhighlight()
	 * GeSHi - Generic Syntax Highlighter
	 * http://qbnz.com/highlighter/
	 * ソースのハイライト用。多機能なんで使ってみる。
	 * ソースは自分で取ってきて app/vendor/geshi/geshi.php,app/vendor/geshi/geshi/ ...etc に要設置
	 * @param   string soruce path
	 * @param   string 'app' or 'core' or 'docroot'
	 * @param   string highlit language
	 * @return  string
	 */
	public static function vhighlight($fname, $app_core=null, $language='php')
	{
		$base_path='';
		$sc_path = dirname(APPPATH);
		if(!is_null($app_core))
		{
			switch($app_core)
			{
				case 'app':
						$base_path = APPPATH;
						$sc_path = dirname(APPPATH);
					break;
				case 'core':
						$base_path = COREPATH;
						$sc_path = dirname(APPPATH);
					break;
				case 'docroot':
						$base_path = DOCROOT;
						$sc_path = dirname(DOCROOT);
					break;
				default:
					break;
			}
		}
		$file_real_path = realpath($base_path.$fname);
 
		if(preg_match( "#^{$sc_path}#iu", $file_real_path )&&is_file($file_real_path)&&$language)
		{
			if(import_app('geshi/geshi', 'vendor'))
			{
				$source = \File :: read($file_real_path,true);
				$geshi = new GeSHi($source,strtolower($language));
				$geshi->enable_classes();
				$ret = '<style type="text/css"><!--'."\n".$geshi->get_stylesheet()."\n".'--></style>';
				$ret .= $geshi->parse_code();
				return $ret;
			}
		}
		return '';
	}
	/**
	 * Debug::openheart()
	 * ASCII ART
	 * @param   string
	 * @return  string
	 */
	public static function openheart($str1='',$str2='')
	{
		$ret = <<<___END___
<pre>
  (  ) {$str1}
  (  )
  | |
 
 ヽ('A`)ノ {$str2}
  (  )
  ノω|
 
 __[警]
  (  ) ('A`)
  (  )Vノ )
   | |  | |
 
</pre>
___END___;
		return $ret;
	}
}//endofclass
 
/* End of file debug.php */
 

13) コアクラス俺俺拡張ファイル(formクラス app以下に設置): classes/form.php

<?php
/**
 * Core Class Extends Example (form.php)
 * @package
 * @version 0.01
 * @author mataga
 * @license MIT License
 * @copyright 2011 mataga
 * @link http://twitter.com/mataga
 */
class Form extends Fuel\Core\Form
{
	/**
	 * Prep Value
	 *
	 * Prepares the value for display in the form
	 *
	 * @param   string
	 * @return  string
	 */
	public static function prep_value($value)
	{
		//htmlspecialchars にENT_QUOTESとencodingを追加
		$value = htmlspecialchars($value,ENT_QUOTES,Config::get('encoding'));
		return $value;
	}
}//endofclass
 
 
/* End of file form.php */
 

14) コアクラス俺俺拡張ファイル(validationクラス app以下に設置): classes/validation.php

<?php
/**
 * Core Class Extends Example
 * @package
 * @version 0.01
 * @author mataga
 * @license MIT License
 * @copyright 2011 mataga
 * @link http://twitter.com/mataga
 */
 
class Validation extends Fuel\Core\Validation
{
 
	/**
	 * バリデーションOKの時とNGの時にCSSのクラス名を自動的に返す(CSSのクラス名は 'fldok' または 'flderr' config/validation.phpで設定可能)
	 * @param  string $key
	 * @return  string
	 */
	public function css($key = null)
	{
		if(is_string($key)&&$key)
		{
			\Config::load('validation', true);
			$ret = \Config::get('validation.css_name.ok', 'fldeok');
			if(parent::error($key))
			{
				$ret = \Config::get('validation.css_name.err', 'flderr');
			}
			return $ret;
		}else{
			return '';
		}
	}
	/**
	 * get_messageのラッパー INPUT領域の側にエラーを表示する用途を想定
	 *
	 * @param   string
	 * @return  string
	 */
	public function err($key)
	{
		$ret = '';
		if(is_string($key)&&$key)
		{
			if(parent::error($key))
			{
				\Config::load('validation', true);
				$s_head = \Config::get('validation.err_tag.head', "<p class='errtxt'>");
				$s_foot = \Config::get('validation.err_tag.foot', '</p>');
				$ret = $s_head.parent::error($key)->get_message().$s_foot ;
			}
		}
		return $ret;
	}
}
 
 

15) CSS:(DOCROOT/assets/css/style.css)

/* Contact Form Example */
@charset "utf-8";
body {
  font-size: 12px;
  line-height: 16px;
  font-weight: normal;
  color: #000000;
  background-color: #FFF;
  text-align: left;
  display: block;
  margin: 0px;
}
table {
  font-size: 12px;
  line-height: 16px;
}
a{
  color: #000000;
  text-decoration: underline;
}
a:visited{
  color: #333333;
  text-decoration: underline;
}
a:hover{
  color: #CC0000;
  text-decoration: underline;
}
a:active{
  color: #000000;
  text-decoration: underline;
}
#container {
  width: 610px;
  background-color: #FFFFFF;
  margin-right: auto;
  margin-left: auto;
  padding: 0px;
  margin-top: 10px;
  margin-left: 10px;
  margin-bottom: 10px;
}
#container_l {
  width: auto;
  background-color: #FFFFFF;
  margin-right: auto;
  margin-left: auto;
  padding: 0px;
  margin-top: 10px;
  margin-left: 10px;
  margin-bottom: 10px;
}
#contents {
  color: #000000;
  text-align: left;
  display: block;
  padding: 0px;
  height: auto;
  width: auto;
  margin-top: 0px;
  margin-right: 0px;
  margin-bottom: 0px;
  margin-left: 0px;
}
#formarea{
  padding: 5px 15px;
}
.sps{
  height:10px;
  margin-top:5px;
  margin-bottom:5px;
  clear:both;
}
.infotxt{
  padding:0px 12px 3px 12px;
}
.infoblock{
  padding:60px;
  font-size:1.4em;
  text-align:center;
}
#infoarea{
  clear:both;
  padding:7px 30px 3px 5px;
  width:94%;
}
#infoarea ul{
  line-height:20px;
}
.red {
  color: #CC0000;
}
.green {
  background: #bfdb58;
}
.c_tbl{
  /*border-collapse:collapse;*/
  background:#DDDDDD;
  width:580px;
}
.c_tdl{
  background:#FFFFCC;
  min-width:110px;
  padding:8px;
}
.c_tdr{
  background:#FFFEF0;
  width:400px;
  padding:8px;
}
.c_tdr input{
 max-width:280px;
}
.c_tdr textarea{
 max-width:400px;
}
.c_btn{
  width:140px;
  padding: 12px 20px;
  margin-right:15px;
  cursor: pointer;
  background:#f6f6f6;
  color: #36393d;
  -moz-border-radius: 5px;
  border: 1px solid #cfcfcf;
  border-top-color:#d2d2d2;
  border-left-color:#d2d2d2;
  border-right-color:#808080;
  border-bottom-color:#808080;
  font-weight:normal;
  font-size: 1.1em;
  vertical-align: middle;
 filter:progid:DXImageTransform.Microsoft.Gradient
 (GradientType=0,StartColorStr='#e9f0f0',EndColorStr='#fcfdfd');
}
.c_btn:hover{
  border: 1px solid #FDA965;
  background:#FFEDD1;
}
.c_send1{
  text-align:center;
  margin:10px 80px 10px 80px;
  padding:18px;
  background:#ffbbcc;
}
.c_send2{
  text-align:center;
  margin:3px 40px 10px 10px;
  padding:8px;
}
.c_send3{
  width:75%;
  background:#f8f8d3;
  margin-left:30px;
  margin-top:10px;
  padding:40px;
  font-size:1.3em;
}
.c_m1{
  color:#ff3333;
  font-size:1.2em;
  font-weight:bold;
}
.c_tdr{
  border-left:0;
  border-right:0;
  border-bottom:0;
}
.c_tdm{
  background:#fff;
}
#img_contact{
width:600px;
}
.flderr{
  background:#ffbbcc;
  border:1px solid #ff0000;
}
.fldok{
  background:#fff;
} 
.errtxt{
 color:#ff0000;
 padding:4px 0 0 2px;
 margin:0px;
}
.errmsg{
  background:#ffbbcc;
  border:1px solid #ff0000;
  paddnig:10px;
  margin-left:20px;
  margin-top:8px;
}
.debugarea{
  border:2px solid #ff6600;
  background:#f1f1f1;
  padding:5px;
  height:400px;
  overflow-x:scroll;
  overflow-y:scroll;
  font-size:12px;
}
.debugarea_l{
  border:2px solid #ccc;
  background:#f1f1f1;
  padding:5px;
  width:94%;
  max-height:500px;
  overflow-x:auto;
  overflow-y:auto;
  font-size:12px;
  margin-top:20px;
}
.dbgtop{
 margin-top:20px;
 margin-bottom:20px;
 float:right;
 padding-right:60px;
}
 
.dh3{
 font-size:16px;
 margin-top:30px;
  width:94%;
 border-bottom:dashed 1px #222 ;
}
 

16) dump.sql:

-- MySQL dump 10.13  Distrib 5.1.58, for debian-linux-gnu (x86_64)
--
-- Host: localhost    Database: fuel_dev
-- ------------------------------------------------------
-- Server version	5.1.58-1ubuntu1-log
 
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES binary */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
 
--
-- Table structure for table `contacts`
--
 
DROP TABLE IF EXISTS `contacts`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `contacts` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `title` VARCHAR(50) NOT NULL,
  `body` mediumtext NOT NULL,
  `created_at` INT(11) NOT NULL,
  `updated_at` INT(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
 
--
-- Dumping data for table `contacts`
--
 
LOCK TABLES `contacts` WRITE;
/*!40000 ALTER TABLE `contacts` DISABLE KEYS */;
/*!40000 ALTER TABLE `contacts` ENABLE KEYS */;
UNLOCK TABLES;
 
--
-- Table structure for table `migration`
--
 
DROP TABLE IF EXISTS `migration`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `migration` (
  `name` VARCHAR(50) NOT NULL,
  `type` VARCHAR(25) NOT NULL,
  `version` INT(11) NOT NULL DEFAULT '0'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
 
--
-- Dumping data for table `migration`
--
 
LOCK TABLES `migration` WRITE;
/*!40000 ALTER TABLE `migration` DISABLE KEYS */;
INSERT INTO `migration` VALUES ('default','app',1);
/*!40000 ALTER TABLE `migration` ENABLE KEYS */;
UNLOCK TABLES;
 
--
-- Table structure for table `sessions`
--
 
DROP TABLE IF EXISTS `sessions`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `sessions` (
  `session_id` VARCHAR(40) NOT NULL,
  `previous_id` VARCHAR(40) NOT NULL,
  `user_agent` text NOT NULL,
  `ip_hash` CHAR(32) NOT NULL DEFAULT '',
  `created` INT(10) UNSIGNED NOT NULL DEFAULT '0',
  `updated` INT(10) UNSIGNED NOT NULL DEFAULT '0',
  `payload` longtext NOT NULL,
  PRIMARY KEY (`session_id`),
  UNIQUE KEY `PREVIOUS` (`previous_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
 
--
-- Dumping data for table `sessions`
--
 
LOCK TABLES `sessions` WRITE;
/*!40000 ALTER TABLE `sessions` DISABLE KEYS */;
/*!40000 ALTER TABLE `sessions` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
 
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
 
-- Dump completed on 2011-12-07 20:08:11
 

17) (appの)bootstrap.php:

<?php
 
// Load in the Autoloader
require COREPATH.'classes'.DIRECTORY_SEPARATOR.'autoloader.php';
class_alias('Fuel\\Core\\Autoloader', 'Autoloader');
 
// Bootstrap the framework DO NOT edit this
require COREPATH.'bootstrap.php';
 
 
Autoloader::add_classes(array(
	// Add classes you want to override here
	// Example: 'View' => APPPATH.'classes/view.php',
	//デバッグ、フォーム、バリデーションのコアクラスをオーバーライドしながら拡張
	'Debug' => APPPATH.'classes/debug.php',
	'Form' => APPPATH.'classes/form.php',
	'Validation' => APPPATH.'classes/validation.php',
));
 
// Register the autoloader
Autoloader::register();
 
/**
 * Your environment.  Can be set to any of the following:
 *
 * Fuel::DEVELOPMENT
 * Fuel::TEST
 * Fuel::STAGE
 * Fuel::PRODUCTION
 */
Fuel::$env = (isset($_SERVER['FUEL_ENV']) ? $_SERVER['FUEL_ENV'] : Fuel::DEVELOPMENT);
 
// Initialize the framework with the config file.
Fuel::init('config.php');
 
//オレオレベタ書きfunction(オレオレヘルパー)の置き場所を追記
include APPPATH.'vendor/common/appcommon.php';
 
 

18) vendor/common/appcommon.php:

<?php
/**
 *  オレオレ共通ファンクション
 *  適当な書く場所が見つからないのでとりあえずここに入れたが本来の流儀だとどこなんだ?
 *
 */
 
/**
 *
 * xss_cleanの短縮形
 *
 * @param   string
 * @return  string
 */
if (! function_exists('xe'))
{
	function xe($string)
	{
		return Security::xss_clean($string);
	}
}
/**
 *
 * htmlspecialcharsの短縮形
 *
 * @param   string
 * @return  string
 */
if (! function_exists('h'))
{
	function h($str)
	{
		if (is_array($str))
		{
			return array_map('h', $str);
		}
		else
		{
			return htmlspecialchars($str, ENT_QUOTES, Config::get('encoding'));
		}
	}
}
 
/**
 * Loads in a core class and optionally an app class override if it exists.
 * (APPPATH優先版)
 *
 * @param   string  $path
 * @param   string  $folder
 * @return  void
 */
if ( ! function_exists('import_app'))
{
	function import_app($path, $folder = 'classes')
	{
		$path = str_replace('/', DIRECTORY_SEPARATOR, $path);
		if (is_file(APPPATH.$folder.DIRECTORY_SEPARATOR.$path.'.php'))
		{
			require_once APPPATH.$folder.DIRECTORY_SEPARATOR.$path.'.php';
			return true;
		}
		else
		{
			if (is_file(COREPATH.$folder.DIRECTORY_SEPARATOR.$path.'.php'))
			{
				require_once COREPATH.$folder.DIRECTORY_SEPARATOR.$path.'.php';
				return true;
			}
		}
		return false;
	}
}
 
Page rendered in 0.009s using 0.653mb of memory.