2012/05/24

HTTPレスポンス ヘッダー Content-type


CIは デフォルトだと、Content-typeのcharsetが設定されていない
LiveHTTPHeaders で確認↓
HTTP/1.1 200 OK
Date: Thu, 05 May 2011 07:19:18 GMT
Server: Apache
X-Powered-By: PHP/5.3.5
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 977
Content-Type: text/html
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
これは セキュリティ上よろしくないので設定する
方法的には hookのpost_controllerでフックとかあるけど、
取り敢えず今回は コントローラの頭でやりゃーいいんじゃねーかと思ったので
コントローラー拡張クラス(いわゆるMY_Controller)のコンストラクタに↓下記をぺろっと追加
$this->output->set_header('Content-Type: text/html; charset=UTF-8');
で、確認↓
HTTP/1.1 200 OK
Date: Thu, 05 May 2011 07:28:49 GMT
Server: Apache
X-Powered-By: PHP/5.3.5
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 977
Content-Type: text/html; charset=UTF-8
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
今後、なにやら細かい設定がしたくなったら 設定は別クラス作って フックでもいいかと思う
参考)




MySQL 数値型 最大値とか最小値とか


型 バイト 最小値 最大値
TINYINT 1 -128 127
SMALLINT 2 -32768 32767
MEDIUMINT 3 -8388608 8388607
INT 4 -2147483648 2147483647
BIGINT 8 -9223372036854775808 9223372036854775807
参考)




URLヘルパ


app/config/autoload.php
Auto-load Helperに設定
$autoload['helper'] = array('url');
※各コントローラで指定するなら、
$this->load->helper('url');
css絶対パスで指定(view内)
<link rel="stylesheet" href="<?=base_url()?>css/init.css" type="text/css" />

参考)
URL ヘルパ : CodeIgniter ユーザガイド 日本語版http://codeigniter.jp/user_guide_ja/helpers/url_helper.html
ヘルパ関数 : CodeIgniter ユーザガイド 日本語版http://codeigniter.jp/user_guide_ja/general/helpers.html




共通ヘッダー フッター(HTML) →その後


