2011年7月25日

Codeigniterを使ってショッピングカートをゼロから作ってみよう。 # 2

さてインストールが終わったので目的に合わせて色々と変更していきます。
#1 インストールはこちらからどうぞ。



■ テンプレート化
デザインを拡張したり、変更したりできる機能は人に使ってもらうことを考えると外せないですよね。
もちろん、簡単に拡張できれば使ってくれる人も多くなるでしょうし。


そこで初期設定では application/views に設定されているview用のディレクトリを templates ディレクトリに移します。HTML/CSSなどのデザイン部分は1つにまとめられて楽になるんじゃないかな。(ダメそうなら後で変更しますw)



後で変更できるようにindex.phpTEMPATHを追加。

define('TEMPATH', ROOT.'templates/');


■ Layoutライブラリ
当然templatesディレクトリに移しただけでは使えないので、ライブラリを1つ追加します。

extension/core/Layout.php
<?php
class Layout 
{
    var $layout;
    
    function __construct()
    {
        $this->layout = config_item('layout_default_file');
        log_message('debug', 'Layout Class Initialized');
    }
    
    function set($layout) { $this->layout = $layout; }
    
    function view($view = '' , $data = array(), $template = 'default', $return = FALSE)
    {
        $load =& load_class('Loader','core');
        // set template path as view path if not admin
        if($template !== 'admin') $load->set_view_path(TEMPATH.$template.'/');
        // load contetns in side of the layout
        $view_data['contents'] = $load->view($view, $data, TRUE);
        // load layout directory config
        $this->layout = config_item('layout_directory').$this->layout;

        // then finaly load layout
        return $load->view($this->layout, $view_data, $return);
    }
}


ライブラリ内で使われている設定をconfig/config.phpに2つ追加。
$config['layout_default_file']  = 'main';
$config['layout_directory']     = '_layouts/';
1つ目はLayoutライブラリがロードされた時にレイアウトファイルが指定されなかった場合に自動的に読み込まれるファイル名を指定します。
2つ目はディレクトリを分けたい際に指定できます。空欄も可。


■ Loaderクラス拡張
ビューファイルのパスを指定するのにLoaderクラスを拡張します。

extension/core/MY_Loader.php
<?php
class MY_Loader extends Loader
{
    /**
     * set view file path
     *
     * This function sets the location of view file.
     *
     * @access    public
     */
    public function set_view_path($path, $absolute=FALSE)
    {
        $this->_ci_view_path = ($absolute) ? ROOT.$path : $path;
    }
}
これで_ci_view_pathはtemplatesディレクトリに向きます。


■ Layoutライブラリ読み込み
最後にライブラリを読み込みます。
普通にconfig/autoload.phpに追加でもいいんですが、Layoutライブラリは常に使うことになるし、1行だけなのでsystem/core/Controller.phpに書き込んじゃいました。

$this->layout =& load_class('Layout', 'core');

Codeigniterのアップデートの時に面倒とか、わからない人はconfig/autoload.phpに追加してくださいね。

$autoload['libraries'] = array('Layout');



■ てすと

コントローラ:application/controllers/home.php
<?php
class Home extends Controller
{
    function __construct()
    {
        parent::__construct();
    }
    
    function index()
    {
        $this->layout->view('home/index');
    }
}

ビュー:templates/default/home/index.php
<?php echo __FILE__; ?>


結果:


大丈夫そうです(^_^v
これでテンプレート化の下地ができまた。

0 件のコメント:

コメントを投稿