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>とかを動的に設定したい(各コントローラーで指定したい)ときに、だめだなあ…
ということで、続く