結局 hookは諦めて、Controllerを拡張して、loadクラスの なんちゃってview()みたいなのを作って落ち着いた。
動的に、headerのtitleを変えるにはこれしかなかったにょん(´・ω・`)ガッカリ…
app/core/MY_Controller.php
<?php if ( ! defined('BASEPATH')) exit('No direct script accessallowed');
class MY_Controller extends CI_Controller {
  private $vars = array();

  /**
   * Constructor
   */
  public function __construct()
  {
    parent::__construct();
  }

  /**
   * set vars
   * @access public
   * @param  $key  string
   * @param  $val  string
   * @return 
   */
  public function setVars($key, $val)
  {
    $this->vars[$key] = $val;
  }

  /**
   * set views
   * @access public
   * @param  $view  mixed
   * @param  $return bool
   * @return void
   */
  public function setView($view, $return = FALSE)
  {
    // common header
    $this->load->view('parts/header', $this->vars);
    if (is_array($view))
    {
      foreach ($view as $k) $this->load->view($k, $this->vars);
    }
    else
    {
      $this->load->view($view, $this->vars);
    }
    // common footer
    $this->load->view('parts/footer', $this->vars);
  }
}
app/views/parts/header.php
…略
<title>My Site Title - <?=$title?></title>
…略
・呼び出しコントローラ
app/controllers/hoge.php
<?php if ( ! defined('BASEPATH')) exit('No direct script accessallowed');
class Hoge extends MY_Controller {

  /**
   * list
   */
  public function list()
  {
    $this->setVars('title', 'HOGE LIST');
    $this->setView('hoge/list');
  }

  /**
   * edit
   */
  public function edit()
  {
    $this->setVars('title', 'HOGE EDIT');
    $this->setView('hoge/edit');
  }
}




共通ヘッダー フッター(HTML)


要するに、CakePHPで言う、layoutみたいなことがやりたいわけだ
サイトのページで共通する ヘッダー部分とか フッター部分は どこか1箇所に書きたい
本家のやり方は、結局Controllerに毎回 header footerを書かなきゃならないから、だめじゃん?
ビュー : CodeIgniter ユーザガイド 日本語版http://codeigniter.jp/user_guide_ja/general/views.html
→複数のビューの読み込み
・hookを使ってみる
CIにはviewクラス的なものがないから、cakeコントローラのCallbackメソッド(beforeFilterとかafterFilterとか)的なものを探したら、hookがそれにあたる(?)ぽいので、やってみる
※app/は 自前アプリケーションフォルダ index.phpで指定する$application_folder
・共通ヘッダー&フッターを作成(View)
app/views/parts_hook
      ┠ header.php
      ┗ footer.php
※それぞれ HTMLのヘッダー部分とフッター部分
・自前hookクラスを用意
app/hooks/ControllerCallback.php
/**
* ControllerCallback Class
*/
class ControllerCallback {
  /**
   * beforeFilter - post_controller_constructor
   */
  public function beforeFilter()
  {
    // 共通ヘッダー
    $ci =& get_instance();
    $ci->load->view('parts_hook/header');
  }
  /**
   * afterFilter - post_controller
   */
  public function afterFilter()
  {
    // 共通フッター
    $ci =& get_instance();
    $ci->load->view('parts_hook/footer');
  }
}
・hook設定
app/config/hooks.php
/*
| --------------------------------------
| Hooks
| --------------------------------------
| This file lets you define "hooks" …略
$hook['post_controller_constructor'] = array(
                'class'  => 'ControllerCallback',
                'function' => 'beforeFilter',
                'filename' => 'ControllerCallback.php',
                'filepath' => 'hooks'
                );

$hook['post_controller'] = array(
                'class'  => 'ControllerCallback',
                'function' => 'afterFilter',
                'filename' => 'ControllerCallback.php',
                'filepath' => 'hooks'
                );
※最初、beforeFilter()をpre_controllerで呼んだら、コントローラインスタンス化される前だから駄目だった(汗
※'params'は使ってない
参考)
フック : CodeIgniter ユーザガイド 日本語版http://codeigniter.jp/user_guide_ja/general/hooks.html

これで、共通ヘッダーとフッターは表示された
うーんでも、これだと、ヘッダーの中の<title>とかを動的に設定したい(各コントローラーで指定したい)ときに、だめだなあ…
ということで、続く





divを ページ(100%)に隙間なく 合わせる


html, body { height:100%; }
#wrap {
  background: #ffc;
  width: 100%;
  height: 100%;
}
#contents {
  background: #ddd; レイアウト確認の時は背景色付けるといいです
  margin: 0 30px;
}
<body>
<div id="wrap">
<div id="contents">
</div><!--/contents-->
</div><!--/wrap-->
逆に、divを決められたサイズで固定したい場合は↓こちら
参考) min-width、min-height、max-width、max-heightをIE6でも実装する方法 | CSS Lecture




コアクラスの拡張 ~Logクラス


・本体からコピって自分とこのappに置く(拡張prefix付ける MY_とか)
  system/libraries/Log.php → application/core/MY_Log.php
・なんでLogクラスってコアのくせにlibrariesにあるわけ?
  →とか思いながら、リファレンス通りにapplication/core/配下においても動かねーし。
  →やっぱり、
  system/core/→application/core/
  system/libraries/→application/libraries/
  で、いいらしい。
・ログファイル名もconfig/config.phpで設定できるようにしたい
  →config/config.phpに $config['log_file_name'] = 'app.example.log';追加
  →MY_Log::__construct()処理追加
public function __construct()
{
  parent::__construct();
  $this->_log_file_name = date('Y-m-d').EXT;←CIデフォルト
  $config =& get_config();
  if ($config['log_file_name'] != '')
  {
    $this->_log_file_name = $config['log_file_name'];
  }
}
・ログのレコードフォーマットが気にくわないから変える
  →MY_Log::write_log()編集
public function write_log($level = 'error', $msg, $php_error = FALSE)
{
  if ($this->_enabled === FALSE)
  {
    return FALSE;
  }
  $level = strtoupper($level);
  if ( ! isset($this->_levels[$level]) OR ($this->_levels[$level] > $this->_threshold))
  {
    return FALSE;
  }
  $filepath = $this->_log_path.$this->_log_file_name;
  $message = '';
  if ( ! $fp = @fopen($filepath, FOPEN_WRITE_CREATE))
  {
    return FALSE;
  }
  $message .= date($this->_date_fmt).' ('.$level.') '.$msg."\n";
  flock($fp, LOCK_EX);
  fwrite($fp, $message);
  flock($fp, LOCK_UN);
  fclose($fp);
  @chmod($filepath, FILE_WRITE_MODE);
  return TRUE;
}
参考)
コアシステムクラスの作成 : CodeIgniter ユーザガイド 日本語版
ヌル日記




CodeIgniter ~まずすることめも


application/
・名前をapp/(そのままでもいいし)に変えて、web_rootとは別のとこに置く(system/とも別のとこ)
index.php
・web_rootに置く
・$system_path $application_folderのパス設定
app/config/config.php
・$config['base_url'](設定しなくてもいいらしいが?)
・$config['index_page'] = '';
  →mod_rewriteを使って「index.php」を URIから抹殺する時は、ここは空('')のままで。
・$config['url_suffix'] = '.html';
  →.htmlをつけてアクセスできる 見せかける
・$config['charset'] = 'UTF-8';
・$config['enable_hooks'] = FALSE; ←フック使わなきゃFALSE
・$config['subclass_prefix'] = 'MY_';
  →今は未設定 そのうち使うかも
・$config['log_threshold']=0
  →ログを出すときは下記の設定から選ぶ
  →0だとログでない
| 0 = Disables logging, Error logging TURNED OFF
| 1 = Error Messages (including PHP errors)
| 2 = Debug Messages
| 3 = Informational Messages
| 4 = All Messages
・$config['log_path'] →ログ出す場所 フルパス
  →ログファイル名まで書くのかと勘違いしてた...orz
  →ログディレクトリパスを書く ex)$config['log_path'] = 'C:/webapp/logs/';
  →win環境で、¥使うとエラーになるから/スラッシュで。
  →指定しなければ、デフォルトのAPPPATH.'logs/'が指定される
・$config['encryption_key'] セッション使うなら
・Session Variables →セッションの詳細設定
Cookie Related Variables →cookie詳細設定
・Cross Site Request Forgery →このへんも必要かも(未設定)
app/config/autoload.php
DBをapp全体で使うなら
$autoload['libraries'] = array('database');
  →使いたいところで接続する手動設定とか、DSN設定とかも使えるし
app/config/database.php
DB設定
$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'username';
$db['default']['password'] = 'password';
$db['default']['database'] = 'test';
とか
$db['default']['dbcollat'] = 'utf8_general_ci';
とかね
app/config/routes.php
・$route['default_controller'] →デフォルトコントローラ
デフォルトのCodeIgniterのURI
example.com/index.php/class/function/ID
 →デフォルトコントローラは、index.phpなくてもいいくせに…(# ゚Д゚)
↑このindex.phpを 消すためにRewrite設定
・web_root配下に .htaccess設置(もしくはhttpd.confでもいいけど)
・↓設定
RewriteEngine on
RewriteCond $1 !^(index\.php|robots\.txt|.+\.css$|.+\.js$|.+\.png$|.+\.gif$)
RewriteRule ^(.*)$ index.php/$1 [L]
※この設定では「index.php」「robots.txt」で始まるリクエスト、もしくは「.css、.js、.png、.gif」で終わるリクエスト以外
データベースへの接続 : CodeIgniter ユーザガイド 日本語版